机器学习模型如何上线或者online学习?

目前公司模型都是使用R或者PYTHON在线下建好模型,保存好模型参数,然后打包成接口,供JAVA进行调用。 那么现在的问题是: 1. 打包上线的模型长期不会进行更新,因为模型参数被固定了,也不会去主动学习新的资料 2.模型出现问题很难找出原因。因为JAVA只会报错JAVA的error,不会报出R或者PYTHON的error 3. 本地离线建模受到机器配置的限制。经常几个G的数据电脑就会卡死,或者out of memory 尝试使用JAVA直接建模,但是发现自己J…
关注者
246
被浏览
7,675

我分享一下,关于在 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 相关资讯,讲解得十分清楚,这边就不多提了。

udemy.com/docker-tutori