Angel是一个基于参数服务器(Parameter Server)开发的高性能分布式机器学习平台,它基于腾讯内部的海量数据进行了反复的调优。
Angel的核心设计理念围绕模型,将高维度的大模型切分到多个参数服务器节点,并通过高效的模型更新接口和运算函数,以及灵活的同步协议,轻松实现各种高效的机器学习算法。
Angel基于Java和scala开发,能在Yarn上直接调度运行,并基于PS Service,支持Spark on Angel,集成了部分图计算和深度学习算法。
Angel-PS实现了基于参数服务器的矩阵计算,将分布在多台PS Server上的参数矩阵抽象为PSModel,只需要完成PSModel的定义、实现其计算过程,就可以实现一个运行在参数服务器上的简单算法。
简单的angel-ps架构如下图所示
-
PS是存储矩阵参数的多台机器,向计算节点提供矩阵参数的拉取、更新服务
-
每个worker是一个逻辑计算节点,一个worker可以运行一或多个task

机器学习的算法,一般以迭代的方式训练,每次迭代worker从PS拉取最新的参数,计算一个更新值,推送给PS
Angel整体架构

angel的架构分为三大模块:
1、 Parameter Server层:提供通用的参数服务器服务,负责模型的分布存储,通讯同步和协调计算,并通过PSAgent提供PS Service
2、worker层:基于Angel自身模型设计的分布式运行节点,自动读取并划分数据,局部训练出模型增量,通过PS Client和PS Server通信,完成模型训练和预测。一个worker包含一个或多个Task,Task是Angel计算单元,这样设计的原因是可以让Task共享Worker的许多公共资源。
3、Model层,这是一层虚拟抽象层,并非真实存在的物理层。关于Model的Push和Pull,各种异步控制,模型分区路由,自定义函数。。。是联通Worker和PSServer的桥梁。
除了这三个模块,还有2个很重要的类,
1、Client:Angel任务运行的发起者
-
启动和停止PSServer
-
启动和停止Angel的Worker
-
加载和存储模型
-
启动具体计算过程
-
获取任务运行状态
2、Master:Angel任务运行的守护者
-
原始计算数据以及参数矩阵的分片和分发
-
向Gaia申请Worker和ParameterServer所需的计算资源
-
协调,管理和监控Worker以及PSServer
通过上述设计,Angel实现了可扩展架构
-
PSServer层:通过PS-Service,提供灵活的多框架PS支持
-
Model层:提供PS必备的功能,并支持对性能进行针对性优化
-
Worker层:能基于Angel自主API,进行算法开发和创新的需求
Angel代码结构

