學(xué)習(xí)啦 > 學(xué)習(xí)方法 > 通用學(xué)習(xí)方法 > 學(xué)習(xí)方法指導(dǎo) > 機(jī)電學(xué)習(xí)方法演講稿

機(jī)電學(xué)習(xí)方法演講稿

時間: 欣怡1112 分享

機(jī)電學(xué)習(xí)方法演講稿

  機(jī)器學(xué)習(xí)算法線上部署方法是什么?下面是學(xué)習(xí)啦小編分享給大家的機(jī)器學(xué)習(xí)算法線上部署方法的資料,希望大家喜歡!

  機(jī)器學(xué)習(xí)算法線上部署方法一、總結(jié)來說,大體會區(qū)分這三種場景,請大家對號入座,酌情使用

  如果是實時的、小數(shù)據(jù)量的預(yù)測應(yīng)用,則采用的SOA調(diào)用Rserve或者python-httpserve來進(jìn)行應(yīng)用;這種應(yīng)用方式有個缺點是需要啟用服務(wù)來進(jìn)行預(yù)測,也就是需要跨環(huán)境,從Java跨到R或者Python環(huán)境。對于性能,基本上我們用Rserver方式,針對一次1000條或者更少請求的預(yù)測,可以控制95%的結(jié)果在100ms內(nèi)返回結(jié)果,100ms可以滿足工程上的實踐要求。更大的數(shù)據(jù)量,比如10000/次,100000/次的預(yù)測,我們目前評估下來滿足不了100ms的要求,建議分批進(jìn)行調(diào)用或者采用多線程請求的方式來實現(xiàn)。

  如果是實時、大數(shù)據(jù)量的預(yù)測應(yīng)用,則會采用SOA,訓(xùn)練好的模型轉(zhuǎn)換成PMML(關(guān)于如何轉(zhuǎn)換,我在下面會詳細(xì)描述),然后把模型封裝成一個類,用Java調(diào)用這個類來預(yù)測。用這種方式的好處是SOA不依賴于任何環(huán)境,任何計算和開銷都是在Java內(nèi)部里面消耗掉了,所以這種工程級別應(yīng)用速度很快、很穩(wěn)定。用此種方法也是要提供兩個東西,模型文件和預(yù)測主類;

  如果是Offline(離線)預(yù)測的,D+1天的預(yù)測,則可以不用考慮第1、2中方式,可以簡單的使用Rscript x.R或者python x.py的方式來進(jìn)行預(yù)測。使用這種方式需要一個調(diào)度工具,如果公司沒有統(tǒng)一的調(diào)度工具,你用shell的crontab做定時調(diào)用就可以了。

  以上三種做法,都會用SOA里面進(jìn)行數(shù)據(jù)處理和變換,只有部分變換會在提供的Function或者類進(jìn)行處理,一般性都建議在SOA里面處理好,否則性能會變慢。

  大概場景羅列完畢,簡要介紹一下各不同工具的線上應(yīng)用的實現(xiàn)方式。

  機(jī)器學(xué)習(xí)算法線上部署方法二、轉(zhuǎn)換PMML,并封裝PMML

  大部分模型都可以用PMML的方式實現(xiàn),PMML的使用方法調(diào)用范例見:

  jpmml的說明文檔: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)換語言,主流的機(jī)器學(xué)習(xí)語言都支持了,深度學(xué)習(xí)類除外;

  從下圖可以看到,它支持R、python和spark、xgboost等模型的轉(zhuǎn)換,用起來非常方便。

  機(jī)器學(xué)習(xí)算法線上部署方法三、各個算法工具的工程實踐

  1.python模型上線:我們目前使用了模型轉(zhuǎn)換成PMML上線方法。

  python-sklearn里面的模型都支持,也支持xgboost,并且PCA,歸一化可以封裝成preprocess轉(zhuǎn)換成PMML,所以調(diào)用起來很方便;

  特別需要注意的是:缺失值的處理會影響到預(yù)測結(jié)果,大家可以可以看一下;

  用PMML方式預(yù)測,模型預(yù)測一條記錄速度是1ms,可以用這個預(yù)測來預(yù)估一下根據(jù)你的數(shù)據(jù)量,整體的速度有多少。

  2.R模型上線-這塊我們用的多,可以用R model轉(zhuǎn)換PMML的方式來實現(xiàn)。

  這里我介紹另一種的上線方式:Rserve。具體實現(xiàn)方式是:用SOA調(diào)用Rserve的方式去實現(xiàn),我們會在服務(wù)器上部署好R環(huán)境和安裝好Rserve,然后用JAVA寫好SOA接口,調(diào)用Rserve來進(jìn)行預(yù)測;

  Java調(diào)用Rserve方式見網(wǎng)頁鏈接:Rserve - Binary R server;

  centos的Rserve搭建方法見:centos -Rserve的搭建,這里詳細(xì)描述了Rserve的搭建方式。

  Rserve方式可以批量預(yù)測,跟PMML的單個預(yù)測方式相比,在少數(shù)據(jù)量的時候,PMML速度更快,但是如果是1000一次一批的效率上看,Rserve的方式會更快;用Rserve上線的文件只需要提供兩個:

  模型結(jié)果文件(XX.Rdata);

  預(yù)測函數(shù)(Pred.R)。

  Rserve_1啟動把模型結(jié)果(XX.Rdata)常駐內(nèi)存。預(yù)測需要的輸入Feature都在Java里定義好不同的變量,然后你用Java訪問Rserve_1,調(diào)用Pred.R進(jìn)行預(yù)測,獲取返回的List應(yīng)用在線上。最后把相關(guān)的輸入輸出存成log進(jìn)行數(shù)據(jù)核對。

  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模型的上線就相對簡單一些,我們用scala訓(xùn)練好模型(一般性我們都用xgboost訓(xùn)練模型)然后寫一個Java Class,直接在JAVA中先獲取數(shù)據(jù),數(shù)據(jù)處理,把處理好的數(shù)據(jù)存成一個數(shù)組,然后調(diào)用模型Class進(jìn)行預(yù)測。模型文件也會提前l(fā)oad在內(nèi)存里面,存在一個進(jìn)程里面,然后我們?nèi)フ{(diào)用這個進(jìn)程來進(jìn)行預(yù)測。所以速度蠻快的。

  Spark模型上線,放在spark集群,不脫離spark環(huán)境,方便,需要自己打jar包;

  我們這里目前還沒有嘗試過,有一篇博客寫到了如果把spark模型導(dǎo)出PMML,然后提交到spark集群上來調(diào)用,大家可以參考一下:Spark加載PMML進(jìn)行預(yù)測。

  機(jī)器學(xué)習(xí)算法線上部署方法四、只用Linux的Shell來調(diào)度模型的實現(xiàn)方法—簡單粗暴

  因為有些算法工程師想快速迭代,把模型模擬線上線看一下效果,所以針對離線預(yù)測的模型形式,還有一種最簡單粗暴的方法,這種方法開發(fā)快速方便,具體做法如下:

  寫一下R的預(yù)測腳本,比如predict.R,是你的主預(yù)測的模型;

  然后用shell封裝成xx.sh,比如predict.sh,shell里面調(diào)用模型,存儲數(shù)據(jù);

  機(jī)器學(xué)習(xí)算法線上部署方法五、模型數(shù)據(jù)流轉(zhuǎn)的注意事項

  區(qū)分offline和realtime數(shù)據(jù),不管哪種數(shù)據(jù),我們根據(jù)key和不同的更新頻次,把數(shù)據(jù)放在redis里面去,設(shè)置不同的key和不同的過期時間;

  大部分redis數(shù)據(jù)都會存放兩個批次的數(shù)據(jù),用來預(yù)防無法取到最新的數(shù)據(jù),則用上一批次的數(shù)據(jù)來進(jìn)行填充;

  針對offline數(shù)據(jù),用調(diào)度工具做好依賴,每天跑數(shù)據(jù),并生成信號文件讓redis來進(jìn)行讀取;

  針對realtime數(shù)據(jù),我們區(qū)分兩種類型,一種是歷史+實時,比如最近30天的累計訂單量,則我們會做兩步,第一部分是D+1之前的數(shù)據(jù),存成A表,今天產(chǎn)生的實時數(shù)據(jù),存儲B表,A和B表表結(jié)構(gòu)相同,時效性不同;我們分別把A表和B表的數(shù)據(jù)放在Redis上去,然后在SOA里面對這兩部分?jǐn)?shù)據(jù)實時進(jìn)行計算;

  模型的輸入輸出數(shù)據(jù)進(jìn)行埋點,進(jìn)行數(shù)據(jù)跟蹤,一是用來校驗數(shù)據(jù),二來是用來監(jiān)控API接口的穩(wěn)定性,一般性我們會用ES來進(jìn)行l(wèi)og的查看和性能方面的監(jiān)控;

  任何接口都需要有容災(zāi)機(jī)制,如果接口超時,前端需要進(jìn)行容災(zāi),立即放棄接口調(diào)用數(shù)據(jù),返回一個默認(rèn)安全的數(shù)值,這點對于工程上非常重要。

3666555