一、深度模型线上部署
1、预训练embedding+轻量级模型
复杂网络离线训练,生成embedding存入内存数据库,线上实现LR或浅层NN等轻量级模型拟合优化目标;
(1)分别用复杂网络对“用户特征”和“广告特征”进行了embedding化,在最后的交叉层之前,用户特征和广告特征之间没有任何交互,这就形成了两个独立的“塔”,因此称为双塔模型。
最终的用户embedding和广告embedding存入内存数据库。
(2)线上inference时,也不用复现复杂网络,只需要实现最后一层的逻辑,在从内存数据库中取出用户embedding和广告embedding之后,通过简单计算即可得到最终的预估结果。
(3)embedding离线训练的方法已经可以融入大量user和item信息。那么利用预训练的embedding就可以大大降低线上预估模型的复杂度,从而使得手动实现深度学习网络的inference逻辑成为可能。
(4) 双塔模型部分的用户侧embedding通常是动态的,比如包含用户query信息,是需要在线计算的;取决于用什么原始特征吧,如果只用静态特征当然可以。但用户侧塔的原始特征通常比较动态,一个是通常包含context特征,比如请求时间、当前地理位置之类的,这些都是没法离线准备好embedding的;二是对新用户embedding没办法离线提前准备好,但如果通过用户塔在线inference就可以从原始特征直接计算得到embedding。
2、PMML模型
Embedding+线上简单模型的方法,把模型进行了割裂;不完全是End2End训练+End2End部署这种最“完美”的形式;
(1)PMML的全称是“预测模型标记语言”;以XML的形式表示不同模型结构参数的标记语言。在模型上线的过程中,PMML经常作为中间媒介连接离线训练平台和线上预测平台。
(2)以Spark mllib模型的训练和上线过程为例解释PMML在整个机器学习模型训练及上线流程中扮演的角色(如图2)。
(3)使用了JPMML作为序列化和解析PMML文件的library。JPMML项目分为Spark和Java Server两部分。Spark部分的library完成Spark MLlib模型的序列化,生成PMML文件并保存到线上服务器能够触达的数据库或文件系统中;Java Server部分则完成PMML模型的解析,并生成预估模型,完成和业务逻辑的整合。
(4)JPMML在Java Server部分只进行inference,不用考虑模型训练、分布式部署等一系列问题,因此library比较轻,能够高效的完成预估过程。
4、TensorFlow Serving等原生serving平台
(1)本质上讲TensorFlow Serving的工作流程和PMML类的工具的流程是一致的。不同之处在于TensorFlow定义了自己的模型序列化标准。利用TensorFlow自带的模型序列化函数可将训练好的模型参数和结构保存至某文件路径。
(2)TensorFlow Serving最普遍也是最便捷的serving方式是使用Docker建立模型Serving API。在准备好Docker环境后,仅需要pull image即可完成TensorFlow Serving环境的安装和准备:
docker pull tensorflow/serving
启动该docker container后,也仅需一行命令就可启动模型的serving api:
tensorflow_model_server --port=8500 --rest_api_port=8501 \
--model_name=${MODEL_NAME} --model_base_path=${MODEL_BASE_PATH}/${MODEL_NAME}
(3) 要搭建一套完整的TensorFlow Serving服务并不是一件容易的事情,因为其中涉及到模型更新,整个docker container集群的维护和按需扩展等一系例工程问题;此外,TensorFlow Serving的性能问题也仍被业界诟病。但Tensorflow Serving的易用性和对复杂模型的支持仍使其是上线TensorFlow模型的第一选择。
5、microservices
(1)microservices 说穿了,其实就是web service (restful api),透过 http request (GET, POST) 来取得资讯(如下图所示)。 在python 里面,比较常见的web service会用 flask + gunicorn。
(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 的范例。