【ArchSummit架构师峰会】探讨数据与人工智能相互驱动的关系>>> 了解详情
写点什么

vivo 手机背后的一站式机器学习平台架构实践

  • 2020-01-21
  • 本文字数:4072 字

    阅读完需:约 13 分钟

vivo手机背后的一站式机器学习平台架构实践

如今,大多数互联网公司都有自己的机器学习平台,虽然名字和承载的业务不完全相同,但就平台要解决的问题和技术选型来说大同小异。在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 研究院所有推理加速的需求,鲁文龙表示,对于业务使用方来讲,接入方式有两种:


  • 服务调用,适合于传输参数量级少的业务,方便服务升级管理。

  • SDK 调用,适合于传输参数量级大,极致推理性能优先的业务。



高性能推理引擎架构图


在引擎内部,基于 CPU 和 GPU 的开源高性能计算库和推理服务器,根据具体业务的特点,一般会采取:


  • 在计算库与推理服务器基础上,调优参数配置,优化热点算子,来满足线上推理的需求;

  • 对性能要求比较高、机器预算比较大的场景,会针对这类业务定制化实现一套轻量级的推理引擎。


具体的,在性能优化方面,vivo 优化工作主要集中在图优化和算子优化上。图优化方面主要是:


  • 算子融合: 经典的矩阵乘加融合、卷积层和激活层融合,减少函数调用次数,提供执行效率;

  • 非功能性算子消除:如 Identity、Const、Reshape、ExpandDim;

  • 异构计算:I/O 密集型和逻辑处理放在 CPU 上执行,如 embedding、并查集; 密集计算放在 GPU 上执行。


算子优化方面,vivo 也针对 CPU 和 GPU 的硬件特性做了一些软件层面的定制优化工作。CPU 的算子优化:


  • CPU 有更大的内存和 cache,所以内存对齐、增加 cache 命中率,可以提高运行效率;

  • CPU 有更少的执行单元,那么利用 OpenMP 做代码矢量化、让代码并行执行,提高运行效率;

  • 对 intel 最新型号 Cascade Lake 的 VNNI 指令进行了 INT8 探索优化。

  • GPU 的算子优化:

  • GPU 芯片有大量的计算单元,所以合理设计线程布局会大大优化执行效率,同时也要减少线程束分支,避免低效执行;

  • 对 T4 的 HMMA 指令和 IMMA 指令进行了 FP16 和 INT8 量化的探索优化。


经过一年多的探索与实践, 鲁文龙团队在稀疏 DCN 模型、通用 OCR 模型、BERT 模型等相关技术的应用场景中,都得到了 10 倍左右的推理加速,为 vivo 节省了数千万机器成本。

经验总结

对于同样希望建设机器学习平台的企业而言,鲁文龙也提出了自己的建议。他表示,机器学习平台研发团队内部最好有做过业务的人,要懂用户(也就是业务方)的需求,不然很难抓住用户痛点,向业务推广时也不好落地。

未来发展

从技术发展来看,鲁文龙表示,目前业界都在尝试深度学习,并且模型的复杂度越来越高,vivo 也继续在这方面探索高效的分布式训练和极致性能的推理能力,争取在众多业务上都获得不错的收益。扩展到人工智能领域,他补充道,比较值得期待的是大规模落地的业务场景上的突破,搜索推荐这些互联网常见的场景自不必谈,但目前语音或视觉等技术落地的大规模业务场景还不是特别多,跟移动互联网比起来。他认为,当众多业务场景大规模落地后,技术的商业价值凸显出来,随之而来的算法、算力等各个方面的突破才能形成持续的价值闭环。


采访嘉宾:


鲁文龙,vivo 资深算法工程师,目前在 vivo AI 研究院,在广告的机器学习项目中,引入了深度学习与大规模分布式训练技术,使得广告收入实现了大幅的增长。为了支持 AI 研究院各种各样的机器学习项目,从零到一打造端到端的一站式机器学习平台,降低机器学习技术的落地门槛,大大提升了项目的迭代效率。


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-01-21 10:566292
用户头像
赵钰莹 InfoQ 主编

