Apache Spark 2.0: 机器学习模型持久化
在即將發(fā)布的Apache Spark 2.0中將會(huì)提供機(jī)器學(xué)習(xí)模型持久化能力。機(jī)器學(xué)習(xí)模型持久化(機(jī)器學(xué)習(xí)模型的保存和加載)使得以下三類機(jī)器學(xué)習(xí)場(chǎng)景變得容易:
-
數(shù)據(jù)科學(xué)家開發(fā)ML模型并移交給工程師團(tuán)隊(duì)在生產(chǎn)環(huán)境中發(fā)布;
-
數(shù)據(jù)工程師把一個(gè)Python語言開發(fā)的機(jī)器學(xué)習(xí)模型訓(xùn)練工作流集成到一個(gè)Java語言開發(fā)的機(jī)器學(xué)習(xí)服務(wù)工作流;
-
數(shù)據(jù)科學(xué)家創(chuàng)建多個(gè)訓(xùn)練ML模型的作業(yè),稍后需要保存和評(píng)估。
Spark MLlib將提供基于DataFrame的API來支持ML持久化。后面將分三部分介紹:概要、代碼實(shí)例和MLlib持久化API一些小細(xì)節(jié)。
概要
ML持久化關(guān)鍵特色:
-
支持Spark原有的多種開發(fā)語言:Scala、Java和Python & R;
-
基于DataFrame的API幾乎支持所有的ML算法;
-
支持單個(gè)ML模型和多管道ML模型;
-
使用可轉(zhuǎn)換格式分布式保存機(jī)器學(xué)習(xí)模型
學(xué)學(xué)API
在Apache Spark 2.0中,機(jī)器學(xué)習(xí)組件MLlib提供基于DataFrame的API,可實(shí)現(xiàn)類似于Spark數(shù)據(jù)源API的保存和載入功能,見以前的文章。
作者使用經(jīng)典的機(jī)器學(xué)習(xí)例子(手寫數(shù)字識(shí)別,使用MNIST數(shù)據(jù)庫,MNIST數(shù)據(jù)庫包含0到9的手寫數(shù)字和標(biāo)注標(biāo)記數(shù)據(jù))來證實(shí)ML模型保存和加載功能。作者取其它手寫數(shù)字并鑒別數(shù)字是幾,完整例子代碼見notebook:加載數(shù)據(jù)、訓(xùn)練模型和保存以及加載模型。
保存和加載單模型
首先展示如何使用不同編程語言保存和加載同一單模型。作者使用Python訓(xùn)練和保存隨機(jī)森林分類器模型,然后使用Scala來加載同一個(gè)ML模型回來。
training = sqlContext.read... # data: features, label rf = RandomForestClassifier(numTrees=20) model = rf.fit(training)可以簡(jiǎn)單的調(diào)用save方法來保存上面訓(xùn)練好的ML模型,然后使用load方法再加載回來。
model.save("myModelPath") sameModel = RandomForestClassificationModel.load("myModelPath")這里也可以加載剛才同一個(gè)ML模型(使用Python保存)進(jìn)入Scala或者Java應(yīng)用。
// Load the model in Scala
val sameModel = RandomForestClassificationModel.load("myModelPath")
這個(gè)工作既可以對(duì)小數(shù)據(jù)量、局部模型(比如,常見的分類模型K-Means)適用,也可以對(duì)海量數(shù)據(jù)、分布式模型(比如,常見的推薦模型ALS)。剛加載的模型都包含有相同的參數(shù)設(shè)置和訓(xùn)練數(shù)據(jù),所以即使在不同的Spark部署加載同一個(gè)模型也會(huì)得到相同的預(yù)測(cè)結(jié)果。
保存和加載多管道模型
前面僅僅描述來保存和加載單個(gè)ML模型,而實(shí)際應(yīng)用中,ML工作流包含多階段:從特征提取和轉(zhuǎn)化到模型擬合和優(yōu)化。MLlib會(huì)提供Pipeline來輔助使用者來構(gòu)建這些工作流。
MLlib提供使用者保存和加載整個(gè)Pipeline。下面來看下如何來實(shí)現(xiàn):
-
特征提取:圖像數(shù)據(jù)二值化為0和1(黑和白);
-
模型擬合:隨即森林分類器讀取圖像數(shù)據(jù)并預(yù)測(cè)數(shù)字0到9;
-
優(yōu)化結(jié)果:交叉驗(yàn)證來優(yōu)化樹的深度。看下代碼:
在這個(gè)管道擬合模型前先來展示我們?nèi)绾伪4嬲麄€(gè)ML工作流。這個(gè)工作流將在其它Spark集群后續(xù)被加載。
cv.save("myCVPath") val sameCV = CrossValidator.load("myCVPath")最后,我們擬合模型管道,保存管道,并在以后進(jìn)行加載。下面保存了特征抽取、隨機(jī)森林模型交叉驗(yàn)證的優(yōu)化以及模型優(yōu)化對(duì)應(yīng)的統(tǒng)計(jì)數(shù)據(jù)。
val cvModel = cv.fit(training) cvModel.save("myCVModelPath") val sameCVModel = CrossValidatorModel.load("myCVModelPath")細(xì)節(jié)知識(shí)點(diǎn)
Python優(yōu)化
在Spark 2.0中并沒有提供Python優(yōu)化功能,Python不支持保存和加載CrossValidator和TrainValidationSplit來做模型超參數(shù)優(yōu)化,這個(gè)功能將在Spark 2.1中實(shí)現(xiàn)(SPARK-13786)。但是Python還是可以保存CrossValidator和TrainValidationSplit的結(jié)果。例如,我們可以使用Cross-Validation優(yōu)化隨機(jī)森林模型并保存調(diào)試好的優(yōu)化模型。
# Define the workflow rf = RandomForestClassifier() cv = CrossValidator(estimator=rf, ...) # Fit the model, running Cross-Validation cvModel = cv.fit(trainingData) # Extract the results, i.e., the best Random Forest model bestModel = cvModel.bestModel # Save the RandomForest model bestModel.save("rfModelPath")可轉(zhuǎn)換的存儲(chǔ)格式
本質(zhì)上,我們把模型元數(shù)據(jù)和參數(shù)存儲(chǔ)為JSON,數(shù)據(jù)集存儲(chǔ)成Parquet。這些存儲(chǔ)格式是可轉(zhuǎn)換的,并且也能被其它開發(fā)庫讀取。Parquet文件允許使用者存儲(chǔ)小模型(比如,貝葉斯分類)和分布式模型(比如,ALS)。存儲(chǔ)路徑可以是任意Dataset/DataFrame支持的URI,比如S3、本地存儲(chǔ)等。
跨語言兼容性
機(jī)器學(xué)習(xí)模型可以在Scala、Java和Python & R間任意存儲(chǔ)和加載。但R語言有兩個(gè)局限性:第一,不是所有MLlib模型都支持R語言,所以不是所有的使用其它語言訓(xùn)練的模型能被R語言加載;第二,使用R獨(dú)有的方式的R模型格式存儲(chǔ)不易被其它語言使用。
結(jié)論
隨著Spark 2.0的即將發(fā)布,基于DataFrame的MLlib API將會(huì)提供幾乎完善的模型和機(jī)器學(xué)習(xí)管道持久化。機(jī)器學(xué)習(xí)模型持久化在團(tuán)隊(duì)間合作、多編程語言ML工作流以及遷移模型到生產(chǎn)環(huán)境方面相當(dāng)重要。基于DataFrame的MLlib API也將最終會(huì)成為Spark在機(jī)器學(xué)習(xí)方面主要的API。
總結(jié)
以上是生活随笔為你收集整理的Apache Spark 2.0: 机器学习模型持久化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RDD的几种创建方式
- 下一篇: Spark函数详解系列--RDD基本转换