機(jī)電學(xué)習(xí)方法演講稿
機(jī)電學(xué)習(xí)方法演講稿
機(jī)器學(xué)習(xí)算法線上部署方法是什么?下面是學(xué)習(xí)啦小編分享給大家的機(jī)器學(xué)習(xí)算法線上部署方法的資料,希望大家喜歡!
機(jī)器學(xué)習(xí)算法線上部署方法一、總結(jié)來(lái)說(shuō),大體會(huì)區(qū)分這三種場(chǎng)景,請(qǐng)大家對(duì)號(hào)入座,酌情使用
如果是實(shí)時(shí)的、小數(shù)據(jù)量的預(yù)測(cè)應(yīng)用,則采用的SOA調(diào)用Rserve或者python-httpserve來(lái)進(jìn)行應(yīng)用;這種應(yīng)用方式有個(gè)缺點(diǎn)是需要啟用服務(wù)來(lái)進(jìn)行預(yù)測(cè),也就是需要跨環(huán)境,從Java跨到R或者Python環(huán)境。對(duì)于性能,基本上我們用Rserver方式,針對(duì)一次1000條或者更少請(qǐng)求的預(yù)測(cè),可以控制95%的結(jié)果在100ms內(nèi)返回結(jié)果,100ms可以滿足工程上的實(shí)踐要求。更大的數(shù)據(jù)量,比如10000/次,100000/次的預(yù)測(cè),我們目前評(píng)估下來(lái)滿足不了100ms的要求,建議分批進(jìn)行調(diào)用或者采用多線程請(qǐng)求的方式來(lái)實(shí)現(xiàn)。
如果是實(shí)時(shí)、大數(shù)據(jù)量的預(yù)測(cè)應(yīng)用,則會(huì)采用SOA,訓(xùn)練好的模型轉(zhuǎn)換成PMML(關(guān)于如何轉(zhuǎn)換,我在下面會(huì)詳細(xì)描述),然后把模型封裝成一個(gè)類,用Java調(diào)用這個(gè)類來(lái)預(yù)測(cè)。用這種方式的好處是SOA不依賴于任何環(huán)境,任何計(jì)算和開(kāi)銷都是在Java內(nèi)部里面消耗掉了,所以這種工程級(jí)別應(yīng)用速度很快、很穩(wěn)定。用此種方法也是要提供兩個(gè)東西,模型文件和預(yù)測(cè)主類;
如果是Offline(離線)預(yù)測(cè)的,D+1天的預(yù)測(cè),則可以不用考慮第1、2中方式,可以簡(jiǎn)單的使用Rscript x.R或者python x.py的方式來(lái)進(jìn)行預(yù)測(cè)。使用這種方式需要一個(gè)調(diào)度工具,如果公司沒(méi)有統(tǒng)一的調(diào)度工具,你用shell的crontab做定時(shí)調(diào)用就可以了。
以上三種做法,都會(huì)用SOA里面進(jìn)行數(shù)據(jù)處理和變換,只有部分變換會(huì)在提供的Function或者類進(jìn)行處理,一般性都建議在SOA里面處理好,否則性能會(huì)變慢。
大概場(chǎng)景羅列完畢,簡(jiǎn)要介紹一下各不同工具的線上應(yīng)用的實(shí)現(xiàn)方式。
機(jī)器學(xué)習(xí)算法線上部署方法二、轉(zhuǎn)換PMML,并封裝PMML
大部分模型都可以用PMML的方式實(shí)現(xiàn),PMML的使用方法調(diào)用范例見(jiàn):
jpmml的說(shuō)明文檔:GitHub - jpmml/jpmml-evaluator: Java Evaluator API for PMML;
Java調(diào)用PMML的范例(PPJUtils/java/pmml at master · pjpan/PPJUtils · GitHub),此案例是我們的工程師寫的范例,大家可以根據(jù)此案例進(jìn)行修改即可;
Jpmml支持的轉(zhuǎn)換語(yǔ)言,主流的機(jī)器學(xué)習(xí)語(yǔ)言都支持了,深度學(xué)習(xí)類除外;
從下圖可以看到,它支持R、python和spark、xgboost等模型的轉(zhuǎn)換,用起來(lái)非常方便。
機(jī)器學(xué)習(xí)算法線上部署方法三、各個(gè)算法工具的工程實(shí)踐
1.python模型上線:我們目前使用了模型轉(zhuǎn)換成PMML上線方法。
python-sklearn里面的模型都支持,也支持xgboost,并且PCA,歸一化可以封裝成preprocess轉(zhuǎn)換成PMML,所以調(diào)用起來(lái)很方便;
特別需要注意的是:缺失值的處理會(huì)影響到預(yù)測(cè)結(jié)果,大家可以可以看一下;
用PMML方式預(yù)測(cè),模型預(yù)測(cè)一條記錄速度是1ms,可以用這個(gè)預(yù)測(cè)來(lái)預(yù)估一下根據(jù)你的數(shù)據(jù)量,整體的速度有多少。
2.R模型上線-這塊我們用的多,可以用R model轉(zhuǎn)換PMML的方式來(lái)實(shí)現(xiàn)。
這里我介紹另一種的上線方式:Rserve。具體實(shí)現(xiàn)方式是:用SOA調(diào)用Rserve的方式去實(shí)現(xiàn),我們會(huì)在服務(wù)器上部署好R環(huán)境和安裝好Rserve,然后用JAVA寫好SOA接口,調(diào)用Rserve來(lái)進(jìn)行預(yù)測(cè);
Java調(diào)用Rserve方式見(jiàn)網(wǎng)頁(yè)鏈接:Rserve - Binary R server;
centos的Rserve搭建方法見(jiàn):centos -Rserve的搭建,這里詳細(xì)描述了Rserve的搭建方式。
Rserve方式可以批量預(yù)測(cè),跟PMML的單個(gè)預(yù)測(cè)方式相比,在少數(shù)據(jù)量的時(shí)候,PMML速度更快,但是如果是1000一次一批的效率上看,Rserve的方式會(huì)更快;用Rserve上線的文件只需要提供兩個(gè):
模型結(jié)果文件(XX.Rdata);
預(yù)測(cè)函數(shù)(Pred.R)。
Rserve_1啟動(dòng)把模型結(jié)果(XX.Rdata)常駐內(nèi)存。預(yù)測(cè)需要的輸入Feature都在Java里定義好不同的變量,然后你用Java訪問(wèn)Rserve_1,調(diào)用Pred.R進(jìn)行預(yù)測(cè),獲取返回的List應(yīng)用在線上。最后把相關(guān)的輸入輸出存成log進(jìn)行數(shù)據(jù)核對(duì)。
Pred.R <- function(x1,x2,x3){data <- cbind(x1,x2,x3)# feature engineeringscore <- predict(modelname, data, type = 'prob')return(list(score))}
3.Spark模型上線-好處是脫離了環(huán)境,速度快。
Spark模型的上線就相對(duì)簡(jiǎn)單一些,我們用scala訓(xùn)練好模型(一般性我們都用xgboost訓(xùn)練模型)然后寫一個(gè)Java Class,直接在JAVA中先獲取數(shù)據(jù),數(shù)據(jù)處理,把處理好的數(shù)據(jù)存成一個(gè)數(shù)組,然后調(diào)用模型Class進(jìn)行預(yù)測(cè)。模型文件也會(huì)提前l(fā)oad在內(nèi)存里面,存在一個(gè)進(jìn)程里面,然后我們?nèi)フ{(diào)用這個(gè)進(jìn)程來(lái)進(jìn)行預(yù)測(cè)。所以速度蠻快的。
Spark模型上線,放在spark集群,不脫離spark環(huán)境,方便,需要自己打jar包;
我們這里目前還沒(méi)有嘗試過(guò),有一篇博客寫到了如果把spark模型導(dǎo)出PMML,然后提交到spark集群上來(lái)調(diào)用,大家可以參考一下:Spark加載PMML進(jìn)行預(yù)測(cè)。
機(jī)器學(xué)習(xí)算法線上部署方法四、只用Linux的Shell來(lái)調(diào)度模型的實(shí)現(xiàn)方法—簡(jiǎn)單粗暴
因?yàn)橛行┧惴üこ處熛肟焖俚?,把模型模擬線上線看一下效果,所以針對(duì)離線預(yù)測(cè)的模型形式,還有一種最簡(jiǎn)單粗暴的方法,這種方法開(kāi)發(fā)快速方便,具體做法如下:
寫一下R的預(yù)測(cè)腳本,比如predict.R,是你的主預(yù)測(cè)的模型;
然后用shell封裝成xx.sh,比如predict.sh,shell里面調(diào)用模型,存儲(chǔ)數(shù)據(jù);
機(jī)器學(xué)習(xí)算法線上部署方法五、模型數(shù)據(jù)流轉(zhuǎn)的注意事項(xiàng)
區(qū)分offline和realtime數(shù)據(jù),不管哪種數(shù)據(jù),我們根據(jù)key和不同的更新頻次,把數(shù)據(jù)放在redis里面去,設(shè)置不同的key和不同的過(guò)期時(shí)間;
大部分redis數(shù)據(jù)都會(huì)存放兩個(gè)批次的數(shù)據(jù),用來(lái)預(yù)防無(wú)法取到最新的數(shù)據(jù),則用上一批次的數(shù)據(jù)來(lái)進(jìn)行填充;
針對(duì)offline數(shù)據(jù),用調(diào)度工具做好依賴,每天跑數(shù)據(jù),并生成信號(hào)文件讓redis來(lái)進(jìn)行讀取;
針對(duì)realtime數(shù)據(jù),我們區(qū)分兩種類型,一種是歷史+實(shí)時(shí),比如最近30天的累計(jì)訂單量,則我們會(huì)做兩步,第一部分是D+1之前的數(shù)據(jù),存成A表,今天產(chǎn)生的實(shí)時(shí)數(shù)據(jù),存儲(chǔ)B表,A和B表表結(jié)構(gòu)相同,時(shí)效性不同;我們分別把A表和B表的數(shù)據(jù)放在Redis上去,然后在SOA里面對(duì)這兩部分?jǐn)?shù)據(jù)實(shí)時(shí)進(jìn)行計(jì)算;
模型的輸入輸出數(shù)據(jù)進(jìn)行埋點(diǎn),進(jìn)行數(shù)據(jù)跟蹤,一是用來(lái)校驗(yàn)數(shù)據(jù),二來(lái)是用來(lái)監(jiān)控API接口的穩(wěn)定性,一般性我們會(huì)用ES來(lái)進(jìn)行l(wèi)og的查看和性能方面的監(jiān)控;
任何接口都需要有容災(zāi)機(jī)制,如果接口超時(shí),前端需要進(jìn)行容災(zāi),立即放棄接口調(diào)用數(shù)據(jù),返回一個(gè)默認(rèn)安全的數(shù)值,這點(diǎn)對(duì)于工程上非常重要。