发布了 874 篇内容, 共 604.5 次阅读, 收获喜欢 2671 次。

关注

评论

发布
暂无评论
发现更多内容

操作系统导论:分页

小白钊钊

操作系统 java; 10月月更

Spring Boot 集成 Redis 配置 MyBatis 二级缓存

微枫Micromaple

redis 缓存 mybatis springboot 10月月更

今日国庆,祝福祖国!【文末超级福利】

图灵社区

读书 国庆节

spring-cloud-kubernetes与SpringCloud Gateway

程序员欣宸

Kubernetes spring-cloud 10月月更 spring-cloud-kubernetes

能不能手写Vue响应式?前端面试进阶

bb_xiaxia1998

Vue

【结构体内功修炼】结构体内存对齐(一)

Albert Edison

C语言 结构体 10月月更 内存对齐

大画 Spark :: 网络 (8)-Spark 网络中的“四次握手”Driver 如何获取 Executor 的 EndpointRef 烧脑

dclar

大数据 hadoop spark 源代码 spark源码

多线程(进阶)

StackOverflow

编程 多线程安全 10月月更

【牛客刷题-算法】 NC19 连续子数组的最大和

清风莫追

数据结构与算法 10月月更

【牛客刷题-算法】1-算法入门-数据结构-栈

清风莫追

算法与数据结构 10月月更

微服务稳定性保障

穿过生命散发芬芳

微服务 10月月更

OpenHarmony如何控制屏幕亮度

坚果

OpenHarmony 10月月更

ESP32-C3 学习测试 蓝牙 篇(四、GATT Server 示例解析)

矜辰所致

蓝牙 ESP32-C3 10月月更 GATT

【CSS】:什么是z-index属性?该属性有哪些取值类型?

翼同学

CSS 前端 样式设置 10月月更

Java中的自旋锁和适应性自旋锁是什么意思?其分类依据是啥?

wljslmz

Java 自旋锁 10月月更 适应性自旋锁

体验 Orbeon form PE 版本提供的 JavaScript Embedding API

Jerry Wang

Java SAP commerce 10月月更 oberon

从特斯拉人形机器人亮相看AI人工智能模型落地面临的两个难题

felix

落地 机器人 AI人工智能

mysql中的事务隔离级别序列化如何实现

知识浅谈

MySQL 隔离级别 10月月更

[架构实战] 学习笔记二

爱学习的麦子

今日国庆,祝福祖国!【文末超级福利】

图灵教育

读书 国庆节

React面试:谈谈虚拟DOM,Diff算法与Key机制

beifeng1996

React

Qt解压带有密码的加密文件

中国好公民st

c++ Qt Company 10月月更

《零代码教练指南》正式发布

明道云

在vue的v-for中,key为什么不能用index?

bb_xiaxia1998

Vue

When allowCredentials is true, allowedOrigins cannot contain the special value ___ since that cannot be set on the _Access-Contr

共饮一杯无

Java springboot 10月月更

Go学习之路-1.认识GO语言

子不语Any

Go 后端 10月月更

【LeetCode】重新格式化电话号码Java题解

Albert

LeetCode 10月月更

【牛客刷题-算法】 NC13 二叉树的最大深度

清风莫追

二叉树 数据结构与算法 10月月更

【愚公系列】2022年10月 Go教学课程 015-运算符之赋值运算符和关系运算符

愚公搬代码

10月月更

一起玩OptaPlanner-Study,玩转第一个程序

成长兔🐇

跟随一组图片,了解Go Channel的底层实现

董哥的黑板报

Go 后端 服务端 操作系统 runtime

vivo手机背后的一站式机器学习平台架构实践_AI&大模型_赵钰莹_InfoQ精选文章