【淬火重炼,岂止于快】超越XGBoost和Spark的Angel开源l

# 【淬火重炼,岂止于快】超越XGBoost和Spark的Angel开源l

---

经过漫长的准备和打磨,新一代的Angel终于开源了。Github地址:[https://github.com/tencent/angel](https://github.com/tencent/angel)欢迎大家Star,Fork和提PR。新一代的Angel由**腾讯和北京大学**联合开发,兼顾业界的高可用性和学术界的创新性,欢迎**分布式架构师,算法工程师和数据科学家**一起深入使用和协同开发,激发机器学习领域更多的创新应用和良好生态。

![](./angel_banner_1.png)

作为一个高维度的分布式机器学习框架,Angel的第一次对外亮相是在去年的五月[^1],并在去年12月份KDDChina大会上[^2],宣布将全面进行开源。为了迎接对外开源,团队成员对Angel进行了多次重构和升级,可谓是淬火重炼。在此期间,Angel的架构反复改进,性能持续提升。开源前夕,它的性能已经超越了XGBoost和Spark。新一代的Angel,**性能更快,功能更强,开发更方便**。其改进主要集中在三方面:

![](./angel_improvement.png)

***生态性**: 引入PSAgent,支持PS-Service,便于接入其它机器学习框架

***函数性**: 融合函数式编程特性,自定义psFunc,利于开发复杂算法

***灵活性**: 支持Spark-on-Angel,Spark无需修改内核,运行于PS模式之上

本文将从**架构**和**性能**两方面,对新一代Angel,做一个初步的介绍,让大家了解它的改进。关于更加具体和深入的介绍,还请移步[GitHub](https://github.com/tencent/angel)。

## 架构升级

---

### 1. PSService

在新一代的Angel开发中,我们对系统进行了一次重要的升级,引入了PSAgent,对PSServer的服务端进行隔离,从而提供了PS-Service的功能。升级后,系统的架构设计如下:

![](./angel_architecture.png)

引入PSAgent后,PSClient不再直接和PSServer打交道了,而是通过PSAgent来沟通。作为新加的中间层PSAnget,有如下几个特性:

*对外屏蔽了PSServer中的**模型分片,路由以及模型重组**等复杂细节,提供了封装好的**模型操作**接口

*内置了**Hogwild!**机制,包含**模型缓存和模型预取**等性能优化

*提供了**模型缓存(Cache)**的**更新**和**合并**的功能,大大降低网络通信开销

PSAgent的引入,解耦了PSServer和Worker,使得Angel具备了PSService的能力。Angel的PSServer,不再只服务于Angel的Client,其它机器学习框架,只要实现AngelPSClient接口了,都能可以接入Angel。

> PSService的抽象,为Angel接入Spark和深度学习框架,从架构的层面上提供了便利

### 2. psFunc

标准Parameter Server功能之一,就是要提供Model的**拉取(pull/get)和推送(push/update)**。 很多早期PS,拿HBase,Redis等分布式存储系统,简单改改,进行模型的更新和获取,就搭建了一个简单的PS系统。

但实际应用中,算法对PSServer上的参数获取和更新,却远远不只这么简单,尤其是当复杂的算法需要实施一些特定的优化的时候,简单的PS系统,就完全不能应对这些需求了。

> 举个例子,有时候某些算法,要得到`矩阵模型`中某一行的最大值,如果PS系统,只有基本的Pull接口,那么PSClient,就只能先将该行的所有列,都从参数服务器上拉取回来,然后在Worker上计算得到最大值,这样会产生很多的网络通信开销,对性能会有影响。而如果我们有一个自定义函数,每个PSServer在远程先计算出n个局部最大值,再交换确认全局最大值,这时只要返回1个数值就可以了,这样的方式,计算开销接近,但通信开销将大大降低。

为了解决类似的问题,Angel引入和实现psFunc的概念,对远程模型的获取和更新的流程进行了封装和抽象。它也是一种用户自定义函数(UDF),但都和PS操作密切相关的,因此被成为**psFunc**,简称**psf**,整体架构如下:

![](./angel_psFunc.png)

>  随着psFunc的引入,模型的计算,也会发生在PSServer端。PSServer也将有一定的模型计算职责,而不是单纯的模型存储功能。合理的设计psFunc,将大大的加速算法的运行。

### 3. Spark on Angel

作为目前非常流行的分布式内存计算框架,**Spark**的核心概念是`RDD`,而`RDD`的关键特性之一,是其`不可变性`,它可以规避分布式环境下复杂的各种奇奇怪怪的并行问题,快速开发各种分布式数据处理算法。然而在机器学习的时代,这个设计反而制约了Spark的发展。因为机器学习的核心是`迭代`和`参数更新`,而RDD的不可变性,不适合参数反复多次更新的需求,因此诸多Spark机器学习算法的实现,非常的曲折和不直观。

现在,基于Angel提供的`PSService`和`psFunc`,Spark可以充分利用Angel的PS,用最小的修改代价,具备高速训练大模型的能力,写出更加优雅的机器学习算法代码。

Spark on Angel实现的基本架构设计如下:

![](./spark_on_angel.png)

可以看出,该实现非常灵活,它对Spark没有任何侵入式的修改,是一种插件式设计,因此完全兼容社区Spark,对原生Spark的程序不会有任何影响。它的基本执行流程如下

*启动SparkSession

*初始化PSContext,启动Angel的PSServer

*创建PSModelPool, 申请到PSVector

***核心调用:**在RDD的运算中,直接调用PSVector,进行模型更新。这将使得真正运行的Task,调用AngelPSClient,对远程PSServer进行操作。

*终止PSContext

*停止SparkSession

关于Spark on Angel的具体开发,可参考:[《Spark on Angel编程手册》](https://github.com/Tencent/angel/blob/branch-1.0.0/docs/programmers_guide/spark_on_angel_programing_guide.md)。在线上,基于真实的数据,我们对Spark on Angel和Spark的做了性能对比测试,结果如下:

| LR算法   |  Spark  |  Spark on Angel  |   加速比例   |

|---|---|---|---|

|SGD LR (step_size=0.05,maxIter=100) | 2.9 hour   | 2.1 hour   | 27.6%  |

|L-BFGS LR (m=10, maxIter=50)        | 2 hour     | 1.3 hour   | 35.0%  |

|OWL-QN LR (m=10, maxIter=50)        | 3.3 hour   | 1.9 hour   | 42.4%  |

显而易见,Spark on Angel能轻松获得30%或更多的加速比,越复杂的算法和模型,性能提高的比例越大。虽然PSServer会耗费了额外的资源,但是比起**算法编写的便捷**和**性能的提升**,这是划算的。对于Spark的老用户,这是低成本切入Angel的一个途径,也是算法工程师基于Spark实现高难度算法的优雅姿势。

> Spark on Angel是Angel生态圈的第一个成员,后续会有更多基于PS-Service的框架接入,包括深度学习

## 性能优势

---

新版本的Angel,添加了诸多新功能,最终的目的,就是让算法工程师能更加从容地进行算法优化,融入更多的算法的Trick,让算法的性能,得到了一个飞跃的提升。

为了更加直观的看到性能差异,每个对比都在腾讯的机器学习平台TeslaML上,提供了工作流的链接,鹅厂工程师都可以观察到运行结果。

### **1.GBDT**

众所周知,XGBoost的强项之一,就是GBDT算法,性能飞快,使用简单,在众多算法比赛中,是选手们的最爱。尽管如此,Angel的GBDT算法,却还是超越了它,这是一个非常不错的性能背书。

***性能比较**

![](./gbdt_angel_vs_xgboost.png)

| 框架  |  Worker  | PS  |   建立20棵树时间   |

|---|---|---|---|

| Angel | 50 个(内存:10G / Worker) | 10个 (内存:10G / PS) | 58 min |

| XGBoost | 50个 (内存:10G / Worker) | N/A | 2h 25 min |

***数据**:腾讯内部某性别预测数据集,3.3×10^5 特征,1.2×10^8 样本

***详细文档**:[GBDT on Angel](https://github.com/Tencent/angel/blob/branch-1.0.0/docs/algo/gbdt_on_angel.md )

### **2.LDA**

众所周知,LDA是一个非常消耗资源的主题模型算法,新一代的Angel,在LDA上的性能,不但超越了Spark,也已经超越了之前开源过的Petuum。(由于Petuum已经不开源多时,所以比对数据,这里就不再贴出了)

![](./lda_angel_vs_spark.png)

| 框架  |  Worker  | PS  |   时间   |

|---|---|---|---|

| Angel | 20个(内存:8G/Worker) | 20个(内存:4G/PS) | 15min |

| Spark | 20个(内存:20G/Worker)| N/A | >300min |

***数据**:PubMED

***详细文档**:[LDA on Angel](https://github.com/Tencent/angel/blob/master/docs/algo/lda_on_angel.md)

### 3.GD-LR

LR是广告推荐中广泛应用的一个算法,Angel分别提供了利用Gradient Descent、ADMM两种优化方法计算的LR算法。这两种算法,无论是耗费的资源,还是性能、收敛速度,都远比原生的Spark实现优越。

***GD-LR**

![](./lr_angel_vs_spark.png)

| 框架  |  Worker  | PS  |   迭代100次时间   |

|---|---|---|---|

| Angel |50个(内存:10G/Worker)| 20个(内存: 5G/PS) | 20min |

| Spark | 50个(内存:14G/Worker)| N/A | 145min |

***数据:**腾讯内部某推荐数据,5×10^7 特征,8×10^7 样本

***详细文档:**[LR on Angel](https://github.com/Tencent/angel/blob/branch-1.0.0/docs/algo/lr_on_angel.md)

***ADMM-LR**

![](./admm_angel_vs_spark.png)

| 框架  |  Worker  | PS  | 收敛退出 |

|---|---|---|---|

| Angel |100个(内存:10G/Worker)| 50个(内存:5G/PS) |  27 min |

| Spark | 200个(内存:20G/Worker) | N/A | 145 min |

***数据:**腾讯内部某推荐数据,5千万特征,1亿样本

## 展望

-----

一把好的宝剑,经过千锤百炼,讲究的是刚柔并济,不但削铁如泥,也要有极好的韧性,百折不断。同样的,一个好的开源项目,也是如此。它不但需要有强大的功能和性能,也需要有良好的适配性,能形成好的生态。

超大样本和超高维度的机器学习,在腾讯的多个真实生产环境中,有着非常普遍的应用场景,这是Angel的切入点,但不是终点和约束,在未来,Angel还将深入到图计算和深度学习领域,借助开源的力量,做出更多的探索,无论是Wider还是Deeper的模型,Angel都希望能像天使一样,在多个机器学习框架上为它们提速,帮助业务提升效果。

## 参考资料

[^1]:[面向高维度的机器学习计算框架-Angel](http://data.qq.com/article?id=2972)

[^2]:[腾讯大数据第三代高性能计算平台-Angel](https://mp.weixin.qq.com/s?__biz=MzA3MDQ4MzQzMg==&mid=2665690569&idx=1&sn=4771de807a7ebe4a6d32edbda9223605&chksm=842bb94eb35c30581cc44e388b043fe35009807e6896f7c9b097831acca6a68e1e97a3160082&mpshare=1&scene=24&srcid=0616rnBd6b0tGp7Dxzk1HJSo&key=b10a7c153a57fbb9dc6ec9ef44a571c5f02d4baac3488f30f556e17fcbf531b83b89a5abe445ff1709963adaf90a5432984c3e4e1bead1cb675b7f65434b9f94efa553fbe8774e4f8364908b2e40b17b&ascene=0&uin=MTQ4OTIy&devicetype=iMac+MacBookPro11%2C4+OSX+OSX+10.11.6+build(15G1212)&version=12020810&nettype=WIFI&fontScale=100&pass_ticket=%2BZzpstZpbv0t%2BlQOxka2yD8BV5UzGorh8x2DInIIexE%3D)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容