概述

参数服务器是分布式机器学习框架中用来作为参数同步的框架,现在很多大规模的分布式机器学习都采用参数服务器架构用来进行参数的同步以提升大规模的模型的速度和效率。由于我们现在正处于一个大数据的时代,如何结合海量数据和超大规模的模型进行应用?比如现在以小视频和短视频(时序特征+内容特征+用户等多维度特征巨大)为主的推荐、广告、视频算法、搜索等都要采用大规模分布式机器学习系统,比如短视频为主的多模态学习更是需要大规模的分布式机器学习来快速满足产品场景化需求、画像更新、视频流算法、智能化内容创作、聚类、灰度算法及时调整、老用户的运营模型以及如何将流量转为价值过程中的模型,大规模分布式机器学习系统都充当了底层基石。**分布式学习系统包括两大模块:模型和分布式系统。**其中模型需要解决训练和正确率的问题,分布式系统需要考虑并行、网络、慢机、故障处理、调度、数据一致性等问题。最近在看mxnet的源码,我们一起学习一下参数服务的架构和设计,更为详细的可以参考mxnet官网。

现有系统的不足

MapReduce:迭代式计算低效,节点之间通信效率不高

MPI:无法支撑大数据,任意节点挂掉,任务就失败,多节点共享内存的方式以及测试比较复杂和调试困难

Graph:用图来做抽象,类似深度学习无法高效求解,只能同步,不支持异步

Spark:通用框架,高维度和稀疏数据支持不够,Spark的并行梯度下降方法是同步阻断式的,且模型参数需通过全局广播的形式发送到各节点

2014年分布式可扩展的Parameter Server被沐神(李沐)提出,几乎完美的解决了机器模型的分布式训练问题,现在我们常说的Parameter Server属于第三代参数服务器。其特点如下:

  • Efficient Communication:异步通信模型,最优化机器学习任务来减少网络负担。
  • Flexible Consistency Models:允许算法设计者去平衡算法收敛率与系统效率。
  • Elastic Scalability:在无需重启运行中的框架下便可添加新节点。
  • Fault Tolerance and Durability
  • Ease of Use

综合考虑性价比高的选择是参数服务器(Parameter Sever),其架构如下图所示:

参数服务器

其算法如下:

参数服务器算法

工作原理

参数服务器结点中包含一个服务器管理者结点, 该管理者结点负责维护服务器各结点元数据的一致性,管理 服务器各结点的生命周期以及分配资源.工作结点负责处理 数据,一个工作结点处理一部分训练数据,计算局部梯度并进 行数据分析,各工作结点间互不通信.任务调度管理器为对 应工作结点下的机器分配工作负载并监督机器处理的进程, 增删工作结点时,任务调度器为它们重新分配未完成的任务.工作结点之间独立运行,可实现多租户模式,不同类型的应用 可在不同工作结点中并行运行,同类型的应用也可同时分配 到多个工作结点中同步执行以提高并行性.参数服务器模型由工作结点和服务器端参数服务器结点 组成,工作结点和服务器结点都各自包含多台机器.服务器结 点下的每台机器都包含一部分全局的共享参数。如下图所示:

参数共享

补充两个小概念:数据并行和模型并行

**Model Parallelism:**可以理解为单个的模型分布在多个机器上。将深度神经网络放在多台机器上并行训练所能获得的性能提升效果主要取决于模型的结构。具有大量参数的模型通常可以获得更多CPU内核和内存,因此,并行化大型模型会显著提高性能,从而缩短训练时间。

**Data Parallelism:**减少训练时间的一般思路是,采用n个workers同时并行计算n个不同的数据块(partitions,分区),来优化一个central model的参数。在这种情况下,把n个模型副本放在n个处理节点上,即每个节点(或进程)都拥有一个模型的副本。然后,每个worker使用指定的数据块来训练一个局部的模型副本。但是,可以让所有的workers同时一致工作,优化同一个目标。

模型参数

模型参数默认采用<key,value>集合,key 就是 feature ID(slotId),value 是其权值。对于不存在的key,可认为其权值为0。也有对<key,value>进行抽象的。

接口

workers和servers之间通信是通过 push() 和 pull() 方法进行的。worker通过 push() 将计算好的梯度发送到 server,然后通过 pull() 从 server 获取更新参数。

为了提高通信效率,PS允许用户使用 Range Push/Range Pull 操作。

1
2
w.push(R, dest)
w.pull(R, dest)

同步协议

Parameter Server 一般会提供如下三个级别的异步控制协议: BSP(Bulk Synchronous Parallel),SSP(Stalness Synchronous Parallel) 和 ASP(Asynchronous Parallel), 它们的同步限制依次放宽。为了追求更快的计算速度,算法可以选择更宽松的同步协议。

同步协议

1. BSP

一般的分布式计算采用的同步协议,例如 Spark。在每一轮迭代中都需要等待所有的Task计算完成。

  • 优点:适用范围广;每一轮迭代收敛质量高
  • 缺点:但是每一轮迭代都需要等待最慢的Task,整体任务计算时间长

2. SSP

允许一定程度的Task进度不一致,但这个不一致有一个上限,我们称之为 staleness 值,即最快的Task最多领先最慢的Task staleness 轮迭代。

  • 优点:一定程度减少了Task之间的等待时间,计算速度较快
  • 缺点:每一轮迭代的收敛质量不如BSP,达到同样的收敛效果可能需要更多轮的迭代;适用性也不如BSP,部分算法不适用

3. ASP

Task之间完全不用相互等待,先完成的Task,继续下一轮的训练。

  • 优点:消除了等待慢Task的时间,计算速度快
  • 缺点:适用性差,在一些情况下并不能保证收敛性

工业界参数服务器

我们看下腾讯的参数服务器:

Angel

  1. Parameter Server层:提供通用的参数服务器服务,负责模型的分布存储,通讯同步和协调计算,并通过PSAgent提供PS Service
  2. Worker层: 基于Angel自身模型设计的分布式运行节点,自动读取并划分数据,局部训练出模型增量,通过PS ClientPS Server通信,完成模型训练和预测。一个Worker包含一个或者多个Task,Task是Angel计算单元,这样设计的原因是可以让Task共享Worker的许多公共资源。
  3. Model层: 这是一层虚拟抽象层,并非真实存在的物理层。关于Model的Push和Pull,各种异步控制,模型分区路由,自定义函数……是连通Worker和PSServer的桥梁。

蚂蚁金服的参数服务器如下:

PS

  1. 内置Failover机制,稳健性大大提升;
  2. 架构中有多个Server,模型的可扩展性非常强;
  3. 完美支持同步和异步,可以达到更快的收敛速度,同时不影响模型的精度;
  4. 同时在稀疏性的上支持,让worker和server节点在通信效率上大幅度提升。

参考链接

1.参数服务器参考

2.分布式机器学习平台与算法-舒娜

3.参数服务器参考