近日,腾讯首个AI开源项目Angel正式发布 3.0 版本。Angel 3.0 的目标是打造一个全栈的机器学习平台,功能特性涵盖了机器学习的各个阶段:特征工程、模型训练、超参数调节和模型服务。
Angel 是腾讯开源的大规模分布式机器学习平台,专注于稀疏数据高维模型的训练。自 2016 年年初在腾讯内部上线以来,Angel 已应用于微信支付、QQ、腾讯视频、腾讯社交广告及用户画像挖掘等业务。2017 年 6 月,Angel 在 Github 上低调开源;2018 年 9 月,Angel 2.0 版本发布,支持千亿级模型维度训练,同时算法库也更加丰富,首次引入了深度学习算法和图算法。截至目前,Angel 在 GitHub 上 Star 数已超过 4200,Fork 数超过 1000。
从 1.0 到 3.0,Angel 从一个单一的模型训练平台发展到涵盖机器学习各个流程,包含自己生态的通用计算平台,代码量也超过了 50 万行。
概述
相比于 TensorFlow、PyTorch 和 Spark 等业界同类平台,Angel 有如下特点:
Angel 是一个基于 Parameter Server(PS)理念开发的高性能分布式机器学习平台,它具有灵活的可定制函数 PS Function(PSF),可以将部分计算下推至 PS 端。PS 架构良好的横向扩展能力让 Angel 能高效处理千亿级别的模型。
Angel 具有专门为处理高维稀疏特征特别优化的数学库,性能可达 breeze 数学库的 10 倍以上。Angel 的 PS 和内置的算法内核均构建在该数学库之上。
Angel 擅长推荐模型和图网络模型相关领域(如社交网络分析)。图 1 是 Angel 和几个业界主流平台在稀疏数据,模型维度,性能表现,深度模型和生态建设几个维度的对比。Tensorflow 和 PyTouch 在深度学习领域和生态建设方面优势明显,但在稀疏数据和高维模型方面的处理能力相对不足,而 Angel 正好与它们形成互补,3.0 版本推出的 PyTorch On Angel 尝试将 PyTorch 和 Angel 的优势结合在一起。
图 1 Angel 与业界主流平台的对比
Angel 系统架构
Angel 3.0 系统架构如图 2 所示。
图 2 Angel 3.0 架构
Angel 自研的高性能数学库是整个系统的基础,Angel 的 PS 功能和内置的算法内核均是在这个数学库基础之上实现的。
Angel PS 提供了高效,稳定和灵活的参数存储和交换服务。在 3.0 版本中,我们对 Angel PS 功能进行了扩展,使得它可以存储任意类型的对象,一个典型的例子是在图算法的实现过程中,我们使用 Angel PS 来存储了大量复杂的对象。
MLcore 是 Angel 自研的一套算法内核,它支持自动求导,可以使用 JSON 配置文件定义和运行算法。除此之外,在 3.0 版本中,Angel 还集成了 PyTorch 作为计算引擎。在计算引擎层之上是计算框架,它们可以看作计算引擎的容器,目前支持 3 种计算框架:原生的 Angel,Spark On Angel(SONA)和 PyTorch On Angel(PyTONA),这些计算框架可以使得 Spark 和 PyTorch 用户可以无缝切换到 Angel 平台。最上层是两个公共组件:AutoML 和模型服务。
Angel 使用情况
如图 3 所示,在过去 12 个月,Angel 在腾讯内部的任务数量有了非常明显的增长,增幅达到 150%。值得一提的是,Spark On Angel 的任务数增长了 10 倍,为了让 Spark On Angel 更加的易用,3.0 版本对 Spark On Angel 做了大幅度升级。在腾讯内部,使用 Angel 的业务包括腾讯视频、腾讯新闻和微信等。
图 3 腾讯内部 Angel 任务数
Angel 官方维护了一个 QQ 群与外部开发者进行交流,对群用户的统计表明:
Angel 的绝大部分用户来自中国,主要分布在北京,上海,杭州,成都和深圳等互联网行业比较发达的城市。
有超过 100 家的公司和科研机构在使用或测试 Angel,其中包括了中国最顶级的 IT 公司:微博,华为和百度等。
图 4 Angel 开源用户
Angel 开源情况
图 5 GitHub 上 Angel 的统计信息以及 Angel 发表的论文
从 2017 年 6 月开源以来,Angel 受到了较多的关注,目前在 GitHub 上 Star 数超过 4200,Fork 数超过 1000。Angel 项目目前总共有 38 为代码贡献者,其他包括 8 位 committer,他们总共提交了超过 2000 个 commit。
从 1.0 到 3.0,Angel 发生了巨大的变化,它从一个单一的模型训练平台发展到涵盖机器学习各个流程,包含自己生态的通用计算平台,代码量也超过了 50 万行。为了后续维护和使用的方便,Angel 拆分成 8 个子项目,统一放在 Angel-ML 目录下(https://github.com/Angel-ML):angel,PyTorch On Angel,sona,serving,automl,mlcore,math2 和 format,这些子项目会在下文详细介绍。
Angel 3.0 新特性
图 6 Angel 3.0 概览(红色的表示新增特性,白色的表示已有的但在持续改进的特性)
图 6 提供了一个 Angel 3.0 特性的整体视图。Angel 3.0 试图打造一个全栈的机器学习平台,它的功能特性涵盖了机器学习的各个阶段:特征工程,模型训练,超参数调节和模型服务。
Angel 的特征工程模块基于 Spark 开发,增强了 Spark 的特征选择功能,同时使用特征交叉和重索引实现了自动特征生成。这些组件可以无缝地整合进 Spark 的流水线。为了让整个系统更加的智能,Angel 3.0 新增了超参数调节的功能,目前支持 3 种算法:随机搜索,网格搜索和贝叶斯优化。在模型服务方面,Angel 3.0 提供了一个跨平台的组件 Angel Serving, Angel Serving 不仅可以满足 Angel 自身的需求,还可以为其他平台提供模型服务。
在生态方面,Angel 也尝试将 PS 能力赋能给其他的计算平台,目前已经完成了 Spark On Angel 和 PyTorch On Angel 两个平台的建设。这两个平台各有优势和侧重, Spark On Angel 使用的是 Angel 内置的算法核心,主要负责常见推荐领域的机器学习算法和基础图算法。 PyToch On Angel 使用 PyTorch 作为计算核心,主要负责推荐领域深度学习算法和图深度学习算法。
自动特征工程
特征工程,例如特征交叉和选择,对于工业界的机器学习应用具有重要意义。Spark 提供了一些特征选择算子,但是仍有一些局限性。Angel 基于 Spark 提供了更多的特征选择算子:
基于统计的运算符,包括 VarianceSelector 和 FtestSelector
基于模型的运算符,包括 LassoSelector 和 RandomForestSelector
大多数在线推荐系统经常选择线性算法,例如逻辑回归作为机器学习模型,但逻辑回归需要复杂的特征工程才能实现较高的精度,这使得自动特征合成至关重要。但是,现有的自动化的高阶特征合成方法带来了维度灾难。 为了解决这个问题,Angel 实现了一种迭代生成高阶合成特征的方法。每次迭代由两个阶段组成:
扩增阶段:任意特征的笛卡尔积
缩约阶段:特征选择和特征重索引
以下是迭代步骤:
首先任意的输入特征之间通过笛卡尔积生成合成特征。该步骤后,特征数量将以二次方式增加
接下来,从合成特征中选择最重要的特征子集(使用例如 VarianceSelector 和 RandomForestSelector)
然后,重新索引所选择的特征以减少特征空间
最后,合成特征与原始特征拼接在一起
图 7 自动特征工程流程
如图 7 所示,这种特征合成方法线性地增加特征数量,避免了维度灾难。在 Higgs 数据集上的实验表明合成的特征能有效地提高模型精度(如表 1 所示)。
表 1 特征合成效果
Spark On Angel(SONA)
在 Angel 3.0 中,我们对 Spark On Angel 做了大幅度的优化,添加了下面这些新的特性:
Spark On Angel 中集成了特征工程。在集成的过程中并不是简单地借用 Spark 的特征工程,我们为所有的运算支持了长整型索引的向量使其能够训练高维稀疏模型
与自动调参无缝连接
Spark 用户能够通过 Spark-fashion API 毫不费力的将 Spark 转换成 Angel
支持两种新的数据格式:LibFFM 和 Dummy
图 8 Spark On Angel 架构
除了这些大的特征,我们也在持续完善 Spark On Angel 的算法库:添加了一些新的算法,如:Deep & Cross Network (DCN) 和 Attention Factorization Machines (AFM)等;同时对已有的算法做了大量的优化,例如对 LINE 和 K-Core 算法进行了重构,重构后的算法性能和稳定性都有大幅度提升。
从图 9 中可以看出,Spark On Angel 中的算法与 Spark 中的算法存在显著的不同,如:基于 Spark On Angel 的算法主要是针对推荐和图领域,然而 Spark 中的算法更通用。
图 9 Spark 与 Spark On Angel 算法比较
图 10 Spark On Angel 算法示例
图 10 提供了一个基于 Spark On Angel 的分布式算法示例,主要包含以下步骤:
在程序开始时启动参数服务器,程序结束时关闭参数服务器
将训练集和测试集以 Spark DataFrame 形式加载
定义一个 Angel 模型并以 Spark 的参数设置方式为其设置参数。在这个示例中,算法是一个通过 JSON 定义的计算图
使用“fit”方法来训练模型
使用“evaluate”方法来评估已训练的模型
在训练完成后,Spark On Angel 将会展示多种模型指标,如:准确率, ROC 曲线, AUC 等。用户可以保存训练好的模型以便下次使用。
图 11 Spark On Angel 和 TensorFlow 性能比较
我们在两种流行的推荐算法 Deep & Wide 和 DeepFM 上使用了相同的资源和数据集比较了 Spark On Angel 和 Tensorflow 的性能。如图 11 所示,在 Deep & Wide 算法上 Spark On Angel 比 Tensorflow 快 3 倍,而在 DeepFM 算法上 Tensorflow 运行稍快一些。
PyTorch On Angel(PyTONA)
PyTorch On Angel 是 Angel 3.0 新增的特性,它主要是为了解决大规模图表示学习和深度学习模型训练问题。
在过去几年时间,图卷积神经网络(GNN)快速发展,一系列的研究论文以及相关的算法问世:例如 GCN,GraphSAGE 和 GAT 等,研究和测试结果表明,它们能够比传统图表示学习更好的抽取图特征。腾讯拥有庞大的社交网络(QQ 和微信),同时拥有大量对图数据进行分析的需求,而图表示学习正是这些分析的基础,因此腾讯内部对 GNN 有着强烈的需求,这也是我们开发 PyTorch On Angel 的主要原因之一。
大规模图的表示学习面临着两个主要的挑战:第一个挑战来自于超大规模图结构的存储以及访问,这要求系统不仅能存得下,还需要提供高效的访问接口,例如需要提供高效的访问任意节点的两跳邻居的接口;第二个挑战来自于 GNN 计算过程,它需要有高效的自动求导模块。
通过对 Angel 自身状况以及对业界已有系统的分析,我们得到如下结论:
TensorFlow 和 PyTorch 拥有高效的自动求导模块,但是它们不擅长处理高维度模型和稀疏数据
Angel 擅长处理高维度模型和稀疏数据,虽然 Angel 自研的计算图框架(MLcore)也可以自动求导,但是在效率和功能完整性上却不及 TensorFlow 和 PyTorch,无法满足 GNN 的要求
为了将两者的优势结合起来,我们基于 Angel PS 开发了 PyTorch On Angel 平台,基本思路是使用 Angel PS 来存储大模型,使用 Spark 来作为 PyTorch 的分布式调度平台,也就是在在 Spark 的 Executor 中调用 PyTorch 来完成计算。
PyTorch On Angel 的架构如图 12 所示:
图 12 PyTorch On Angel 系统架构
PyTorch On Angel 拥有 3 个主要的组件:
Angel PS:存储模型参数,图结构信息和节点特征等,并且提供模型参数和图相关数据结构的访问接口,例如需要提供两跳邻接访问接口
Spark Driver:中央控制节点,负责计算任务的调度和一些全局的控制功能,例如发起创建矩阵,初始化模型,保存模型,写 checkpoint 以及恢复模型命令
Spark Worker:读取计算数据,同时从 PS 上拉取模型参数和网络结构等信息,然后将这些训练数据参数和网络结构传给 PyTorch,PyTorch 负责具体的计算并且返回梯度,最后 Spark Worker 将梯度推送到 PS 更新模型
当然,这些细节都是封装好的,算法开发人员和用户并不需要了解。在 PyTorch On Angel 平台上开发新算法,只需要关注算法逻辑即可,与开发单机的 PyTorch 算法并没有太大区别。下面给出一个 2 层 GCN 算法的实现例子:
图 13 在 PyTorch On Angel 上实现 GCN 的例子
算法开发完成后,将代码保存为 pt 文件,然后将 pt 文件提交给 PyTorch On Angel 平台就可以实现分布式训练了。
我们已经在 PyTorch On Angel 上实现了许多算法:包括推荐领域常见的算法(FM,DeepFM,Wide & Deep,xDeepFM,AttentionFM, DCN 和 PNN 等)和 GNN 算法(GCN 和 GraphSAGE)。在后续的版本迭代中,我们将会进一步丰富 PyTorch On Angel 的算法库。
由于结合了 PyTorch 和 Angel 的优点,PyTorch On Angel 在算法性能方面有很大的优势:对于推荐领域常见的深度学习算法,性能可以达到 TensorFlow 的 4 倍以上;对于 GNN 算法,性能也远好于目前业界开源的同类型平台(具体的性能数据会在开源社区陆续公开)。下图是在公开的数据集 criteo kaggle2014(4500 万训练样本,100w 特征)上做的对比测试:
图 14 PyTorch On Angel 和 TensorFlow 性能对比测试
除了性能方面的优势,PyTorch On Angel 还有一个比较大的优势就是易用性好。如图 12 所示:PyTorch 运行在 Spark 的 Executor 中,可以实现 Spark 图数据预处理和 PyTorch 模型训练的无缝对接,在一个程序中完成整个计算过程。
自动超参数调节
传统超参数调节的方式有两种(如图 15 所示):
网格搜索:网格搜索将整个搜索空间切分为网格,假设超参数是同等重要的。这种方式虽然直观,但有两个明显的缺点:1)计算代价随参数数量的增长而呈指数增长;2)超参数的重要程度常常是不同的,网格搜索可能会花费太多精力来优化不太重要的超参数
随机搜索:随机采样超参数组合,并评估抽样组合。虽然这种方法有可能关注更重要的超参数,但是仍无法保证找到最佳组合
图 15 网格搜索和随机搜索
贝叶斯优化与传统的无模型方法不同,使用计算成本较低的代理函数(surrogate function)来近似原始目标函数。在贝叶斯优化中,代理函数生成超参数组合的概率均值和方差。然后,效用函数(acquisition function)将评估超参数组合的预期损失或改进。这样的概率解释方法使贝叶斯优化能够使用少得多的开销找到目标函数的较优解。
Angel 3.0 包括传统的两种方法和贝叶斯算法优化。对贝叶斯优化,Angel 实现了以下的功能:
代理函数。除了常用的两种模型(高斯过程和随机森林),也实现了 EM + LBFGS 优化高斯过程内核函数中的超参数
效用函数:实现了 PI(Probability of improvement),EI(Expected Improvement)和 UCB(Upper Confidence Bound)
由于每次评估目标函数的计算开销可能较大,如果观察到候选的超参数组合在开始的若干轮迭代中表现不佳,可以提前停止这些候选超参数组合。Angel 3.0 版本中实现了这种早停策略。
表 2 是在逻辑回归算法的实验,调节的超参数是学习速度和学习速度衰减率,结果显示贝叶斯优化的性能优于随机搜索和网格搜索,而随机搜索的结果略优于网格搜索
表 2 不同超参数自动条件方法的效果对比
Angel Serving
为了满足在生产环境中高效地进行模型服务的需求,我们在 Angel 3.0 中实现了 Angel Serving 子系统,它是一个可拓展性强、高性能的机器学习模型服务系统,是全栈式机器学习平台 Angel 的上层服务入口,使 Angel 生态能够形成闭环。图 16 展示了 Angel Serving 的架构设计。
图 16 Angel Serving 架构
Angel Serving 主要特征包括:1)支持多种类型的 API 访问服务,包括 gRPC 和 Restful 接口;2)Angel Serving 是一个通用的机器学习服务框架,可插拔机制设计使得来自其他第三方机器学习平台的模型可以很容易使用 Angel Serving 来服务,目前已经支持三种平台的模型:Angel,PyTorch 和支持 PMML 模型格式的平台(Spark、XGBoost 等);3)受 TensorFlow Serving 的启发,Angel Serving 还提供细粒度版本控制策略:包括使用模型的最早,最新以及指定版本进行服务;4)Angel Serving 还提供丰富的的模型服务监控指标,包括:
QPS: 每秒请求数
总的请求数以及成功请求总数
请求的响应时间分布
平均响应时间
表 3 Angel Serving 和 Tensorflow Serving 性能对比
表 3 展示了 Angel Serving 和 TensorFlow Serving 性能对比结果,我们使用具有 100 万个特征的 DeepFM 模型,向服务发送 100,000 个预测请求。 Angel Serving 和 TensorFlow Serving 的总耗时分别为 56 秒和 59 秒。两个服务系统的平均响应时间都为 2 毫秒。Angel Serving 的 QPS 是 1,900,而 TensorFlow Serving 的 QPS 是 1,800。上述结果表明 Angel Serving 与 TensorFlow Serving 性能相当,甚至更好。
案例一:腾讯短视频推荐
图 17 短视频推荐数据处理流程
上图所示是腾讯短视频部门的一个使用案例。用户的视频播放日志和上下文信息被实时转发给 Kafka,流数据引擎 Storm 订阅 Kafka 的数据。Storm 是一个实时的特征生成器,它从一个离线的 key-value 存储中获得用户画像和视频信息,将两者拼接起来生成特征。生成的特征被传输到在线训练系统中来更新在线模型;同时,这些特征也被转存到 HDFS 作为离线训练的输入。离线模型通常用来初始化在线训练系统,当出现异常时,离线模型还可以用来重置在线系统。本案例用到的推荐算法是 FM,训练样本 24 亿条,特征维度为 63611,在 Spark 上训练耗时 10 多个小时,应用 Angel 后减少至 1 小时。
案例二:金融反欺诈
图 18 金融反欺诈数据处理流程
金融欺诈检测是大规模图学习的常见案例,其网络数据是异构的,包含几种不同类型的边:
交易关系: 用户 A 和用户 B 之间如存在交易关系表明他们之间曾出现过交易行为
设备关系:用户 A 和用户 B 之间如存在设备关系表明他们曾共享过同一个设备
Wi-Fi 关系:用户 A 和用户 B 之间如存在 Wi-Fi 关系表明他们曾通过一个 Wi-Fi 连接到互联网
金融诈骗者通常共享设备和 Wi-Fi,通过扩展边缘关系生成社区。Angel 上的 fast unfolding 算法可以有效地发现这些社区。下游的欺诈风险模型可以将这些社区的用户画像和网络特征作为输入来学习和推到反欺诈策略。该图数据包含 15 亿个节点和 200 亿条边,基于 Spark GraphX 的实现耗时 20 小时,而 Angel 仅需 5 小时。
小结
本文主要介绍了 Angel 在腾讯内外的使用情况和 3.0 版本的新特性。
Angel 在腾讯内外的使用情况:
腾讯内部:用户数和任务数增加 1.5 倍
腾讯外部:超过 100 多家公司和机构使用 Angel
开源贡献:4200 多个 star, 8 个子项目,1100 多个 fork,2000 多次 commits
Angel 3.0 新特性:
自动特征工程:新增特征选择和组合方法,将特征合成、选择和重新索引以 pipeline 的形式呈现,用来迭代生成高阶合成特征
新的计算引擎:
SONA(加强):特征工程支持索引为 Long 类型的向量;所有的算法被封装成 Spark 风格的 APIs;SONA 上的算法可以作为 Spark 的补充
PyTONA(新):PyTONA 作为图学习算法的引擎被引入,目前支持 GCN 和 GraphSage,同时也支持推荐领域的算法。PyTONA 采用 Python 作为交互,因此是用户友好的
自动机器学习:Angel3.0 引入了 3 种超参数调节算法:网格搜索、随机搜索和贝叶斯优化
Angel 模型服务:Angel 提供一个跨平台的模型服务框架,支持 Angel、PyTorch 和 Spark 的模型,性能上与 TensorFlow Serving 相当
支持 Kubernetes:Angel3.0 支持 Kubernetes,从而可以在云上运行
评论