Angel:深度学习在腾讯广告推荐系统中的实践

2020 年 10 月 27 日

Angel:深度学习在腾讯广告推荐系统中的实践

导读: Angel 是腾讯自研的分布式高性能的机器学习平台,支持机器学习、深度学习、图计算以及联邦学习等场景。Angel 的深度学习平台已应用在腾讯的很多个场景中。所以今天会为大家介绍 Angel:深度学习在腾讯广告推荐系统中的应用实践,介绍的内容会围绕着下面几点展开。


  • Angel机器学习平台

  • 广告推荐系统与模型

  • 模型训练和优化

  • 优化效果


01 Angel 机器学习平台


1. Angel 机器学习平台架构


Angel 机器学习平台是腾讯自研的基于传统 Parameter Server 架构的高性能分布式的机器学习平台如图 1 所示,详细架构图如图 2 所示。它是一个全栈机器学习平台,支持特征工程、模型训练、模型服务、参数调优等,同时支持机器学习、深度学习、图计算和联邦学习等场景。已经应用在众多业务如腾讯内部广告、金融和社交等场景,吸引了包括华为、新浪、小米等 100 多家外部公司的用户和开发者。



Fig1 Angel 机器学习平台



Fig2 Angel 机器学习平台架构图


Angel 机器学习平台设计时就考虑到了很多问题,首先是易用性,Angel 机器学习平台编程接口简单,可快速上手使用,支持训练数据和模型的自动化切分,减少用户的干预,简单易用。然后是可扩展性方面,Angel 提供了 PsFun 接口,继承特定的类可实现自定义参数更新逻辑和自定义数据格式和模型切分方式等。之后是灵活性,Angel 实现了 ANGEL_PS_WORKER 和 ANGEL_PS_SERVICE 两种模式,ANGEL_PS_WORKER 模式下模型的训练和推理服务由 Angel 平台自身的 PS 和 Worker 完成,这种模式主打速度。而 ANGEL_PS_SERVICE 模式下,Angel 只启动 Master 和 PS,具体的计算交给其他计算平台(如 Spark,TensorFlow)负责,Angel 只负责提供 Parameter Server 的功能,主打生态来扩展 Angel 机器学习平台的生态位。Angel 通信模式支持 BSP、SSP、ASP 等通信协议,满足各种复杂的实际通信环境的要求。最后是稳定性,Angel 的 PS 容错采用 CheckPoint 模式,Angel 每隔一段时间会将 PS 承载的参数写入到分布式存储系统中,如果某个 PS 实例挂掉,PS 会读取最后一个 CheckPoint 重新进行服务。Angel 的 Worker 容错方面,如果 Work 挂掉,Master 会重新启动一个 Work 实例,该实例会从 Master 上获取挂掉时参数迭代信息。Angel 的 Master 任务信息也会定期存储到分布式存储系统中,如果 Mater 挂掉,会借助 Yarn Master 重启机制重新拉起一个 Master 并加载信息从之前的断点开始任务。Angel 还有有慢 work 检测机制,如果某个 Work 运行过慢其任务会被调度到其他的 Work 上进行。


Angel 机器学习平台任务提交执行简单,具体步骤如图 3 所示,进入 Cient 后,启动一个 PS 实例,该 PS 会从 Client 端加载模型,之后 Client 会启动多个 Work,Work 会加载训练数据开始训练和学习,push 和 pull 会进行参数的拉取和更新,训练完成后将模型存入指定的路径。



Fig3 Angel 机器学习平台提交执行流程图


Angel 机器学习平台在代码结构设计上做了很多的抽象,这样的设计方式可扩展性强,整个结构主要分为四层如图 4 所示。核心层(Angel-Core)是基础层,主要包括 PSAgent、PSServer、Work、Network 和 Storage 等。机器学习层(Angel-ML)提供基础数据类型和方法,同时用户可根据 PsFunc 定义自己的方法把私有模型接入。接口层(Angel-Client)可插拔式扩展,支持多种用途比如接入 TensorFlow 和 pyTorch 等。算法层(Angel-MLLib)提供了封装好的算法如 GBDT、SVM 等。



Fig4 Angel 机器学习的代码结构


2. Angel 机器学习平台在深度学习方向上的拓展和应用


