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

理由
举报 取消

目前公司模型都是使用R或者PYTHON在线下建好模型,保存好模型参数,然后打包成接口,供JAVA进行调用。 那么现在的问题是:1. 打包上线的模型长期不会进行更新,因为模型参数被固定了,也不会去主动学习新的资料2.模型出现问题很难找出原因。因为JAVA只会报错JAVA的error,不会报出R或者PYTHON的error3. 本地离线建模受到机器配置的限制。经常几个G的数据电脑就会卡死,或者out of memory尝试使用JAVA直接建模,但是发现自己JAVA功底很弱,很难写出像样的算法。。特地想请教下各位前辈:1. 你们是怎么部署模型上线的?2. 怎么使得模型不断的学习新的资料3. 除了打包这种方式,是否还有其他的更好的方式进行上线?

2018年2月10日 6 条回复 1820 次浏览

发起人:卡牌大师 初入职场

不如我们,从头来过?

回复 ( 6 )

  1. 齐鹏
    理由
    举报 取消

    谢邀。没有太多的实际经验,不过参与过一些有类似需求的项目。

    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来的好用而已。

  2. 花京华
    理由
    举报 取消

    打包给人调用,或者提供thrift服务,或者挂在hadoop集群上跑批运行

  3. 林志豪
    理由
    举报 取消

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

  4. 数据挖掘
    理由
    举报 取消

    restfulapi,用轻量级的

  5. 邹二
    理由
    举报 取消

    题主啥模型?后台启两个,一个做服务,一个不断取数据更新不行么?然后按时更新服务的模型;

    如果数据太大,集群,或者数据定量线下训练?

    报错还没遇到过,线下调好

  6. xingyi
    理由
    举报 取消

    手机打,简单说下。 第一二个问题,题主说的应该是线下训练,线上预测,大多数情况下也是如此,只要特征不是太重,线上生成特征预测一般是可以做到的。 说参数不能固定不更新,那你应该离线建立好自动调度脚本,让参数从几分钟到一个月不等的更新频率,至于多久这个得看你的数据的分布变化得快不快。

    除开线下训练线上预测,其他的方式比如在线学习,但是是否选择这种方式还是那句话取决于数据是否变化得很快。也就是时效性要求强不强,举个例子,像研究用户行为进行推荐这种任务要求很强的时效性,因为用户需求不断在发生变化,所以时效性很强,再如同某些领域的文本区分(比如地域有关的,大多是常态),天级足以。

我来回答

Captcha 点击图片更换验证码