1、
Angel-Core:核心层
Angel的核心层,包含如下组件:
-
PSServer
-
PSAgent
-
Worker
-
AngelClient
-
网络:RPC & RDMA
-
存储:Memory & Disk
2、
Angel-ML:机器学习层
Angel是面向机器学习的,所以机器学习相关的元素也加入到core层,只是在一个单独的目录下
-
Matrix
-
Vector
-
Feature
-
Optimizer
-
Objective
-
Metric
-
psFunc
要注意的是,在Core包中的ML层,大都是底层的基础接口,而相关的扩展和实现,还是在具体的算法层
3、
Angel-client:接口层
基于Angel本身的接口,开发了多个算法:
-
SVM
-
LR (各种优化方法)
-
KMeans
-
GBDT
-
LDA
-
MF(矩阵分解)
-
FM(因式分解机)
3.0版本又增加了很多算法,后续熟练后再补充
Angel的算法开发思路比较直接,都是围绕着PS上的模型进行,不停更新。算法的实现技巧也比较灵活,追求最优的性能
整体上,通过这4个层级的代码,用户可以全方位的积木式进行代码的设计,开发出高效的机器学习代码
Angel在设计上,考虑到现有的机器学习框架众多的问题,提供了2种模式。Angel支持两种运行模式:
ANGEL_PS_WORKER和ANGEL_PS_SERVICE。
通过这2种方式结合Angel本身的worker模式,追求最大化的性能优势,主打速度。而PS-Service模式,主打对接,可以接入Spark,TensorFlow,Torch等平台,主打生态,从而实现最大程度的灵活性
-
Angel_PS_Worker:启动master,PS和Worker,Angel独立完成模型的训练
-
Angel_PS_service:PS Service模式,在这种模式下,Angel只启动Master和PS,具体的计算交给其他计算平台(如Spark,TensorFlow)负责,Angel只负责提供Parameter Server的功能
同步协议:
-
Angel支持多种同步协议:除了通用的BSP(Bulk Synchronous Parallel)外,为了解决task之间互相等待的问题,Angel还支持SSP(Stale Synchronous Parallel)和ASP(Asynchronous Parallel)
易用性:
-
训练数据和模型自动切割:Angel根据配置的worker和task数量,自动对训练数据进行切分,同样,也会根据模型大小和PS实例数量,对模型实现自动分区。
-
易用的编程接口:MLModel、PSModel、AngelClient
扩展性:
-
psFunc:为了满足各类算法对参数服务器的特殊需求,Angel将参数获取和更新过程进行了抽象,提供了psf函数功能。用户只需要继承Angel提供的psf函数接口,并实现自己的参数获取/更新逻辑,就可以在不修改Angel自身代码的情况下定制自己想要的参数服务器的接口。
-
自定义数据格式:Angel支持Hadoop的InputFormat接口,可以方便的实现自定义文件格式。
-
自定义模型切分方式:默认情况下, Angel将模型(矩阵)切分成大小相等的矩形区域;用户也可以自定义分区类来实现自己的切分方式
稳定性:
Angel保证在机器学习过程中,单个worker和PS挂掉,都不会影响整个作业的进度,而且能最快的找到备用的机器,快速启动,加载模型或者数据,继续训练过程。
-
PS容错:PS容错采用了checkpoint模式,也就是每隔一段时间将PS承载的参数分区写到hdfs上。如果一个PS实例挂掉,Master会新启动一个PS实例,新启动的实例会加载挂掉PS实例写的最近的一个checkpoint,然后重新开始服务。这种方案的优点是简单,借助了hdfs多副本容灾,缺点是不可避免的会丢失少量参数更新
-
worker容错:一个worker实例挂掉后,Master会重新启动一个Worker实例,新启动的Worker实例从Master处获取当前迭代轮数等状态信息,从PS处获取最新模型参数,然后重新开始被断掉的迭代。
-
Master容错:Master定期将任务状态写入hdfs,借助于Yarn提供的App Master 重试机制,当Angel的Master挂掉后,Yarn会重新拉起一个Angel的master,新的Master加载状态信息,然后重新启动Worker和PS,从断点出发重新开始计算。
-
慢worker检测:Master将会收集一些Worker计算性能的一些指标,如果检测到有一些worker计算明显慢于平均计算速度,Master会将这些worker重新调度到其他的机器上,避免这些worker拖慢整个任务的计算进度。
Angel拥有两种不同的运行模式:
ANGEL_PS_WORKER和ANGEL_PS
在angel_ps_worker模式下,angel可以独立完成模型的训练和预测等计算任务;在angel_ps模式下,angel启动ps服务,为其他的计算平台提供参数的存储和交换服务。目前基于angel_ps运行模式的是spark on angel,而且比较好的解决了Spark ML的单点瓶颈,能够支持很大规模的模型训练
Spark on Angel
Angel从1.0开始,就加入了PS-Service的特性,不仅仅可以作为一个完整的PS框架运行,也可以作为一个PS-Service,为不具备参数服务器能力的分布式框架,引入PS能力。Spark就是第一个尝试。spark on angel可以很方便的利用spark在数据分析方面的优势,在一个平台中完成数据预处理和模型训练两阶段的计算任务。
sona架构设计