作者: 黄鸿波

在企业中,我们做模型的目的就是为了能够让它来更好的解决产品在实际生产过程中所遇到的具体的问题,而模型训练好之后,下一步要做的就是将其部署上线。AI 对于很多企业来讲是一个新的领域,所以很多企业在训练好一个模型之后,对于模型部署方面总是会显得束手无策。

在企业中,我们所做的 AI 项目,从大的方面来分,可以分成在线模型和离线模型两种,每一种类型的模型根据业务场景的不同会有不同的选择,例如,我们在推荐系统中,很多任务并不是要求实时得出结果的,尤其是在做召回的这个阶段,有时候一天做一次召回,有时候可能一周做一次召回都可以,针对于这类的模型,我们就没有必要去关注他的实时效率问题。再比如,有些文本审核平台,需要实时审核用户的发帖信息和一些在线的言论,有一些敏感的内容一旦发出去,就很有可能导致一些非常严重的后果,那么这个时候,我们就需要模型能够进行实时预测,此时,对于模型预测的效率要求就非常高了,甚至对于并发量还有一定的要求;还有一种情况,就是我们可能不一定需要实时给用户进行反馈,但是可能需要在几分钟只能告诉用户一个结果,对于这样的情况,我们一般叫做 nearline 模型,那么下面我们就针对于这几种模型的部署来做一个简单的探讨。

离线模型(Offline)

离线模型存在于很多业务场景中,其中最常见的业务场景就是用在推荐系统的召回阶段,由于在推荐系统中,召回并不要求是实时的,可以根据业务的需要,调整成每天一次,或者每几个小时跑一次即可,因此,这类的模型,一般我们只需要使用 Linux 下的 crontab 定时任务脚本,每隔一段时间来启动一次就可以,然后将 log 文件输出到指定的文件下即可。这种方式一般来讲仅限离线模型的部署,其本质上就是一段定时任务的代码。在这里我们不做过多的展开。

在线(Online)/近似在线(NearLine)模型

在线模型或者说是实时模型是我们这次要重点来说的一种模型的部署。在生产系统中,实时推理和预测是最常见的需求,也是对于很多深度学习模型来说所必须达到的点。下面我们来说一下深度学习模型在实时预测时常见的几种部署方法:

将模型预测直接打包成 http 接口

将模型直接打包成一个 http 接口的形式是在企业中比较常见的模型上线的方式,所谓的将预测直接打包成 http 接口实际上一般是指将我们训练好的模型直接在线上进行预测。我们来试想一个场景,当一个模型训练好之后,我们如果想要验证这个模型的好坏,我们首先能想到的办法就是找一批数据来测试一下。实际上,将模型预测直接打包成 http 接口也是利用了这样的思路。

在这里,我们可以将训练好的模型提前进行加载,并初始化若干个消息队列和 worker,当有新的待预测数据进入的时候,我们直接将数据通过消息队列传入到模型中进行推理和预测,最终得到结果。

而对于外层接收输入,我们一般可以将接收的地方使用 flask 打包成一个 http 接口,等待传入即可。

使用这种方式直接打包成 http 接口的好处在于打包和部署相对比较方便,对于一些相对比较轻量级且对并发量要求不是很高的情况下相对还是比较好用的。使用值得注意的是,如果对于一个相对比较大的模型来讲,这种方式推理的时间相对就会比较长,从用户输入到结果返回可能需要 200ms 左右。

PMML

PMML 是一套通用的且与平台