通常業(yè)務(wù)中對(duì)計(jì)算性能有要求時(shí)碘箍,通常不使用GPU跑tf匾鸥,會(huì)使用xgboost on Spark來解決酬核,既保證速度蜜另,準(zhǔn)確率也能接受。
LightGBM是使用基于樹的學(xué)習(xí)算法的梯度增強(qiáng)框架愁茁。它被設(shè)計(jì)為分布式且高效的蚕钦,具有以下優(yōu)點(diǎn):
根據(jù)官網(wǎng)的介紹:
LigthGBM訓(xùn)練速度更快亭病,效率更高鹅很。LightGBM比XGBoost快將近10倍。
降低內(nèi)存使用率罪帖。內(nèi)存占用率大約為XGBoost的1/6促煮。
準(zhǔn)確性有相應(yīng)提升邮屁。
支持并行和GPU學(xué)習(xí)。
能夠處理大規(guī)模數(shù)據(jù)菠齿。
大部分使用和分析LigthGBM的都是在python單機(jī)版本上佑吝。要在spark上使用LigthGBM,需要安裝微軟的MMLSpark包绳匀。
MMLSpark可以通--packages安裝芋忿。
spark --packages參數(shù)
根據(jù)jar包的maven地址,使用該包疾棵,該參數(shù)不常用戈钢,因?yàn)楣緝?nèi)部的數(shù)據(jù)平臺(tái)的集群不一定能聯(lián)網(wǎng)。
如下示例:
$ bin/spark-shell --packages com.microsoft.ml.spark:mmlspark_2.11:1.0.0-rc1 http://maven.aliyun.com/nexus/content/groups/public/
--repositories 為該包的maven地址是尔,建議給定殉了,不寫則使用默認(rèn)源。
若依賴多個(gè)包拟枚,則中間以逗號(hào)分隔薪铜,類似--jars
默認(rèn)下載的包位于當(dāng)前用戶根目錄下的.ivy/jars文件夾中
應(yīng)用場景:本地沒有編譯好的jar包,集群中服務(wù)需要該包的的時(shí)候恩溅,都是從給定的maven地址隔箍,直接下載
MMLSpark用法
1 .MMLSpark可以通--packages選項(xiàng)方便地安裝在現(xiàn)有的Spark集群上,例如:
spark-shell --packages com.microsoft.ml.spark:mmlspark_2.11:1.0.0-rc1
pyspark --packages com.microsoft.ml.spark:mmlspark_2.11:1.0.0-rc1
spark-submit --packages com.microsoft.ml.spark:mmlspark_2.11:1.0.0-rc1 MyApp.jar
這也可以在其他Spark contexts中使用脚乡,例如鞍恢,可以通過將MMLSpark添加到.aztk/spark-default.conf文件中來在AZTK中使用MMLSpark。
2 .要在Python(或Conda)安裝上嘗試MMLSpark每窖,首先通過pip安裝PySpark, pip安裝PySpark帮掉。接下來,使用--package或在運(yùn)行時(shí)添加包來獲取scala源代碼
import pyspark
spark = pyspark.sql.SparkSession.builder.appName("MyApp")\
.config("spark.jars.packages", "com.microsoft.ml.spark:mmlspark_2.11:1.0.0-rc1")\
.getOrCreate()
import mmlspark
3 .xgboost比較麻煩窒典,通常是自己編譯打包使用蟆炊,mmlspark中的lightGBM可以直接寫Maven依賴或者直接下載jar包添加到項(xiàng)目中使用。
<dependency>
<groupId>com.microsoft.ml.spark</groupId>
<artifactId>mmlspark_2.11</artifactId>
<version>0.18.0</version>
</dependency>
<dependency>
<groupId>com.microsoft.ml.lightgbm</groupId>
<artifactId>lightgbmlib</artifactId>
<version>2.2.350</version>
</dependency>
mmlspark:https://repo1.maven.org/maven2/com/microsoft/ml/spark/mmlspark_2.11/
lightgbmlib:https://repo1.maven.org/maven2/com/microsoft/ml/lightgbm/lightgbmlib/
- 使用
python
分類
from mmlspark.lightgbm import LightGBMClassifier
model = LightGBMClassifier(learningRate=0.3,
numIterations=100,
numLeaves=31).fit(train)
回歸
from mmlspark.lightgbm import LightGBMRegressor
model = LightGBMRegressor(application='quantile',
alpha=0.3,
learningRate=0.3,
numIterations=100,
numLeaves=31).fit(train)
scala
Architecture
Spark上的LightGBM使用簡單的包裝器和接口生成器(SWIG)為LightGBM添加Java支持瀑志。這些Java綁定使用Java本地接口調(diào)用到分布式c++ API涩搓。
我們通過在MapPartitions調(diào)用中使用Spark執(zhí)行器調(diào)用LGBM_NetworkInit來初始化LightGBM。然后劈猪,我們將每個(gè)工作分區(qū)傳遞到LightGBM昧甘,以為LightGBM創(chuàng)建內(nèi)存中的分布式數(shù)據(jù)集。然后战得,我們可以訓(xùn)練LightGBM來生成一個(gè)可以用于預(yù)測的模型充边。
LightGBMClassifier和LightGBMRegressor使用SparkML API,從相同的基類繼承,與SparkML管道集成浇冰,并且可以使用SparkML的交叉驗(yàn)證器進(jìn)行優(yōu)化贬媒。
可以使用saveNativeModel()將構(gòu)建的模型保存為使用本機(jī)LightGBM模型的SparkML管道。此外肘习,它們與PMML完全兼容际乘,并且可以通過JPMML-SparkML-LightGBM插件轉(zhuǎn)換為PMML格式。
Barrier Execution Mode
默認(rèn)情況下漂佩,LightGBM使用常規(guī)的spark范式啟動(dòng)任務(wù)脖含,并與驅(qū)動(dòng)程序通信以協(xié)調(diào)任務(wù)執(zhí)行。驅(qū)動(dòng)線程聚合所有任務(wù)主機(jī):端口信息投蝉,然后將完整的列表傳遞給worker器赞,以便NetworkInit被調(diào)用民轴。這要求驅(qū)動(dòng)程序知道有多少任務(wù)匿沛,如果預(yù)期的任務(wù)數(shù)量與實(shí)際不同,這將導(dǎo)致初始化死鎖胳赌。
有一個(gè)新的UseBarrierExecutionMode標(biāo)志咳榜,它在激活時(shí)使用barrier()階段阻止所有任務(wù)夏醉。barrier執(zhí)行模式簡化了聚合所有任務(wù)的主機(jī):端口信息的邏輯。要在scala中使用它涌韩,你可以調(diào)用
val lgbm = new LightGBMClassifier()
.setLabelCol(labelColumn)
.setObjective(binaryObjective)
.setUseBarrierExecutionMode(true)
...
<train classifier>
完整案例查找https://github.com/jpmml/jpmml-sparkml
Reference:
https://github.com/Azure/mmlspark
https://mmlspark.blob.core.windows.net/website/index.html
https://github.com/alipay/jpmml-sparkml-lightgbm
https://github.com/jpmml/jpmml-sparkml