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