推荐系统之线上Serving
Posted 比尔的新世界
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐系统之线上Serving相关的知识,希望对你有一定的参考价值。
背景
推荐模型的线上Serving指利用训练好的模型对待推荐内容进行个性化打分服务。如果将模型训练看成求解一个非常复杂的方程的近似解的过程,那么训练好的模型参数就是这个复杂方程的近似解,即方程的系数,模型预估就是利用这些求解得到的方程系数对新的未知数进行计算得到结果。可以看出,预估模型的业务逻辑并不复杂,但是在大规模工业推荐系统中,怎么实现一个高可用的通用预估框架绝对是一个难度不小的工程挑战。本文跟大家讨论一下工业界典型的推荐预估框架及其工程实现难点。
典型推荐结构
典型的推荐系统如下图所示,用户请求到达APP后端,APP后端调用推荐引擎代理。如果推荐引擎异常,则返回简单推荐结果,简单推荐一般就是热门推荐,按照内容热度排序后选择TopK推荐给用户,没有个性化。推荐引擎正常工作时会依次调用召回、粗排、精排、重排等服务,最后选择TopK内容推荐给用户。图中红色虚线框圈出的就是本文要讲的推荐预估模块。
预估工作流程
以新闻资讯APP大规模离散DNN推荐模型为例,预估工作流程一般如下:
根据请求的UserID和待排序的DocID请求特征服务,拿到相关的用户特征和文章特征,并从请求当中解析得到Context特征
根据用户特征、文章特征和Context特征计算得到一些交叉特征、Session特征和MatchMiss特征
根据上述特征值请求参数服务,取到特征值对应的参数,并将特征写入Kafka,用于后续模型的训练
将参数输入到模型,计算得到每一篇文章的预估分
步骤2当中得到的原始特征一般会通过Hash签名将每一个特征值映射为一个唯一的FeatureID,这是大规模离散化特征的常规操作
步骤3当中通过FeatureID到参数服务器中查找得到对应的Embedding参数值,这些embedding值在模型训练阶段得到并保存
步骤4当中的模型指的是DNN模型的NN部分,一般会通过维护一个大小为2的模型池提前读取并持续更新,等到模型的输入Embedding到位后就可以进行前向传播计算得到所有文章的预估结果。
其它预估架构
参考文末链接“如何解决推荐系统工程难题——深度学习推荐模型线上serving”[1]一文,主流的预估方法有以下几种:
自研平台
预训练Embedding+轻量级模型
PMML等模型序列化和解析工具
TensorFlow serving等平台原生model serving工具
上面介绍的预估方法属于方法2,即预训练的Embedding+轻量级模型。Embedding通过KV系统进行部署,轻量NN模型的获取(InferLib)也有多种实现方式,了解和使用过的方式有如下几种:
自研实现DNN网络的各种算子,通过读取训练好的NN参数和配置文件恢复NN网络
如果训练框架可以提供方便的前向传播计算接口,那就可以直接打包训练代码,作为预估框架的一个子模块提供NN预估接口。
如果NN的训练为TF的话(一般为python),可以在预估框架当中使用Tensorflow的C++ API进行模型导入。
方法一在最开始尝试DNN模型时使用过,Inferlib通过C++实现前向传播计算,可以通过配置化的方式重构NN网络,缺点是只能支持较为简单的NN网络且不够灵活。这个时候的训练框架为PSlib+TF,开始基于CPU集群进行训练,后来升级到单机多卡GPU的训练方式。
方法二在训练框架升级为基于MPI集群的大规模离散DNN模型后开始使用,这个时候的KV服务也变得更加的完善和可靠。
方法三在训练框架进一步升级后开始使用,这个时候我们的预估框架也做了同步升级。这个阶段的预估框架实现了功能算子化,极大提高了功能复用度,简化了特征抽取流程,封装了特征抽取框架,同时支持明文特征Dump,支持了集团各个业务线的预估服务。说到特征抽取框架,后面有机会再跟大家分享具体的实现方法论。
推荐预估的工程难点
推荐预估工程实现时常见的问题有:
请求响应耗时增加,一般的优化点有使用缓存技术、矩阵计算加速、请求拆分进行并行处理、增加机器等。
训练和预估的一致性问题,这个在复用训练代码的预估接口、封装特征抽取框架后也基本不成问题了。
NN更新时预估错误率和耗时突增,维护一个模型池,候选模型持续探测更新模型并替换老模型。
两个问题:
还有使用过或者了解过哪些推荐预估解决方案?
还有哪些比较典型的推荐预估工程优化问题?
欢迎大家留言讨论或者扫码交流:
参考
[1] https://zhuanlan.zhihu.com/p/77664408
[2] https://medium.com/analytics-vidhya/deploying-tensorflow-2-1-as-c-c-executable-1d090845055c
以上是关于推荐系统之线上Serving的主要内容,如果未能解决你的问题,请参考以下文章
使用 ScaNN 进行高效检索以进行检索 7使用 TensorFlow 构建推荐系统 Efficient serving with ScaNN for retrieval