发展起源
爱奇艺除了在音视频、推荐等深度学习的AI应用以外,也有不少数据挖掘、数据分析的传统机器学习应用场景,例如用户预测、风控等。传统的研发模式的痛点,就是会给算法人员和业务人员一些不便利,具体如下:
用户代码基于单机脚本实现,处理环节长、耦合高,难以修改和扩展,长久以来可读性降低;
同一业务下多个场景、同一场景下多个模型,在数据处理、模型训练等技术流程上类似,场景重复步骤和数据结果难以重复利用;
场景不同导致存在周期训练、定时预估、实时预估等需求,对业务人员和算法人员的代码要求高,维护成本高;
算法人员和业务人员对分布式机器学习的开发存在技术壁垒,导致数据量和模型复杂度受单机资源限制;
基于以上痛点,爱奇艺开发了面向通用的机器学习场景的一站式机器学习平台 Deepthought,可实现可视化交互,能更加直观便捷的搭建适合业务场景需要的架构,以及实时预估服务,是算法模型部署至实际业务的重要环节。
业务需求
Deepthought 在开发之初即考虑了以下基本业务需求:
核心算法基于分布式机器学习框架封装,以开源封装为主、自研实现为辅,满足快速上线基本算法需求;
对于机器学习和数据挖掘各个环节解耦,满足不同环节的输出结果可复用;
与大数据平台通天塔深度融合,利用通天塔管理的项目、数据、调度实现机器学习任务的在线、离线场景的执行;
减轻用户代码开发压力,通过可视化交互和配置方式,实现机器学习任务的编排,提升算法模型搭建效率。
总体架构与发展历史
Deepthought 至今已迭代到 3.0 版,具体详情如下:
Deepthought v1.0 版,面向具体业务的机器学习平台
属于反作弊业务使用的机器学习平台,主要将反作弊业务中的机器学习流程各个阶段解耦合,同时管理反作弊业务中的业务数据,例如黑名单、样本、特征管理。Deepthought v1 架构如下图所示。
Deepthought 基于 Spark ML/MLLib 封装了业务常用二分类模型,以及常用数据预处理过程,例如缺失值填充、归一化等。
Deepthought v1 更多工作在特征管理和数据配置中,更加偏向反作弊本身的业务。在 v1 对 Spark 的封装和流程解耦串式调度执行的方式在后续 Deepthought 版本中继承了下来。
Deepthoughtv2.0 版,面向通用业务的机器学习平台
在 v1.0 的经验基础上做了通用化改进,通过组件化替代配置化,实现了常见的机器学习需求,例如自动调参;继承了 v1 核心实现的思路,把机器学习通用流程保留下来,并借鉴业界成熟的用户体验方式,对整体系统进行重构。主要更新如下:
组件化管理和调度
所有数据处理和算法执行通过组件的方式管理和调度。算法的扩展除了核心逻辑和调度脚本外,所有组件信息和配置项都可通过后台配置管理完成,前端交互时动态渲染组件的所有配置信息。
算法扩充
在 v2 我们持续增加了多个机器学习算法,其中包括监督学习二分类、多分类、回归算法,非监督学习的聚类、图类算法,多种数据预处理算法以及多种算法评估和数据分析可视化组件,基本满足传统机器学习所有场景的需要。
可视化交互
每一个机器学习的步骤,以组件的方式管理和使用。用户通过对组件的拖拉拽方式的交互操作,能更加直观便捷的搭建适合业务场景需要的架构,可实现的业务场景也更加灵活开放。另外,前端也提供了一系列标注化的报表控件,系统即时读取的报表数据可动态渲染成可视化报表。
离线定时调度任务
与大数据平台通天塔权限打通,通过大数据平台通天塔读取 Deepthought 任务信息并进行调度,实现任务的定时预测的场景。
Deepthought v2 架构如下图所示。
Deepthoughtv3.0 版,支持实时预估服务
v3 在 v2 基础上进行了功能扩充,在 v3 中 Deepthought 支持了自动调参和实时预估服务,并且对超大规模数据和模型,支持参数服务器训练。
自动调参
v2 实现了自动调参的功能,可通过多种调参算法,对多个参数进行优化组合、并行训练,最终找出最优评估效果的参数组合和最优模型。通过自动执行重复性任务提高用户工作效率,使得用户更多关注问题,而不是模型。
已经实现的调参方式包括随机搜索、网格搜索、贝叶斯优化和进化算法。
实时预估
实时预估服务是算法模型部署至实际业务的重要环节,v3 已经实现了多个常用模型的实时预估功能,并支持 HTTP、RPC 两种协议。
实时预估服务通过 QAE 加载预估核心代码,并通过 Skywalker/Dubbo 发布 HTTP/RPC 服务,并通过 Hubble、Venus 接入日志监控。
核心代码通过初始化加载预处理模块,读取模型后,开始监听服务端口。为了最大化利用计算资源,降低预估时长,预测采用线程池+流水线方式,对单条请求多行数据拆分处理。
参数服务器
由于一些内在原因,在基于 Spark 的机器学习无法支撑百万级以上维度、亿级以上行数的超大规模数据训练。业界通过参数服务器解决了超大规模数据训练的问题。v3 集成了开源参数服务器,并在此基础上实现了部分常用模型的参数服务器版本。
Deepthought v3 架构如下图所示。
部分核心实现与封装
下文将对平台部分核心功能的实现和封装简要介绍。
Spark ML/MLLib 封装
Deepthought 中算法组件基于 spark 原生 ml/mllib 包进行封装和改进,在继承了其并行计算、通道流式处理等优点之外,还加入一系列提供用户易用性的功能,同时增加了一些原生包中不存在的算法。
例如 gbdt 编码算法。gbdt 作为一个应用广泛的机器学习基础算法,不仅可用在分类、回归上,还可以用在特征构造上。通过训练好的 gbdt 模型,可对原始数据进行离散化,最终输出为类似于 one-hot 的形式,从而将输出数据灌入 fm,lr 等模型进行进一步的训练使用。
在 Deepthought 中,通过将 ml 中 gbdt 存储功能优化,将每个树详情进行存储。在 gbdt 编码组件中,通过训练好的 gbdt 模型和树详情,重构多棵树并为每棵树叶子节点进行编码。最终将数据并行灌入所有的树,并将最后结果拼接,从而得到对应的编码结果。
Deepthought 在满足常用性的模型的基础,丰富更多的模型,可以让用户在业务模型的构建上有更多的选择,从而丰富了平台的功能性。
数据预处理
Deepthought 不仅仅是对 Spark ML/MLLib 做了封装,也有很多基于实际业务和平台化的开发。为了扩展和优化 Deepthought 的功能,Deepthought 增加了数据预处理组件以及训练组件中的标签自动转换功能。
用户可以通过在通过拖动不同的预处理组件,Deepthought 会根据其选择的组件生成满足用户需求的可使用数据,比如分层抽样、数据压缩、数据编码等。
为方便用户,deepthough 所有组件中都拥有标签自动转换功能,Deepthought 会对输入标签进行 map 映射,根据标签中各个标签个数分别映射为从 0 开始的转换标签,并将该 map 保存,从而使得预测组件保持一致,并且最终原样输出标签。
loss 实时输出原理
一个良好的可用的机器学习模型,需要经过算法工程师不断的调优、尝试;而模型的调优需要花费大量的时间和精力。
损失函数(loss function)在机器学习应用中,作为学习准则与优化问题相联系,即通过最小化损失函数求解和评估模型。而每一次迭代损失函数值的变化,预示着模型的与目标的距离变化。损失函数曲线及 loss 曲线,代表着模型训练的收敛速度,算法工程师可以通过曲线判别模型的损失函数、超参等设置是否合理,决定是否在中途停止模型训练,从而节约调优时间,提升模型训练效率。
Deepthought 平台算法组件是基于 spark 中 ml 和 mllib 两个库改进封装,而 loss 曲线输出功能在两个库中并未提供。Deepthought 为了使用户在训练时能同步查看 loss 曲线(类似于 tensorflow),基于 spark 消息通信和事件总线的方式,为算法组件增加 loss 值输出功能,从而实现了 loss 曲线的同步显示功能。
实时预估热加载改造
用户在线上使用模型实时预估的过程中,需要定期使用新训练的模型替换旧模型。在实时预估服务的早期版本中,预估服务代码在加载到 QAE 后,通过初始化一次性加载模型到内存里。
这就导致如果需要更新模型时,我们需要通过 kill QAE 实例,逐渐替换 QAE 达到新模型替换旧模型的效果。这种方式存在缺陷是:
用户对切换过程不可知,无法追踪某次响应具体是旧模型或新模型的预测结果;
由于 RPC 是长连接,KILL 一个 QAE 实例后会导致当前实例中的所有链接中断。过程虽然短暂,但仍然会造成一定的请求抖动。
通过对已有服务进行热加载改造,实现了模型热加载,并可支持同一 QAE 实例下多模型共享资源,以及支持用户显式选择指定版本访问服务。
剥离 HTTP 和 RPC 框架本身后,我们将通用服务封装成模型预测服务,提供预测通用预测接口和管理接口(加载模型和查看模型)。被加载的模型封装成对象,存放在全局对象池中。预测服务内提供模型路由功能,通过解析用户请求,检测用户是否显式访问指定模型和指定版本。如果用户不显式请求,路由器会指向对象池中的最新版本调用预估服务。
目前应用和后续工作
目前应用简介
目前 Deepthought 已被流量反作弊、用户行为分析、爱奇艺号、文学等多个团队使用。下文简要介绍目前已在 Deepthought 开展业务的一些典型场景。
流量反作弊业务
目前流量反作弊业务已全线使用 Deepthought 进行模型训练和离线预测。
通过 Deepthought 提供的一些数据挖掘工具,例如 kmeans 聚类和孤立森林异常检测,反作弊同学可分析出异常流量特征,通过图分析工具,挖掘出团伙特征。基于这些分析结果,通过大数据平台通天塔工作流手动或半自动引入到特征工程和标签库。
在具体模型引用上,反作弊常用二分类模型,例如 LR、GBDT 和 XGBoost,对特征数据分类。在实际应用中,通过大数据平台通天塔定期执行 Deepthought 任务,实现周期性模型更新和离线预测。通过 Deepthought 自动调参功能自动优化模型超参,模型实际准确率和召回率均超过 97%。
推荐业务
Deepthought 在推荐业务中也受到的广泛的应用和好评。
Deepthouht 平台致力于帮助推荐业务更加清晰明朗化了模型训练过程,使得推荐业务的小伙伴能够更加专注于模型的选择,业务的理解等方面。
推荐团队的同学可通过 Deepthought 平台提供的 gbdt 编码、sql 自定义、lr、协同过滤、fm 等算法组件,实现推荐模型的构建和训练。
在整个推荐业务中,Deepthought 专注于模型的训练,通过将大数据平台通天塔准备好的数据给入到 Deepthought 平台,用户通过拉取组件的形式,构建一系列数据预处理,数据拆分,模型训练、评估的流程,并在模型训练完备之后部署到线上,从而进行实时的预估附。当整套流程第一次构建完成之后,用户往后仅仅需要定时运行流程,实现模型的更新即可。
其中 gbdt 编码+fm 训练的组合模型,是使用频率最高的模型之一。推荐业务通过 gbdt 编码将连续型数据转换为离散型数据,在与已有离散型数据进行拼接,从而得到可用于 fm 模型训练的数据。
当模型训练完成,Deepthought 通过公众号和邮件的方式通知用户模型的准确率、召回等详情。当模型确认可用后,可通过 Deepthought 平台将模型进行实时部署,从而满足推荐业务的实时预测需求。
除此之外,为了解决推荐业务存在过多特征组合拼接的问题,Deepthought 提供了 feature extract udf 函数,用户可通过配置文件的方式,实现对原属数据的拼接、相加、计算 log 等原子操作。并且 Deepthought 算法组件中还提供 idMap 映射功能,使得对数据进行了编码或 map 映射的团队,依然可采用 Deepthought 平台。
总结与后续规划
Deepthought 对大量机器学习封装和平台化开发,使用户可通过简单配置和拖动方式完成机器学习操作,协助非算法业务同学能够轻松使用机器学习,同时规范使用,大大减轻用户在重复代码和算法、模型管理上的工作量。同时,与大数据平台通天塔深度合作,实现数据开发到模型训练、离线、在线预测全流程闭环,是大数据团队数据中台重要组成部分。
Deepthought 后续将继续提高操作的便利性,系统稳定性;并且会在在实时预估服务上扩展已有模型的支持;算法层面将继续逐步丰富模型类型,并尝试加入深度学习模型。
本文转载自公众号爱奇艺技术产品团队(ID:iQIYI-TP)。
原文链接:
评论