背景
在互联网公司做算法工程师,一般的工作流程是1.hadoop跑数据做线下调研,2 调研结果出来后,跟线上效果做对比,3 线下调研结果OK 将模型上线。一般来讲,训练数据都具有时效性,模型需要常常更新才能在线上获得稳定的效果,于是在模型上线后搭建一个自动化更新模型的pipeline就变得非常重要了。
pipeline的一般搭建流程如图一所示:
图一:pipeline一般流程
首先是日志挖掘,从线上日志利用hadoop挖掘原始数据;其次是从原始数据中清洗并且提取特征(可能这里还需要对数据进行采样,变换数据分布);然后是重新自动训练一个新的模型,在测试集上自动评估后,以词典的方式上线。(深度学习的模型参数值保存为pb文件,可以通过上线词典的形式更新模型)。我将整体的pipeline 流程分为三段:
a.数据集生成,hadoop 日志挖掘与清洗
b.模型生成,模型自动训练
c.词典上线,评估结果并自动上线
数据集生成,hadoop 日志挖掘与清洗
在数据集生成阶段,其实可以分为三段: 1 日志挖掘原始数据;2 数据清洗与特征变换;3 数据抽样变换分布,用一个主shell处理数据集生成。
1 在这里每一个子任务都应该由一个shell脚本处理,在每一个子任务里都应该打印重要的参数信息,例如输入和输出以及其他的重要参数,方便脚本出错debug调试。每一个子任务都可能有很多需要控制的参数,这些参数不应该分开写在每个shell里,应该写在主shell里统一控制。
2 一个自动化的pipeline应该是全程自行的,不需要我们去管他。只有当遇到错误发生的时候需要提醒我们去处理。所以在每一个子shell里应当编写if语句 发送邮件通知。
if [ $? -ne 0 ];then
echo "dst M/R Job fails" | mail -s "check the hadoop shell" 邮箱名
exit 1
fi
3 有的数据清洗与特征变换任务可以在hadoop上直接完成,有的可能由于一些特征原因需要在本地完成,这点需要工程师自行决定怎么才是最优选择。
4 对于数据抽样变换分布,我一般用蓄水池抽样,根据不同的分类,等概率抽取每个类别的样本数据
网友评论