如今,大多数互联网公司都有自己的机器学习平台,虽然名字和承载的业务不完全相同,但就平台要解决的问题和技术选型来说大同小异。在ArchSummit全球架构师峰会(北京站)的现场,InfoQ有幸采访了vivo AI研究院的资深算法工程师鲁文龙,详细了解vivo在机器学习平台方面的实践。
起初,vivo也是采用类似“作坊式”的团队模式,每个团队针对各自要解决的问题进行规划,由此产生了一种小作坊式的生产局面。随着应用规模逐渐增大,这种模式的局限就暴露出来了。鲁文龙表示,这种模式下的机器学习项目会出现如下问题:
1、特征与样本层面,添加新特征流程较长,且不同业务间特征无法共用;特征与样本的处理和存储系统性能与稳定性不佳。
2、训练与调参层面,在大业务量场景下,深度学习模型分布式训练有一定门槛;线上效果不佳时,缺乏一套分析定位问题的方法论。
3、CPU与GPU线上推理层面,驾驭CPU尤其是GPU的深度学习模型的高性能推理门槛较高;离线调参与线上工程开发速度不匹配,影响整体迭代效率。
4、缺乏端到端的系统支撑,每个业务都重复做一套烟囱系统,可维护性差;缺乏技术沉淀,团队间协作效率低,整体产出会受影响。
举例来说,鲁文龙所在团队起初主要负责广告系统的机器学习项目研发,当时经常遇到的一个问题就是离线训·练和在线推理结果不一致。为了保证性能,线上通常会用Java/C++ 来写一套程序,离线通常会基于Spark、Flink这样的大数据工具套件来开发,离线和在线的工程师团队也是不同的,如此种种造成了出现问题很难定位与修复。为了解决上述这些痛点,团队决定研发一套统一的机器学习平台来支撑各项目快速迭代。
vivo机器学习平台实践
经过讨论,vivo将机器学习平台定位在解决公共的工程性难点和痛点,比如特征工程、模型训练、模型推理和资源调度方面的问题,不需要每个团队都重新学习部署一套K8s等基础设施平台,降低算法工程师的使用门槛,从而提高业务迭代效率。
对于AI研究院的各业务场景的工程师来讲,平台提供了开发调试、高效调参、模型部署、效果监控等能力,降低上线门槛,提高迭代效率。在平台内部,由四个部分组成。
1.特征工程系统:在规范特征格式、标准化数据流、统一存储与管理的前提下,以特征处理引擎为基础,构建更灵活增删特征、共享特征的系统; 2.模型训练:在深度定制的框架与计算组件的基础上,如Tensorflow、Horovod等,通过大规模分布式训练引擎提供了使用简单、功能强大的训练能力; 3.模型推理:在深度定制的推理框架与计算组件基础上,如TensorRT、OpenVINO、TF Serving等,提供CPU和GPU极致的高性能推理能力; 4.资源调度: 通过K8s来管理与调度CPU集群和GPU集群,规模2000+CPU机器,1000+GPU卡,来支撑大规模的模型训练任务与推理服务。
鲁文龙表示,第一阶段主要以SDK的形式将在特征、训练和推理上构建的能力嵌入到业务中,推动业务方使用。经过大半年的努力,机器学习平台已经在众多业务中落地。接下来,团队的更多精力将聚焦在打通端到端的能力,通过平台门户提供更优的产品体验给工程师。
在构建机器学习平台的过程中,vivo也探索出一些亮点性工作。鉴于资源调度部分,几个月前已经通过文章介绍过了(《Kube-batch 在 vivo AI 计算平台的应用》),接下来就介绍下其他三部分的亮点工作。
特征工程系统是由统一特征服务和样本生产服务组成,提供机器学习算法落地所需要的数据服务。它解决了特征生产效率,特征样本监控,特征处理一致性和数据一致性等问题;降低数据开发的入门难度,减少新业务上线成本,提高算法迭代上线效率。
vivo机器学习平台数据流示意图
前文提到的离线训练与线上推理结果不一致的问题,主要是两方面原因造成的:其一是离线和线上两套流程逻辑可能存在不一致;其二是时间上的延时,离线训练通常是在曝光时生成的样本,而线上推理则是在请求时。对于前者,vivo团队基于一套基础的特征处理标准,通过配置化将两套流程统一起来使得问题完美解决。对于后者,平台根据特征变化程度进行分级,分别在请求、请求回传(排序胜出后)、曝光回传 三个环节拼接不同的特征,这样在保证一致性的同时,大大减少了存储和宽带成本。除了这些方法外,鲁文龙团队还构建了验证一致性的系统方法。如此,这个问题就彻底解决了。
训练引擎以SDK的形式供业务方使用,用户只需配置特征格式和模型超参,即可使用。各种训练技巧即刻获得,包括极致的训练性能、分布式训练、分布式验证、增量训练、实时训练等。同时,也支持各种形式的定制,以满足各业务方的需求。
鲁文龙表示希望通过机器学习平台解决大规模分布式训练推理方面的工程性难题,其他团队只需要复用这些经验即可,精力更多地聚焦在业务效果指标的提升上,这样可以提升整个大团队的产出效率。
具体来说,vivo机器学习平台团队在训练方面,主要优化了训练速度和模型对样本响应速度。
在训练速度提升方面,鲁文龙表示,vivo主要做了单机训练性能提升、同步更新的分布式训练和分布式验证三方面工作。在单机训练性能提升方面,通过增大了batch size,即增大密集计算的workload,将CPU和GPU的利用率从30%提升至90% ;同时适当调整学习率策略,参考linear scaling rule,收敛速度提升了10倍之多。
在同步更新的分布式训练方面,vivo基于horovod实现分布式训练,采用ring allreduce的方式进行通信;深度定制Horovod优化了高维稀疏特征梯度的交换效率。
在原生Horovod实现中,Rank0验证时,其他worker都在等待,造成计算资源浪费。优化后,验证计算量由所有worker一起承担,每个worker计算完后,将指标汇总归并。 这样大大提高了计算资源的利用率,同时也提升了训练速度。
Horovod框架的稀疏特征梯度交换量的分析
在提升响应速度层面,vivo尝试了增量训练和实时训练。鲁文龙表示,全量样本训练耗费太多计算资源与时间,增量训练可以提高训练的响应速度,效果更佳,同时也减少了资源的使用。要想实现实时训练,使得最新样本的分布尽快反应到模型中,就要去掉验证集;但训练任务的停止条件是通过验证集上early stop方式控制的,所以去掉验证集的话,就要寻找新的、稳定的、有效的停止条件;vivo的方案是利用有验证集的训练任务得到训练集上的指标来指导无验证集的训练任务何时停止(如下图)。
实时训练方案的示意图
通过构建高性能推理引擎来支撑AI研究院所有推理加速的需求,鲁文龙表示,对于业务使用方来讲,接入方式有两种:
高性能推理引擎架构图
在引擎内部,基于CPU和GPU的开源高性能计算库和推理服务器,根据具体业务的特点,一般会采取:
具体的,在性能优化方面,vivo优化工作主要集中在图优化和算子优化上。图优化方面主要是:
算子优化方面,vivo也针对CPU和GPU的硬件特性做了一些软件层面的定制优化工作。CPU的算子优化:
经过一年多的探索与实践, 鲁文龙团队在稀疏DCN模型、通用OCR模型、BERT模型等相关技术的应用场景中,都得到了10倍左右的推理加速,为vivo节省了数千万机器成本。
对于同样希望建设机器学习平台的企业而言,鲁文龙也提出了自己的建议。他表示,机器学习平台研发团队内部最好有做过业务的人,要懂用户(也就是业务方)的需求,不然很难抓住用户痛点,向业务推广时也不好落地。
从技术发展来看,鲁文龙表示,目前业界都在尝试深度学习,并且模型的复杂度越来越高,vivo也继续在这方面探索高效的分布式训练和极致性能的推理能力,争取在众多业务上都获得不错的收益。扩展到人工智能领域,他补充道,比较值得期待的是大规模落地的业务场景上的突破,搜索推荐这些互联网常见的场景自不必谈,但目前语音或视觉等技术落地的大规模业务场景还不是特别多,跟移动互联网比起来。他认为,当众多业务场景大规模落地后,技术的商业价值凸显出来,随之而来的算法、算力等各个方面的突破才能形成持续的价值闭环。
采访嘉宾:
鲁文龙,vivo资深算法工程师,目前在vivo AI研究院,在广告的机器学习项目中,引入了深度学习与大规模分布式训练技术,使得广告收入实现了大幅的增长。为了支持 AI 研究院各种各样的机器学习项目,从零到一打造端到端的一站式机器学习平台,降低机器学习技术的落地门槛,大大提升了项目的迭代效率。
领取专属 10元无门槛券
私享最新 技术干货