深度学习常用的分布式计算范式有两种,分别是 MPI ( 基于消息模型的通信模式 ) 和 Parameter Server,如图 5 所示。这两种范式均在 Angel 平台上有实现,对于 Parameter Server 范式的实现如图 6 所示,Angel Work 可通过 Native C++的 API 接口接入常用的深度学习的 OP 如 PyTorch 或者 Tensorflow 等,在训练的起始端 Angel PS 会把模型 Push 到每个 Worker 上,Worker 会加载到对应的 OP 上进行训练,每次训练完成后会将梯度信息回传到 PS 上进行融合,以及应用优化器得到更新的参数,完成后又会分发到每个 Worker 上,重复上述过程直到训练结束,最终将模型保存到指定路径。这种方案 Angel PS 提供了一个梯度 PS 的控制器,来接入多个分布式的 Worker,每个 Worker 上可以运行一些通用的深度学习框架例,这种方案 PyTorch 版本的工作我们已经完成,并已经开源了(PyTorch on Angel)。另外一种是 MPI AllReduce 范式如图 7 所示,这种范式梯度信息是通过 AllReduce 方法进行融合的,在这种范式的实现上,Angel PS 是一个进程控制器,会在每个 Work 上拉起一个进程,这个进程可以是 PyTorch 或者是 Tensorflow 等进程,这种范式对用户侵入少,用户开发的算法不需要太多的修改即可接入到 Angel 平台进行训练。



MPI 范式



Parmeter Server 范式


Fig5 深度学习领域分布式计算常用的两种范式



Fig6 Parameter Server 范式在 Angel 上的实现



Fig7 Allreduce 范式在 Angel 上的实现


02 广告推荐系统与模型


1. 腾讯的广告推荐系统


腾讯大数据示意图,如图 8 所示,在线业务的数据如微信游戏等会通过消息中间件实时地传递到中台系统,中台系统包括实时计算、离线计算、调度系统和分布式存储,这些数据有的会进行实时计算有的会进行离线计算,数据的应用也是从消息中间件中获取其需要的数据。



Fig8 腾讯大数据平台


腾讯的推荐广告推荐系统业务分层如图 9 所示,用户发送一个请求后会去拉取用户地画像特征,之后会对广告库的广告进行一个初步地排序和打分,打分之后会提取用户地特征信息,同时将广告库的 ID 数量降为百级别,在这个百级范围内会有一个精细的排序,完成后将广告推送给用户。整个推荐系统面临着下面的几大挑战,首先是数据来源多样化,数据既有线上数据也有历史落盘数据。其次是数据的格式多元化,包括用户信息、Item 信息、点击率和图像等数据的多元格式。然后是增量数据多,用户请求频繁,广告库也在不断更新中。最后是训练任务多元化,整个推荐系统涉及到粗排、精排、图像检测和 OCR 等任务。为了解决上述问题,我们在精准排序任务上开发了一整套的软件框架"智凌"(基于 TensorFlow)来满足训练需求。



Fig9 腾讯广告推荐系统


"智凌"框架结构如图 10 所示,该框架最底层 C++ core 封装了 MQ receiver 和深度学习框架的一些 OP 类,最典型的是 TensorFlow 的 dataset 类,通过封装 tensorflow 的 dataset 类来提供从 MQ 获取数据的能力。数据抽象和处理在 C++和 Python 上完成。然后是深度学习的 framework(tensorflow)层提供各种深度学习的库。最后是具体的应用模型如 DSSM、VLAD 和一些图像算法的模型等。"智凌"软件框架具有算法封装完整、开发新模型较快、数据和算法隔离解耦较好、预处理逻辑方便修改和更新及兼容性好等优点,但同时对于 Tensorflow 框架侵入性修改多、单机多卡性能差、多机分布式不支持、算法和 OP 层面优化不够完全等缺点。图 11 是"智凌"在基础数据上的训练流程图,从图中看到从消息中间件中读取数据到本地的 DataQueue 中,DataQueue 给每个在 GPU 节点上的模型分发 Batch 数据然后进行训练,训练完成后读取到 CPU 进行梯度融合和备份然后分发给各个 GPU 进行再训练,这种设计是面向单机结构的设计,CPU 去实现梯度的融合和优化器的功能,CPU 资源消耗大,这种设计很不合理,针对这种情况我们做了很多的优化后面会向大家介绍。



Fig10 "智凌"框架结构



Fig11 "智凌"在基础数据上的训练流程图


2. 腾讯的广告推荐系统中的模型


DSSM 增强语义模型如图 12,在这里我们用该模型来计算用户和推荐 ID 之间的相关性并在此基础上计算用户对给定推荐 ID 的点击率,相关性和点击率计算公式分别是:




