前言
中午的時(shí)候看到了Spark團(tuán)隊(duì)新作MLFlow,因?yàn)槲冶旧硪苍谧鲱?lèi)似的解決方案MLSQL,自然要看看Meitai是怎么做的。所以第一時(shí)間把MLFlow相關(guān)文檔 瀏覽了一遍,并且將MLFlow源碼 clone下來(lái)大致也看了一遍。
看完之后,發(fā)現(xiàn)工程項(xiàng)目和文檔非常干凈利落,體現(xiàn)了Spark團(tuán)隊(duì)一如既往的工程能力以及對(duì)事物分析高超的抽象能力。 這里先說(shuō)說(shuō)我看完后的一個(gè)總結(jié):
MLFlow至少現(xiàn)階段還是一款Python ML pipeline的輔助工具
MLFlow要解決的問(wèn)題以及相應(yīng)的方案
MLFlow解決了如下幾個(gè)問(wèn)題:
- 算法訓(xùn)練實(shí)驗(yàn)難于追蹤,所以我們需要有一個(gè)實(shí)驗(yàn)管理工具Tracking。這個(gè)工具能夠記錄算法,算法參數(shù),模型結(jié)果,效果等數(shù)據(jù)。
- 算法腳本難于重復(fù)運(yùn)行,原因很多,比如代碼版本,以來(lái)的參數(shù),還有運(yùn)行環(huán)境。解決辦法就是所有的算法項(xiàng)目應(yīng)該都有一套標(biāo)準(zhǔn)的Projects概念,記錄下來(lái)這些東西。并且這個(gè)Projects是可以擬合所有算法框架的。
- 部署模型是一個(gè)艱難的過(guò)程,在ML界,目前還沒(méi)有一個(gè)標(biāo)準(zhǔn)的打包和部署模型的機(jī)制。解決的辦法是Models概念,Models提供了工具和標(biāo)準(zhǔn)幫助你部署各種算法框架的模型
我想這幾個(gè)問(wèn)題帶來(lái)的痛楚也是做ML的感同身受的。其實(shí)這三個(gè)點(diǎn),每個(gè)點(diǎn)都有很多軟件和工具在解決,核心問(wèn)題在于,他們都沒(méi)有成為事實(shí)的標(biāo)準(zhǔn)。
如何和親兒子Spark做集成
在現(xiàn)階段版本里,MLFlow 做算法訓(xùn)練是基于單機(jī)運(yùn)行的,不過(guò)利用Pyspark可以很方便的實(shí)現(xiàn)多機(jī)同時(shí)運(yùn)行。從而可以給定不同的參數(shù),然后讓Pyspark進(jìn)行調(diào)度,最后把所有實(shí)驗(yàn)結(jié)果匯報(bào)給Tracking Server.
在預(yù)測(cè)方面,對(duì)于一些標(biāo)準(zhǔn)的庫(kù)比如SKLearn,因?yàn)橐话愣远加衟redict方法,所以無(wú)需開(kāi)發(fā)即可通過(guò)MLFlow進(jìn)行部署,如果是自定義的一些算法,則需要提供一個(gè)模塊,實(shí)現(xiàn)里面定義方法簽名(比如predict),然后可以動(dòng)態(tài)import到API Server里或者轉(zhuǎn)化一個(gè)Spark UDF函數(shù)部署到PySpark里。
和MLSQL對(duì)比
相比較而言,MLFLow更像一個(gè)輔助工具和標(biāo)準(zhǔn),你只要按這個(gè)標(biāo)準(zhǔn)寫(xiě)ML程序(選用你喜歡的算法框架),就能實(shí)現(xiàn)實(shí)驗(yàn)記錄的追蹤,多環(huán)境的部署(比如可以很容易從我的筆記本移植到你的筆記本上跑),以及通過(guò)寫(xiě)一個(gè)規(guī)范的預(yù)測(cè)腳本,就能把模型部署成API服務(wù),或者Spark里。
但其實(shí)MLFlow還有幾個(gè)問(wèn)題沒(méi)有解決:
- 數(shù)據(jù)預(yù)處理在兩個(gè)環(huán)節(jié)存在,一個(gè)訓(xùn)練,一個(gè)是預(yù)測(cè),并且很多場(chǎng)景預(yù)測(cè)的時(shí)候的數(shù)據(jù)預(yù)處理是需要依賴(lài)訓(xùn)練時(shí)數(shù)據(jù)預(yù)處理產(chǎn)生的元信息的。 而且按MLFlow的架構(gòu),整個(gè)流程都是算法工程師來(lái)完成的,這樣就無(wú)法保證數(shù)據(jù)預(yù)處理的性能(算法可以用任何庫(kù)來(lái)完成數(shù)據(jù)的處理),研發(fā)只會(huì)負(fù)責(zé)后面模型的部署或者嵌入到spark中(而且必須用pyspark了)。
- 完全基于python完成數(shù)據(jù)處理和訓(xùn)練,顯然會(huì)有性能上的損耗。最好的方式還是把數(shù)據(jù)預(yù)處理和訓(xùn)練剝離開(kāi)了。
- 沒(méi)有解決Spark和MLFlow的數(shù)據(jù)銜接問(wèn)題,也就是說(shuō),MLFlow單個(gè)實(shí)例如何全量或者按批次獲取數(shù)據(jù)?
而MLSQL 除了沒(méi)有解決Tracking問(wèn)題以外,已經(jīng)解決了MLFlow解決的其他的兩個(gè)問(wèn)題,當(dāng)然還有MLFlow沒(méi)有解決的幾個(gè)問(wèn)題。
MLSQL核心在于
- 提供了一個(gè)7*24小時(shí)的運(yùn)行平臺(tái),算法的工作在IDE中完成調(diào)試,Web界面上完成開(kāi)發(fā)和部署,共享CPU/GPU/內(nèi)存資源。
- MLSQL提供了一套統(tǒng)一的DSL語(yǔ)言完成算法訓(xùn)練和模型部署的功能。
- MLSQL在允許用戶(hù)自定義腳本進(jìn)行訓(xùn)練和預(yù)測(cè)的過(guò)程中,制定更為嚴(yán)格的規(guī)范,雖然允許你用自己喜歡的任何算法框架完成訓(xùn)練腳本和預(yù)測(cè)腳本的開(kāi)發(fā),但是需要符合響應(yīng)的規(guī)范從而嵌入到MLSQL語(yǔ)法里使用。MLSQL要求你大部分訓(xùn)練參數(shù)都需要通過(guò)SQL語(yǔ)法進(jìn)行暴露從而使得你的訓(xùn)練腳本具有更好的封裝和通用性。
1,2 解決了算法腳本難于重復(fù)運(yùn)行的問(wèn)題,以及模型部署的問(wèn)題,同時(shí)還解決了數(shù)據(jù)預(yù)處理復(fù)用的問(wèn)題。
- 允許算法嵌入任何算法框架完成訓(xùn)練和預(yù)測(cè),給了算法工程師足夠的靈活性。
總結(jié)
當(dāng)然,MLFlow目前的模式?jīng)]有強(qiáng)行綁定到Spark上,而是作為ML的一個(gè)輔助工具和標(biāo)準(zhǔn),最大程度的減少算法同學(xué)的學(xué)習(xí)和使用成本,減少對(duì)現(xiàn)有流程干擾,可以使得MLFlow更容易被算法同學(xué)接受,從而享受到它的好處,這是MLSQL無(wú)法比擬的。所以我前面說(shuō)了,MLFlow更像一個(gè)Pipeline工具和標(biāo)準(zhǔn),MLSQL則更像一個(gè)AI平臺(tái)。