导读:随着京东零售搜索业务的快速发展,对数据的时效性要求越来越高,要求搜索模型有捕捉更实时信号的能力,在线学习体现了业务对模型时效性的追求,希望能根据在线系统反馈的数据实时得对模型进行调整,使得模型能快速反应环境的变化,提高在线预估的准确率。
目前传统模型的实时训练(如FTRL等)无法支持深度模型,这些模型预估的准确率较低,比较适合一些简单的场景;第二种是类似增量训练的一种方式,可支持深度模型预估,这种方式以尽可能短的周期进行模型训练和迭代上线,是一种类实时的更新方式;第三种是以实时更新方式更新模型的局部结构,可支持深度模型的预估,模型的一部分参数直接参与实时训练。
模型预估服务:在加载模型时,分为static部分和dynamic部分,static部分由离线数据训练得的到,主要学习user和doc的稠密特征表示,dynamic部分主要包含doc粒度的权重向量,这部分由实时的onlinelearning的任务进行流式更新;
Rank:主要包括一些排序策略,在排序后会实时落特征日志,将当时的特征写入特征数据流,作为后续实时样本的数据源(feature);
Flink样本拼接任务:将上面的feature和用户行为标签数据作为数据源,通过flink的union+timer数据模型关联成为流式样本数据;
OnlineLearning任务:负责消费上游生成的实时样本做训练,在训练得到新参数后更新PS。
这里我们介绍整个链路的迭代过程:
经过离线样本拼接之后生成离线样本表,然后在模型训练平台训练之后将模型推送至模型仓库,同时将离线训练的参数推送至ps,之后predictorload这个全量的离线模型;
经过实时样本拼接之后生成实时样本表,经过flink的onlinelearning组件将实时的embeding参数推入ps,将ps作为dynamicmodel的数据源;
预估服务predictor加载全量的模型文件和实时训练的参数,提供在线服务;
离线模型提供周/日级别的周期模型校正。
这里首先列举了一些常见的数据倾斜,比如说key的设计不合理、flink的shuffle方式选择有问题、任务反压、机器资源的问题等,这里我们着重介绍一下这个任务的一些数据倾斜问题。
样本拼接上线之后,任务运行稳定,但是某些subtask处理的数据量是一些数据量少的subtask的1.5倍,这种其实不算是严格意义上的数据倾斜,但是会造成资源的一定程度的浪费。利用flink中keygroup的概念,和maxParallelism大小相同,经过调整maxParallelism的大小,保证了每个subtask上面处理的数据量相同,解决数据倾斜问题。
采用flink的watermark和eventtime作为timecharacteristic来保证顺序是有序的,尽可能的贴近事件当时的发生场景;样本一旦出现延时,且超过了系统的最大配置,我们会认为该样本不可用,直接丢弃。
当我们使用flink的keyedstate的时候,采用异步更新的方式更新ps;当我们使用flink的operatorstate的时候,同步的方式更新ps。
支持样本比例的定制化,支持按照规则触发训练。
参数更新:首先我们将用离线的30天的数据训练出来的模型参数导入ps,之后flink的在线训练将实时更新参数,该ps直接服务于线上。目前在线和实时共用一套ps,为了之后的稳定性要求,我们之后会将实时和在线分开。
模型校准:为了确保模型的准确性,支持天/周粒度的完整模型更新进行校准。
Flink在实时数据处理方面有优秀的性能、容灾、吞吐等表现、算子丰富易上手使用、自然支持批流一体化,且已有不少机器学习框架陆续开源。随着机器学习数据规模的扩大和对数据时效性、模型时效性要求的提升,在线学习不仅仅作为离线模型训练的补充,更成为模型系统效率发展的趋势。