作者:byronhe,腾讯 WXG 开发工程师
一、问题背景
随着深度学习的广泛应用,在搜索引擎/推荐系统/机器视觉等业务系统中,越来越多的深度学习模型部署到线上服务。
机器学习模型在离线训练时,一般要将输入的数据做特征工程预处理,再输入模型在 TensorFlow PyTorch 等框架上做训练。
1.常见的特征工程逻辑
常见的特征工程逻辑有:
分箱/分桶 离散化
log/exp 对数/幂等 math numpy 常见数学运算
特征缩放/归一化/截断
交叉特征生成
分词匹配程度计算
字符串分隔匹配判断 tong
缺省值填充等
数据平滑
onehot 编码,hash 编码等
这些特征工程代码,当然一般使用深度学习最主要的语言 python 实现。
二、业务痛点
离线训练完成,模型上线部署后,同样要用 C++ 重新实现 这些 python 的特征工程逻辑代码。
我们发现,“用 C++ 重新实现” 这个步骤,给实际业务带来了大量的问题:
繁琐,费时费力,极容易出现 python 和 C++ 代码不一致
不一致会直接影响模型在线上的效果,导致大盘业务指标不如预期,产生各种 bad case
不一致难以发现,无法测试,无法监控,经常要靠用户投诉反馈,甚至大盘数据异常才能发现
1. 业界方案
针对这些问题,我调研了这些业界方案:
《推荐系统中模型训练及使用流程的标准化》
https://www.infoq.cn/article/2E6LCqb1GeqFRAjkkjX3
《自主研发、不断总结经验,美团搜索推荐机器学习平台》
https://cloud.tencent.com/developer/article/1357309
《京东电商推荐系统实践》
https://www.infoq.cn/article/1OkKmb_gEYNR3YqC9RcW
“模型线上线下一致性问题对于模型效果非常重要,我们使用特征日志来实时记录特征,保证特征的一致性。这样离线处理的时候会把实时的用户反馈,和特征日志做一个结合生成训练样本,然后更新到模型训练平台上,平台更新之后在推送到线上,这样整个排序形成了一个闭环。”
总结起来,有几种思路:
在线特征存储起来给离线用
在线 C++ 代码编译成 so 导出给离线用
根据一份配置生成离线和在线代码
提取公共代码,加强代码复用,等软件工程手段,减少不一致
2. 自动翻译方案
(1) .已有方案的缺点
但这些思路都有各种缺点:
所有在线请求的所有特征,这个存储量数据量很大
算法改代码需要等待后台开发,降低了算法同学的工作效率
特征处理代码的复杂度转移到配置文件中,不一定能充分表达,而且配置格式增加学习成本
就这边真实离线特征处理代码来看,大部分代码都无法抽取出公共代码做复用。