定義云深度學習平臺什么是云深度學習?隨著機器學習的發展,單機運行的機器學習任務存在缺少資源隔離、無法動態伸縮等問題,因此要用到基于云計算的基礎架構服務。云機器學習平臺并不是一個全新的概念,Google、微軟、亞馬遜等都有相應的服務,這里列舉幾個比較典型的例子。
第一個是Google Cloud Machine Learning Engine,它底層托管在Google Cloud上,上層封裝了Training、Prediction、Model Service等機器學習應用的抽象,再上層支持了Google官方的TensorFlow開源框架。
亞馬遜也推出了Amzon machine learning平臺,它基于AWS的Iaas架構,在Iaas上提供兩種不同的服務,分別是可以運行MXNet等框架的EC2虛擬機服務,以及各種圖象、語音、自然語言處理的SaaS API。
此外,微軟提供了Azure Machine Learning Studio服務,底層也是基于自己可伸縮、可拓展的Microsoft Azure Cloud服務,上層提供了拖拽式的更易用的Studio工具,再上面支持微軟官方的CNTK等框架,除此之外微軟還有各種感知服務、圖象處理等SaaS API,這些服務都是跑在Scalable的云基礎平臺上面。
相關廠商內容
基于卷積神經網絡在手機端實現文檔檢測 阿里巴巴集團千億級別店鋪系統架構平臺化技術實踐 攜程第四代架構之軟負載 SLB 實踐之路 解讀百度PB級數據倉庫Palo開源架構 相關贊助商
與100+國內外技術專家探索2017前瞻熱點技術
以上這些都是業界比較成熟的云深度學習平臺,而在真實的企業環境中,我們為什么還需要實現Cloud Machine Learning服務呢?
首先國外的基礎設施并不一定是國內企業可以直接使用的,而如果只是本地安裝了TensorFlow,那也只能在裸機上進行訓練,本地默認沒有資源隔離,如果同時跑兩個訓練任務就需要自己去解決資源沖突的問題。因為沒有資源隔離,所以也做不了資源共享,即使你有多節點的計算集群資源,也需要人工的約定才能保證任務不會沖突,無法充分利用資源共享帶來的便利。此外,開源的機器學習框架沒有集群級別的編排功能,例如你想用分布式TensorFlow時,需要手動在多臺服務器上啟動進程,沒有自動的Failover和Scaling。因此,很多企業已經有機器學習的業務,但因為缺少Cloud Machine Learning平臺,仍會有部署、管理、集群調度等問題。
那么如何實現Cloud Machine Learning平臺呢?
我們對云深度學習服務做了一個分層,第一層是平臺層,類似于Google cloud、Azure、AWS這樣的IaaS層,企業內部也可以使用一些開源的方案,如容器編排工具Kubernetes或者虛擬機管理工具OpenStack。有了這層之后,我們還需要支持機器學習相關的功能,例如Training、Prediction、模型上線、模型迭代更新等,我們在Machine Learning Layer層對這些功能進行抽象,實現了對應的API接口。最上面是模型應用層,就可以基于一些開源的機器學習類庫,如TensorFlow、MXNet等。
整個Cloud Machine learning運行在可伸縮的云服務上,包行了模型開發、模型訓練,以及模型服務等功能,形成一個完整的機器學習工作流。但這并不是一個閉環,我們在實踐中發現,線上的機器學習模型是有時效性的,例如新聞推薦模型就需要及時更新熱點新聞的樣本特征,這時就需要把閉環打通,把線上的預測結果加入到線下的訓練任務里,然后通過在線學習或者模型升級,實現完整的機器學習閉環,這些都是單機版的機器學習平臺所不能實現的。
打造云深度學習平臺主要包含以下幾個組件:首先是客戶端訪問的API Service,作為服務提供方,我們需要提供標準的RESTful API服務,后端可以對接一個Kubernetes集群、OpenStack集群、甚至是自研的資源管理系統??蛻舳苏埱蟮紸PI服務后,平臺需要解析機器學習任務的參數,通過Kubernetes或者OpenStack來創建任務,調度到后端真正執行運算的集群資源中。如果是訓練任務,可以通過起一個訓練任務的Container,里面預裝了TensorFlow或MXNet運行環境,通過這幾層抽象就可以將單機版的TensorFlow訓練任務提交到由Kubernetes管理的計算集群中運行。在模型訓練結束后,系統可以導出模型對應的文件,通過請求云深度學習平臺的API服務,最終翻譯成Kubernetes可以理解的資源配置請求,在集群中啟動TensorFlow Serving等服務。除此之外,在Google Cloud-ML最新的API里多了一個Prediction功能,預測時既可以啟動在線Service,也可以啟動離線的Prediction的任務,平臺只需要創建對應的Prediction的容器來做Inference和保存預測結果即可 。通過這種簡單的封裝,就可以實現類似Google Cloud-ML的基礎架構了。
架構上進行了分層抽象,實現上也只需要三步。
第一步是創建一個Docker鏡像,下面的Dockerfile例子是從TensorFlow項目中截取出來的,官方已經提供了一個可以運行的Docker鏡像,通過加入定制的啟動腳本就可以實現開發環境、模型訓練以及模型服務等功能。
第二步是實現一個標準的API服務,下面是一個Python實現的實例,用戶發送一個啟動訓練任務的請求,服務端可以解析請求的參數和內容,并將任務提交到Kubernetes等后端集群中。
第三步是生成Kubernetes所需的文件格式,下面的JSON文件大家也可以在GitHub中找到,實現了將分布式TensorFlow任務提交到Kubernetes集群中運行。
我們通過簡單的三個配置就可以完成機器學習任務從本地到云端的遷移過程,也就是實現了Cloud Machine Learning服務。前面提到云深度學習平臺需要支持資源隔離和資源共享,這是如何實現的呢,其實Kubernetes本身就有這個抽象,用戶可以在請求時申明需要的CPU、內存、甚至是GPU資源,通過cgroups、namespace等容器技術來實現資源隔離,而kube-scheduler實現了資源調度和資源共享等功能。實現自研或者公有云的Cloud Machine Learning平臺,開發者可以很容易提交訓練任務、創建模型服務等,但在一個真實的機器學習場景中,只解決計算資源的隔離和調度是遠遠不夠的,我們還需要重新思考如何集成數據處理、特征工程等問題。
重新定義云深度學習平臺TensorFlow是一個可用于深度學習的數值計算庫,基于TensorFlow可以實現MLP、CNN、RNN等機器學習模型,但有了它是不是就不需要Spark呢?他們的關系是什么?
在生產環境中,我們發現TensorFlow并沒有完全取代已有的大數據處理工具,我們需要用Spark做數據分析和特征工程,還需要數據倉庫等服務去存儲和查詢結構化數據。TensorFlow是一個非常優秀的深度學習框架,但在真實場景中用戶還需要一些PowerGraph處理的圖關系特征作為輸入,這都是單獨一個框架無法解決的。對于用戶的建模流程如何組織、如何做數據清洗、如何做特征抽取、如何上線訓練好的模型、如何預估模型效果,這些可以使用Azure ML Studio工具去完成,而且是TensorFlow所缺乏的。
前面我們介紹了Cloud Machine Learning,可以實現一個類似Google的分布式、高可用、帶集群編排的計算平臺,但這遠遠不夠,因為我們還需要使用大數據處理的框架,包括MapReduce、流式處理、圖計算等框架。TensorFlow只是整個機器學習流程里面做模型訓練其中一部分,我們可能還需要Kubernetes做CPU、GPU的管理和調度。如果我們要完成一個機器學習的業務,就需要同時掌握TensorFlow、Spark、Hadoop、Hive、Kubernetes等框架的原理和應用,而不只是提供一個Google Cloud-ML或者AWS服務就夠了,這也是我們要重新定義Cloud Machine Learning的原因。
前面在客觀上我們需要這么多知識,但主觀上我們希望有什么呢?我們更希望有一個從數據處理到模型訓練再到模型上線的一個全閉環服務,而不僅僅是機器學習框架或者通用計算平臺,我們希望不寫代碼就可以做特征抽取的工作,我們希望機器學習的工作流是很容易描述的,而不需要通過編寫代碼的方式來實現,我們需要一個很靈活的基礎架構可以支持各種異構的計算資源,我們希望平臺是可拓展的可以實現自動Failover和Scaling。 除了前面提到的Google、微軟、亞馬遜做的云機器學習平臺,我們還需要從IaaS、PaaS、SaaS多維度上提供使用接口,滿足不同層次用戶的使用需求,另一方面這應該是低門檻的產品服務,讓任意的領域專家都可以輕易使用。
后面我們會介紹在真實場景下如何改造Cloud Machine Learning平臺,并且介紹第四范式對外提供的低門檻、分布式、高可用的先知機器學習平臺。
第四范式的云深度學習實踐經驗第四范式先知平臺是一個基于Cloud的全流程機器學習產品,用戶通過Web登陸到先知平臺就可以使用模型調研、預估服務的功能,并且可以通過拖拽的方式來描述機器學習的工作流 。
它的使用步驟如下,第一步是數據預處理,用戶不需要寫Spark代碼而只需要拖拽出一個圖標,我們稱之為一個算子,然后就可以提交數據清洗等數據預處理任務了。通過拖拽數據拆分算子,可以將數據集拆分為訓練集和測試集兩部分,其中一部分留在左邊用于特征抽取。一般來說,用Spark、Mapreduce等開源工具也可以做特征抽取,但對編程技能和工程能力有一定的要求,我們通過定義特征抽取的配置或者腳本,讓用戶可以不寫代碼也可以實現對原始數據集的特征工程。然后,連接我們自主研發的高維邏輯回歸、高維GBDT等模型訓練算子,也可以連接基于開源的TensorFlow或者MXNet等框架實現的算法。最后,經過模型訓練得到模型文件后,用剛剛拆分出來的測試集進行模型預測,還可以使用通用的模型評估算子進行AUC、ROC、Logloss等指標的可視化展示。
在先知平臺上,用戶只需要通過構建流程圖的方式,就可以實現數據處理、模型訓練等功能,真正解決真實場景下機器學習業務的問題。在先知平臺的最新版本中,提供了以極高的效率生成特征工程配置腳本,獲取自主研發的LR、GBDT算法的最佳參數等AutoML特性。這些特性能夠大幅降低在獲取一個有效建模方案過程中的重復性勞動,也可以有效輔助數據科學家獲得對數據的初步理解。在一些場景下,能夠獲得媲美甚至超越專家建模的效果。
目前先知平臺主要解決以下幾個目標場景:
1. 簡化數據引入,平臺不要求數據必須使用分布式存儲,也可以直接從RDBMS這類的SQL數據庫中導入訓練樣本數據。
2. 簡化數據拆分,用戶不需要寫Spark代碼,只需要提供數據拆分后的存儲路徑,并且支持按比例拆分或者按規則拆分兩種模式。
3. 簡化特征抽取,平臺支持連續特征、離散特征的抽取和組合,對于連續特征支持自動化的多分桶算法,我們也會歸納常用的特征抽取方法并且封裝成腳本或者配置,用戶只需了解對應的配置而不需要自己編碼實現具體的邏輯。平臺還可以根據已有的特征配置自動進行特征組合拓展,提升模型效果。
4. 簡化模型訓練,平臺可以支持開源的機器學習算法實現和第四范式自主研發的超高維度LR算法,這個LR算法實現了Parameter server可以解決幾十億、上百億特征維度的高速分布式訓練問題。對于學習率、正則化參數等可以做到自動調優。另外,平臺還提供了線性分形分類器等擴展算法,可以無須人為干預的更加有效利用數值類特征。
5. 簡化模型評估,得到模型預估結果后,我們可以計算模型的ROC、Logloss、K-S等指標,不同模型計算指標的方式是類似的,用戶就不需要重復編寫實現代碼,直接通過拖拽算子調用即可,以上都是先知平臺所解決的問題。
6. 簡化模型上線,對于常見的高維LR/GBDT模型,可以一鍵發布為線上服務實例,不僅簡化了模型的部署和運維,而且上線實例還包括大部分的特征工程邏輯,無須手動再次開發特征處理邏輯的線上版本。
目前,先知平臺已經成功應用于銀行、金融和互聯網等各行各業,基于“先知平臺”的反欺詐模型能夠幫助銀行在毫秒級識別可疑交易,同時在新聞、視頻、音頻等內容推薦場景下,“先知平臺”也成功大幅度提升關鍵業務指標。此外,在賦能企業利用機器學習升級運營效率的同時,更有意義的是,“先知平臺”也極大地降低了機器學習的使用門檻。
作為一個針對全流程機器學習業務的人工智能平臺,先知封裝了從數據處理、模型訓練到模型上線和反饋更新的系統閉環,用戶不再需要很強的編程技術和工程能力,領域專家和業務人員都可以通過推拽方式進行建模和上線,幫助企業快速實現從數據收集到業務價值提升的終極目標。
隨著專利算法的不斷更新,更加實時高效的極致工程優化,未來先知平臺將進一步降低人工智能工業應用的門檻,幫助越來越多的企業享受人工智能服務。
作者介紹陳迪豪,第四范式先知平臺架構師,曾在小米科技和UnitedStack擔任基礎架構研發工程師?;钴S于OpenStack、Kubernetes、TensorFlow等開源社區,實現了Cloud Machine Learning云深度學習平臺,Github賬號https://github.com/tobegit3hub。