DSSM 模型较为简单,分为 Quey Id 和 Item Id 并表达为低维语义向量,然后通过余弦距离来计算两个语义向量之间的距离。通过模型计算 Query 和 Item 之间的相关性,打分最高点就是我们要推荐的 Item, 广告推荐系统中的 DSSM 模型要支持以下一些新的需求点:


  • ID类特征维度亿级别;

  • 变化快,每周有25%是新条目,支持增量训练。



Fig12 DSSM 模型


VLAD/NetVLAD/NeXtVLAD 等模型我们主要用来判断两个广告之间的距离关系,传统的 VLAD 可以理解为一个聚类合并的模型,其向量计算公式为:



NeXtVLAD 如图 13 则通过将 ak符号函数变成一个可导函数来得到一个更好距离效果,NeXtVLAD 的向量计算公式为:



其中,



Fig13 NeXtVLAD 模型


YOLO V3 如图 14 是图像处理模型,在这里我们将其应用在 OCR 业务最前端做初检,它的特点是图片输入尺寸大(608*608,1024*1024),也因此 YOLO 模型的 Loss 部分占据比较大的计算。



Fig14 YOLO V3 模型


03 模型训练和优化


1. 数据流优化


前面的介绍中我们知道"智凌"软件框架是单管道数据流,现在我们将其优化为多管道如图 15 所示,即通过多机多数据流来解决单机 IO 瓶颈问题。原来的单管道数据中会有 DataQueue,如果数据流很大会对 IO 造成很大的压力,优化为多对管道后为每一个训练进程 GPU 定义了一个 DataQueue,通过这种分布式方法来有效解决 IO 瓶颈问题。这种情况下的管理工作是通过 Angel PS(AllReduce 版本)进程控制器来进行管理的。



Fig15 "智凌"的多管道结构


2. Embedding 计算优化


Embedding Lookup 过程常会碰到如果在 hash 之前进行 SparseFillEmptyRows 操做会对空行填充默认值,增加过多的字符串操做,优化后我们先做 hash 操做然后再做 SparseFillEmptyRows 操做,去除耗时过多的字符串操作 ( 百万级别 ),节省 CPU 算力来提升 QPS,此优化单卡性能约有 6%的提升。


3. 模型算法层面优化


YOLO 的 Loss 计算量较大,我们对其进行了特殊的优化。YOLO 模型有三个 Feature map 层,传统寻找正负样本的时候,真正的 Bounding box 会在 Feature map 上会做一个遍历比较,先横向遍历然后再纵向遍历,遍历的过程中寻找 Feature map 点和 Bounding box IOU 最大的值作为正样本。因为图像的 size 很大,所以 Feature map 也很大,这使计算 Loss 耗时过长。计算 Loss 优化方法如下,由于 x 轴方向上的块和 y 轴方向上的块关于对角线对称,所以我们计算 Feature map 和 Bounding box 的 IOU 的时候按照中轴线对角点方向进行遍历如图 16 所示。先计算对角线方向上的的块,然后再计算每个 feature map 块两边的块。这种优化方法可减少大量的计算量。另外,在某个点上向两边遍历所有的 Feature map 块的时候有一些计算技巧特点,比如往右上开始遍历的时候,x 轴与 y 轴是关于对角线对称变化的,我们可以预估这种变化,从而有意识地去寻找最大的 Anchor 位置,然后丢弃其他信息,通过这样的优化方法也可以大量的减少计算量。我么通过上述方法优化了 Loss 计算之后单卡性能有约 10%的提升。



Fig16 YOLO V3 优化示意图


04 优化效果


通过在模型层面和数据层面的优化,以及 Angel 平台应用到整个控制流程中,DSSM 的单卡性能有 33 倍的提升,VLAD 有 22 倍的提升,YOLO 有 2.5 倍的提升如图 17 所示。图 18、19、20 是详细测评结果,它们有三种类型的测试模式,分别是训练数据通过 TDbank(腾讯自研的 MQ 系统)线上拉取(时延包括网络传输、数据 packing 等);本地数据读取,训练数据预先存放本地磁盘(时延包括磁盘 IO,数据映射预处理);Benchmark 模式训练数据放内存(时延仅包括数据映射预处理)。从图 18 中看到 Benchmark 不考虑数据读取前的延时基本能把整个系统计的算能力跑满这是一个准线性地提升。考虑到实际的数据是从 MQ 中读取,在 1 卡中提升不大 TPS 为 3000 多,2 卡 QPS 为 4000 多,两机两卡 TPS 达到 6000 多,所以随着多机越多,训练性能达到线性的提升, VLAD-CTR 模型的测试具有相同的结果。YOLO V3 优化后 1 机 1 卡有 2.5 倍的性能提升,1 机 8 卡有 7.2 倍的提升。



