機器學習模型如何上線或者online學習?

目前公司模型都是使用R或者PYTHON在線下建好模型,保存好模型參數,然後打包成介面,供JAVA進行調用。 那麼現在的問題是:

1. 打包上線的模型長期不會進行更新,因為模型參數被固定了,也不會去主動學習新的資料

2.模型出現問題很難找出原因。因為JAVA只會報錯JAVA的error,不會報出R或者PYTHON的error

3. 本地離線建模受到機器配置的限制。經常幾個G的數據電腦就會卡死,或者out of memory

嘗試使用JAVA直接建模,但是發現自己JAVA功底很弱,很難寫出像樣的演算法。。

特地想請教下各位前輩:

1. 你們是怎麼部署模型上線的?

2. 怎麼使得模型不斷的學習新的資料

3. 除了打包這種方式,是否還有其他的更好的方式進行上線?


謝邀。沒有太多的實際經驗,不過參與過一些有類似需求的項目。

1. 你們是怎麼部署模型上線的?

最常用的方法還是打包上線。不過方式可能和題主說的不太一樣,參見3。

2. 怎麼使得模型不斷的學習新的資料

如果題主不擔心從客戶端採集的數據有可能存在污染的話,那可以考慮用線上學習(online learning)的方法調整模型。請自行科普。棋牌類的通常適用強化學習(reinforcement learning),或者這兩者的結合。

3. 除了打包這種方式,是否還有其他的更好的方式進行上線?

除了把模型打包送到客戶端固定住,還可以把演算法和模型都留在服務端。也就是說,從Client變成Client/Server架構。這樣做的好處是服務端只提供API,當模型改變的時候,客戶端無需更新就可以看到最新模型的效果;壞處當然是網路延遲,和無網路無服務了。不過後者其實很好解決,同時打包一個客戶端模型作為備選就好了。

4. 打包上線的模型長期不會進行更新,因為模型參數被固定了,也不會去主動學習新的資料

參見2、3。

5.模型出現問題很難找出原因。因為JAVA只會報錯JAVA的error,不會報出R或者PYTHON的error

那應該在R或者Python里調試好了再拿來用吧。

6. 本地離線建模受到機器配置的限制。經常幾個G的數據電腦就會卡死,或者out of memory

如果幾個G的數據就卡死,而且演算法不是太差的話,那題主真的可以更新一下電腦配置了。。

7. 嘗試使用JAVA直接建模,但是發現自己JAVA功底很弱,很難寫出像樣的演算法。。

Java的演算法資源很豐富啊,一搜一大把。只不過多數沒有pip install來的好用而已。


我分享一下,關於在 machine learning 應用服務上,通常會走microservices的架構。 更多資訊可以在各大課程網上取得(ex: udacity, udemy)

microservices 說穿了,其實就是web service (restful api),透過 http request (GET, POST) 來取得資訊(如下圖所示)。 在python 裡面,比較常見的web service會用 flask + gunicorn。

在machine learning 裡面,會分成兩個步驟。 (1) offline training (2) online inference/prediction。 在 training step 的時候,都會在offline 操作,裡面包含了 (a) 調參 (b) validation (cross validation) (c) feature engineer (d) model selection。 model training 完之後,會把model pickle 起來。 然後把 step2: online inference 的 template 寫好後,就只要更新那個 pickle 就完成更新了。 下面是一個 簡單的 flask + ML 的範例。

web_service example

假設 ML model 是寫在 classifier.py 裡面,裡面有個 class 叫做 Predictor,

line11: Predictor 在__init__ 時,會 load 之前 train 好的model 的 pickle 檔

line17 - line21 從 POST 傳進來的 data,line25 -&> data preprocess

line25: Predictor 里有一個method 「predict」用來預測明天的股市 的「漲跌」。

預測結束後,就回傳。

(1) 由以上的步驟,如果要更新 model, 就只要把 classifier.py 里class Predictor 的 __init__ 裡面 load model 的 pickle file 換掉,model 就更新了。 整個架構不需要改動。

(2) 如果request 進入 web service 後,在某一段出現錯誤。 ex: 用戶打 POST ,少帶param3 這個參數,則 (1) web service 裡面要加入 try except (2) 加上 log (可以用 logging 這個module) 在各段 埋好log 訊息。 其實更好的做法,會是input checking,如果不滿足input條件,就直接回傳 bad request

(3) 如果有時會timeout 有時不會,則在 middleware 的地方,或者是 line15 (進入) line34(離開) 加入時間的資訊,以便觀察。 或者是 在 gunicorn timeout 的參數直接設置(如果運算時間超過timeout的設定值,會直接終止 worker)。

(4) 除了 web service 之外,通常還會包成 docker,以方便部署和管理。 下面這課程,有完整的 docker 相關資訊,講解得十分清楚,這邊就不多提了。

https://www.udemy.com/docker-tutorial-for-devops-run-docker-containers


手機打,簡單說下。 第一二個問題,題主說的應該是線下訓練,線上預測,大多數情況下也是如此,只要特徵不是太重,線上生成特徵預測一般是可以做到的。 說參數不能固定不更新,那你應該離線建立好自動調度腳本,讓參數從幾分鐘到一個月不等的更新頻率,至於多久這個得看你的數據的分布變化得快不快。

除開線下訓練線上預測,其他的方式比如在線學習,但是是否選擇這種方式還是那句話取決於數據是否變化得很快。也就是時效性要求強不強,舉個例子,像研究用戶行為進行推薦這種任務要求很強的時效性,因為用戶需求不斷在發生變化,所以時效性很強,再如同某些領域的文本區分(比如地域有關的,大多是常態),天級足以。


restfulapi,用輕量級的


題主啥模型?後台啟兩個,一個做服務,一個不斷取數據更新不行么?然後按時更新服務的模型;

如果數據太大,集群,或者數據定量線下訓練?

報錯還沒遇到過,線下調好


打包給人調用,或者提供thrift服務,或者掛在hadoop集群上跑批運行


推薦閱讀:

任天堂的商業模式是什麼?
工業視覺檢測發展現狀?
國外教材第一章的「INTRODUCTION」是幹什麼用的?
給定一串數據序列,如何判斷是否存在(模糊的)重複子序列?有什麼相應的演算法?

TAG:人工智慧 | 演算法 | 數據挖掘 | 機器學習 | 模式識別 |