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