Fig17 优化后的性能提升结果



Fig18 优化后的 DSSM-CVR 模型性能提升结果



Fig19 优化后的 VLAD-CTR 模型性能提升结果



Fig20 优化后的 YOLO V3 模型性能提升结果


05 总结


今天主要和大家分享了三部分的内容,第一部分内容是介绍了腾讯的 Angel 机器学习平台和其在深度学习方向上的拓展和应用,第二部分的内容是介绍了腾讯广告推荐系统的特点和常用模型,最后一部分的内容介绍了 Angel 深度学习在腾讯广告推荐系统中的应用,模型训练和优化,以及取得的效果。


今天的分享就到这里,谢谢大家。


作者介绍


郭跃超,腾讯应用研究员


郭跃超,毕业于北京大学,主要研究方向是异构加速计算,分布式系统的设计开发和优化,语音/NLP 等领域的算法优化等。目前在腾讯主要负责 Angel 平台的深度学习方面的新技术研究,开发和业务场景的落地应用。


本文来自 DataFunTalk


原文链接


Angel:深度学习在腾讯广告推荐系统中的实践


2020 年 10 月 27 日 14:001077

评论

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

有状态软件如何在k8s上快速扩容甚至自动扩容

东风微鸣

Kubernetes DevOps openshift

「架构师训练营第 1 期」第六周作业

张国荣

SpringCloud-初步介绍

hepingfly

微服务 springboot SpringCloud

Java9新特性-上篇

hepingfly

Java新特性 Java9

如何搭建一个爬虫代理服务?

Kaito

爬虫 代理

元模型驱动(二)构建元模型ーGME构建分层模型

KaYa

DDD Kaya MDA GME MDD

Scrapy 源码剖析(三)Scrapy有哪些核心组件?

Kaito

Python 爬虫 Scrapy 源码剖析

【架构师训练营 1 期】第六周作业

诺乐

训练营第二周课程总结

爱码士

训练营

架构师训练营第 1 期 -- 第六周作业

发酵的死神

架构师训练营第 1 期

如何构建一个通用的垂直爬虫平台?

Kaito

Python 爬虫 代理

元模型驱动(一)构建元模型ーGME入门

KaYa

DDD Kaya MDA GME MDD

目标检测学习-比赛路线

Dreamer

Scrapy源码剖析(一)架构概览

Kaito

Python 爬虫 Scrapy 源码剖析

队列实现栈的3种方法,全都击败了100%的用户!

王磊

Java 算法和数据结构

面试官:讲一下缓存穿透、缓存雪崩和缓存击穿?

bigsai

redis 缓存穿透 缓存击穿 缓存雪崩

当AI入职FBI,克格勃直呼内行

脑极体

Scrapy 源码剖析(四)Scrapy如何完成抓取任务?

Kaito

Python 爬虫 Scrapy 源码剖析

轻量型GPU应用首选 京东智联云推出NVIDIA vGPU实例

京东智联云开发者

人工智能 gpu

【面经】面试官:讲讲类的加载、链接和初始化?

冰河

架构 JVM 类加载 优化 性能调试

老板下了死命令,要把日志系统切换到Logback

沉默王二

Java logback 日志系统

java安全编码指南之:文件和共享目录的安全性

程序那些事

代码规范 java安全 java安全编码指南 java编码 程序那些事

1分钟教你如何整理 React 知识体系

🇯 🇹 🇷

学习 学习方法 前端 React 前端进阶训练营

架构师训练营第 1 期 -- 第六周学习总结

发酵的死神

架构师训练营第 1 期

美国半导体十年计划中的NO.1,模拟硬件究竟有什么价值?

脑极体

Scrapy 源码剖析(二)Scrapy是如何运行起来的?

Kaito

Python 爬虫 Scrapy 源码剖析

为什么 React Hooks 优于 HOCs(译)

西贝

JavaScript 翻译 React Hooks HOC

训练营第二周作业

爱码士

TCP/IP 基础知识总结

cxuan

后端 计算机网络 计算机

5G应用的实时决策

VoltDB

5G 物联网 工业互联网 技术分享

Redis还可以做哪些事?

Java旅途

redis

Angel:深度学习在腾讯广告推荐系统中的实践-InfoQ