百度技术 | 千亿级模型在离线一致性保障方案详解
导读:在模型的全链路测试过程中,模型的问题统一定义成广义一致性性问题,一致性问题也是模型稳定性的基础保障,落地到具体点上从维度上划分可以分为数据不一致、延时不一致、策略机制不一致、性能不一致等几个方向,在后果衍生上都会导致模型稳定性指标抖动,预估效果不符合预期,所以一致性测试在当前大规模机器学习的测试过程中有着非常重要的作用,但是在通常对于模型的测试方案也很难做到全局解决,其中也牵扯到效果和效率的折中。文章在一致性几个方面要做到核心节点的策略和效果重点保障,最大限度保障停更和回滚的发生,当前一致性方案在百度商业内部落地收益较好,在效果和效率上也做了很多的优化策略,整体方案满足业务线的需求。
全文6948字,预计阅读时间 12分钟。
一、背景与概述
点击率模型在广告检索阶段预估广告可能被点击的概率,在广告的排序、截断中起着重要的作用。
点击率模型分为在线预估和离线训练两部分,离线训练主要进行模型的训练和评估,在线预估主要是模型的应用和反馈。具体的在离线模型闭环链路如图1所示,线上点击和展现的广告数据到视图日志,经过反作弊系统和流式特征抽取后得到样本作用于模型训练,训练好的模型经过评估后应用到线上进行广告粗选和精选阶段点击率的预估, 预估的点击率q值又作用于广告的排序、截断,进而形成完整的处理链路。
△图1:在离线模型闭环
但因为系统的复杂性包括特征工程、训练损失、存储精度损失等,导致在策略迭代中经常出现在、离线模型作用效果不一致,例如新增加的策略在离线训练阶段得到模型,该模型在评估数据中表现优异,但是在线上系统中的广告效果指标如点击率,千次点击展现值等方面不尽人意。
如图2所示,广告在线上预估需要经历:预估样本 → 线上特征集 → 离散embedding向量查询 → 离散 embedding 向量聚合 → dnn 网络计算 → 预估Q值, 而在线下训练的时候也需要经历:训练样本 → 线下特征集 → 离散模型查询 → embedding 向量聚合 → dnn 网络计算 → Q/模型。在q值计算的任何一个过程中出现差异,就会造成预估结果和模型训练的结果不匹配,影响模型的线上效果,进而影响广告的效果指标。
△图2:模型在离线完整处理流程
二、一致性保障的定义与目标
2.1 一致性问题的定义
机器学习可以按照是否有标记划分为监督学习/非监督学习,广告的点击率预估问题属于监督学习中的排序问题,这也是互联网中常见的一类学习业务。分类学习迭代过程的基本步骤如下图,每个方框表示一种数据形态,图例中给出了每个字面代表的含义,其下标表征了数据的上游来源及版本。
△图3:分类学习机制
步骤1展示了训练过程:训练集经过特征抽取和训练过程产出了模型,在步骤2的评估阶段使用训练产出的模型,并输入未进入训练集的样本进行预估,从而评估该模型的效果。当评估的模型指标符合预期时,便会将该模型应用于进行线上的预估(步骤3),预估后的值又应用于具体的问题(步骤4),而应用后又会产生新的训练集,回到步骤1。
模型的不一致问题可能出现在2.1介绍的分类学习迭代过程中离线训练、离线模型评估、在线预估、特征抽取、预估应用的任何一个处理步骤中,概括起来主要包括数据一致性和处理逻辑一致性两方面。
数据一致性包括样本一致性和模型一致性,这里所说的样本一致是逻辑上的,不是说训练、评估、预估使用完全相同的样本数据,而是指相同的输入数据集在经过这几个阶段处理后的值一致;模型的一致性是指离线训练后产出的模型和线上预估使用的模型转换精度在预期范围内,这块的一致也是指逻辑上的,因为离线训练后的模型到预估系统的加载会经过离线离散模型 → 中间态压缩数据 → 线上加载的离散模型这三种状态,经过部分特征的过滤和精度的转换,会存在预期内的损失。
如下图4所示:
△图4:数据一致性
保持数据一致后,处理逻辑一致同样重要。如图5圈出的部分,逻辑一致包括步骤1-3中特征抽取的逻辑一致以及产出的模型在评估、预估的使用逻辑匹配。
△图5:逻辑一致性
特征抽取的逻辑一致是指相同的输入数据经过特征抽取库后,产出的特征签名一致。而产出模型的预估、评估逻辑一致主要是通过保证模型使用逻辑一致进而保证模型效果。分类学习中一般的假设函数为:
其中y是学习的目标输出,x是特征向量,w是特征的权重向量,H是特征和目标值之间的计算函数,不同的业务模型就是对应不同的H求解的过程。而模型的训练过程就是已知y和x,最小化误差函数获取得到w 的过程。评估和预估都可以看做是已知输入x、模型w求解计算y的过程,因此保证计算逻辑一致是确保模型应用效果的重要措施。
值得一提的是,数据一致性和逻辑一致性也是互相影响的。任一阶段的处理逻辑不同,会导致下一阶段的输入数据不同;处理逻辑匹配,输入数据不同最终输入的q值也不一致。因此,保障模型数据和逻辑处理的一致性是保障模型健康迭代的关键步骤。
2.2 一致性问题的目标
根据一致性问题的定义,可以确定一致性工作开展的3个目标:
- 验证不一致是否存在,用于判断当前模型系统的迭代更新是否健康;
- 定位不一致产生的原因, 试图解决不一致问题的关键步骤;
- 评估不一致对系统所产生的影响,评估不一致问题修复的成本和取得收益的依据。
如何针对上述的目标进行一一验证呢?可以采用补充校验流的方式。
如下图6所示,当P1预估集预测出的Qp1作用于策略,产生新的训练集T2 后,我们可以使用T2 来代替评估步骤中的E1,作为补充流的输入:
△图6:补充校验流
预估过程可代表在线下同的数据和逻辑流,附加的校验流可以代表离线系统的数据和逻辑流,并且,由于统一了预估和校验的输入(T2理论是P1的子集,P1是全部预估结果,T2是展现点击之后的数据)。将目标验证和实际的处理阶段对应起来,模型一致性问题的验证内容转化为:
- 在离线样本T2和P1的内容是否一致;
- 在离线样本的特征抽取结果Fp1和Ft2是否一致;
- 在离线样本使用的模型Mp1和Mt2是否一致;
- 在离线样本加载相同模型最终预估输出的结果Qp1和Qt2是否一致。
三、技术方案
3.1 全链路一致性方案
点击率q的计算分为多个步骤,以其中一个q为例,其处理步骤如下图7所示,主要包括参数解析、特征抽取、离散embedding向量查询、dnn网络计算、隐层信息写入、结果填充等多个操作算子,不同的操作算子之间串行执行,后一个算子的执行依赖于前一个算子的输出。
△图7:预估处理步骤
我们考虑预估所经历的整个过程,采用归一变量、逐步替换的方式覆盖预估的每个环节,来对比是否有不一致,以及寻找不一致出现的位置和原因,由于离散模型数据的量级在TB级别,直接对比数据diff的方式不可行,我们也通过对比输出q值的方式来间接评估使用的模型是否一致。首先对下图8中每个部分的具体含义进行解释:
- online_fea线:上特征抽取后输入预估的样本;
- offline_ins:用于训练的离线样本;
- offline_table:离线训练后存储的离散模型,存储不同特征对应的历史点展向量;
- mid_compress:离散大模型根据特定的阈值过滤掉部分特征之后的数据,训练之后和s离散大模型存储在相同路径下;
- online_table:线上预估实际用到的离散模型,由mid_pb经压缩脚本过滤后加载到线上;
- cvm_fea:查询完大模型聚合后的网络输入数据;
- online_calc_dnn:线上加载小模型进行dnn 计算;
- offline_calc_dnn:离线训练加载模型进行dnn 前向计算。
△图8:计算与验证流
考虑特征抽取、大模型查询、Dnn计算这三大部分,总共计算和验证5条流。
第一条流是原始在线预估所得到的原始 q1 ,第二条流输入数据是和线上预估阶段所对应的离线样本,加载在线预估时离线对应的大、小模型,计算得到 q2 ,第三条流输入线上预估的离散特征,加载和线上预估时离线对应的大、小模型,计算得到 q3 ,第四条流输入预估的离散特征,加载由 mid_pb 转换成的离散大模型计算得到 q4 ,第五条流数输入在线预估聚合后的网络输入数据,加载线上预估时的小模型,计算得到 q5 。
q2 和 q3 的对比保证特征抽取的逻辑和输出数据一致,q3 → q4 → q5 对比保证计算使用的离散模型一致;q5 和 q1 对比保证dnn计算一致。分别对比 q1 → q5 可以分析得到在、离线系统是否存在不一致以及不一致出现的位置。
关键问题1:是否存在不一致
如果 q1 和 q2 对比存在diff 且diff 不在预期范围内,则说明模型在、离线存在diff, 这是因为 q1 和 q2 的输入是相同时间段进行拼接对应确定的样本,输入相同但是最终输出的q值不同,说明模型在、离线预估确实存在diff。需要评估的是diff量是否在接受范围内,若无法容忍当前diff所造成的较差的线上效果,需要进一步分析与确定 diff产生的位置和原因。
关键问题2:不一致产生的位置
对输出的 q 值逐步进行对比,可以判定不一致产生的位置,如下图9所示。
△图9:q值对比流程
- q2 和 q3不一致:q2 和 q3 只有输入的ins不一致,输出不一致表示在离线特征抽取的结果不一致;
- q3 和 q4不一致:q3 和 q4 的输入相同,只是在查询大模型时一个用原始的offline table,一个用mid_pb转换后的offline table,输出不一致说明offline table和mid pb的转换存在问题;
- q4 和 q5不一致:q4 和 q5 的输入相同,大模型分别采用mid_pb和online table,输出不一致表明mid_pb和 online table之间的转换存在问题;
- q5 和 q1不一致:q5 和 q1 是输入、查询大模型以及聚合后网络输入数据一致,DNN网络计算一个采用在线,一个采用离线,输出不一致表示模型的在、离线DNN计算存在diff。
3.2 关键步骤
3.2.1 在线数据获取
在线数据的获取需要从预估模块中采集,即同步线上的预估模块到测试环境,复制线上流量,打开debug开关,导出预估步骤中所有的数据,包括特征抽取结果、聚合后的网络输入数据、真是预估后的q值等。而通常预估模块都是采用多线程处理预估请求,典型的debug日志打印形式如下图10所示:
△图10:debug 日志形式
图9中A-E是不同信息下样本的序号,可以看出debug日志的特点为:
1)多线程间交替打印;
2)每个线程内有序打印;
- 样本的完整信息跨行;
4)完整的样本处理信息可能跨文件,而能够对比的日志是顺序排列的。
因此,在替换和计算前需要对在线采集的debug日志进行解析和格式化,由于待处理的日志数据量很大,单机执行耗时很长,可以采取边引流、边解析的实时处理策略,如下图11所示,提升数据的处理效率。
△图11:debug日志处理
3.2.2 在离线数据拼接
获取得到在线数据后,需要找到相同时间段所对应的样本数据,在离线数据集合的关系如下图12所示。
△图12:在离线数据集合关系
对于预估的请求样本,在样本阶段会有一部分被策略过滤掉,而训练样本中也可能存在一些样本未经过在线预估,因此在离线对比有效的数据是两者的合集,需要进行拼接。因离线数据用于训练,为了方便查询和存储,一般采用一个字段唯一标识样本行号, 但是在线部分中并不存在,因此无法通过该字段进行拼接,需要寻找其他字段进行拼接,拼接的字段称为“主键”,而对于主键的选择,需要遵循如下原则:
1)在离线样本中都包含;
2)能够唯一标识一条样本;
3)自身产生不一致的可能性比较小;
4)通常选取id类而非文本类,选取了合适的“主键”后可以唯一的确定在、离线对应的样本,该样本是整体q对比和计算的原始输入,需要保证数据和处理逻辑一致,否则后续预估中的所有阶段的验证都会失效。
3.2.3 离线预估输出
如2.1介绍,训练的过程就是已知输入x和输出y,求解参数w的过程,深度神经网络在训练时,输入x经过模型参数计算得到网络的输出,网络输出与实际y计算得到误差,计算误差关于模型参数的梯度,反向传播不断更新模型参数,最终使得系统误差最小。Dnn网络的结构如下图所示,是一个四层的dnn网络:一层input,一层output,一层归一化层,中间一层隐层。整体结构如下图13所示:
△图13:dnn 网络结构
模型训练非阶段进行,分别更新dnn网络参数和离散特征信息。离线训练中要想输出和在线预估逻辑一致的q值,需要开启test模式,即只进行网络的前向传播不进行梯度的回传。同时为了得到最终的q值,需要对dnn网络的输出经过sigmoid函数之后的结果进行打印输出,如下图14所示。
△图14 dnn 网络输出
3.2.4 q对比与结果展示
从模型全流程分析,测试报告需要展示多角度Q值,都需要涵盖统计角度和详情角度。统计角度分析显示了数据的整体分布和变化,更好地体现了一致性目标中的验证有无问题和问题的严重性;详情角度分析则是展示更多的diff线索,更好地协助排查diff的来源。
- Q值diff统计报告
- 按不同精度区间统计的在离线Q值diff绝对值及比例(衡量diff范围);
- Q分布图(直观展示Q分布偏移情况);
- Q值diff详情
- 该样本各阶段Q值;
- 该样本拼接主键(方便人工进一步排查)
3.3 完整实现(整体串联,提测,使用)
3.3.1 串联执行
根据3.2所描述的关键步骤,将模型端到端一致性的执行划分成六个阶段:
1)引流阶段:获取与部署线上预估用的环境,将流量实时引到环境中,开启debug日志,获取预估中各阶段的中间处理结果,包括线上特征、聚合后的网络输入等信息;
2)日志格式化:将引流阶段的debug日志进行解析和格式化,即按照线程id将一条ins 的完整处理过程切分成不同的子文件日志;
3)日志拼接:根据选取的主key,将在线预估模块的引流日志和引流对应时间段离线ins进行拼接和过滤,唯一确定在离线互相对应的ins,用于后续阶段的q值计算;
4)online解析:从在线debug日志中,根据主key解析得到特定ins聚合后的网络输入数据;
5)q值替换与计算:根据全链路一致性的设计方案,覆盖q值预估中特征抽取、大模型查询、dnn计算的每个过程,计算得到q2到q5;
- 报告展示:将步骤1-5中计算得到q1-q5进行展示,比较q值之间的差异,将diff原因定位与细化到特征,大模型与转换或网络计算阶段。
每个阶段具体的实现方式如下图15所示:
△图15:端到端一致性完整执行步骤
3.3.2 任务提测
将上述的处理过程进行平台化,支持自助任务提测和任务查看,并根据提测的参数,进行引流获取线上q值、ins、离散向量等信息,用来替换离线训练的ins/离散模型/dnn计算等逻辑去计算q值并产出最终的报告。
提测页面需要填入的参数如下,主要用于输入数据处理和q值计算,如下图16所示:
△图16:提测输入参数
为了提升处理和排查效率,我们将每个步骤的耦合进行拆分,根据排查需求选择性的执行任务的特定步骤,如下图17所示。当完全新增一个问题排查时,需要执行完整的步骤,包括引流/日志切分 → 日志格式化 → 日志拼接 → online解析 → 替换预估q值 → q值计算 → q分布报告 → 日志对比 → 特征一致性报告 → 完整报告。
若当前已经存在引流日志,则可以跳过线上引流直接进行后续的2-10步骤;若引流日志已经进行格式化,则可以跳过线上引流和日志格式化,依次类推。
值得说明的是:由于在离线ins是整体排查的原始输入且产生diff的可能性比较大,总是默认产出特征一致性报告,如果分析了q值分布报告后,发现特征完全一致或在预期范围内,可以设定不产出特征一致性报告, 提升任务执行效率。
△图17:任务执行设定与划分
3.3.3 任务查看与报告示例
当前存在两种查看任务的形式:
- 页面查看方式:针对执行流程的每一个阶段,可根据提测时间和提测人查询到任务在每个阶段的运行状态,默认状态是Pending,若失败则对应的任务阶段会变为Failed,执行成功状态会变成Succeed。
- 报告接收方式:针对端到端一致性的每个阶段,均添加了任务失败给任务负责人和提测者发邮件的功能,若没有查到则是任务还在运行或者运行成功。邮件中针对失败的可能原因进行了罗列,并标出了任务失败对应的接口人,若自排查遇到问题,可单hi邮件中标明的接口人帮助排查。
产出的报告范例如下图18所示,包含q精度diff和q值分布,可以根据不同阶段对比得到diff位置等。
△图18:端到端一致性报告示例
四、效果与后续
- 使用相同的在线预估和离线训练架构的q均可支持排查,拓展性强,当前能支持pc相关的点击率q;
- 迭代较多的q排查支持平台化执行,策略效果不符合预期时可在平台上自助提测与排查;端到端一致性工具目前已支持多个模型策略效果不符合预期的问题排查,发现包括特征不一致、网络结构未对齐等多个不一致问题,并推动解决与修复。