靠谱 的软件外包伙伴

您的位置:首页 > 新闻动态 > 深度学习平台软件开发的分布式实现案例

深度学习平台软件开发的分布式实现案例

2016-05-04 11:54:49

前一篇文章中,我们提到了Eric Xing教授针对如何构建大规模机器学习平台的综述[1],包含数据并行,模型并行等,那么具体到深度学习来说,应当如何有效构建呢?本文在这方面做个简要概述。

如果模型能够在单个节点装下,那么采用数据并行是最适合的,利用DownpourSGD(既DistBelief)结构的参数服务器可以很容易实现分布式深度学习,这种方式很适合于大量数据和较小模型的训练方式。

深度学习平台的分布式实现综述

例如项目[2]就是采用这种思路的工作,用Python实现了简单的参数服务器结构,从而让TensorFlow可以运行在Spark上:

深度学习平台的分布式实现综述

Spark Worker启动单机版的Tensorflow异步计算梯度,周期性把梯度发给Driver,就是参数服务器,在汇总多个Worker的梯度后,参数服务器把梯度数据返回给Worker。这种方式的并行实现简单,但Driver(参数服务器)很容易引起网络通信的开销进而影响到伸缩性。

Yahoo也在早些时候开源了让Caffe运行在Spark上的工作:Caffe On Spark[6],

深度学习平台的分布式实现综述

从结构和代码上来看,不仅采用RDMA互联,甚至还是基于AllReduce的BSP全同步架构,因此这个项目主要还是解决了Spark跑深度学习的有无问题,不认为有很大的参考价值。

另外两个知名的深度学习框架Torch和MXNet,也同样支持分布式训练。例如Twitter在Torch框架上提供了AutoGrad[8],同时提供AllReduceSGD和AllReduceEA接口,其中后者是异步实现,提供了一个区别于DownpourSGD的异步SGD实现EASGD(Elastic Average SGD),该算法是Yan LeCun团队的成果,仍然架构在参数服务器基础之上,跟DownpourSGD相比,EASGD把Worker节点上的参数跟参数服务器的中心变量联系在一起,这样使得Worker本地的变量会围绕中心变量进行变化,从理论上可以证明比DownpourSGD有更快的收敛和更小的数据传输,证明可以参见文献[9],也就是说,通过更快收敛来达到节省带宽传输的目的。

同Torch一样,MXNet也只提供数据并行的训练方式。MXNet依赖于PS-Lite提供分布式模型训练,因此我们可以直接看PS-Lite,正如本号在之前介绍过的,这是李沐和DMLC团队实现的参数服务器架构,相比之前的DistBelief提供了更加通用的架构:在设计上包含一个Server Group和若干个Worker Group,Server Group用来做参数服务器,每个Server Node存放一个参数分片,由Server Manager管理整个Server Group,维持整个Server Group的元数据的一致性视图,以及参数分片情况。 每个Worker Group运行一个应用,Worker Node只跟Server Node通信用来更新参数,Worker Node之间没有任何交互。每个Worker Group内有一个调度器,负责给Worker Nodes分配任务以及监控,如果有Worker Node挂掉或者新加入,调度器负责重新调度剩余的任务。PS-Lite针对网络带宽的优化主要是针对Server之间的参数复制提供了采用先聚合再复制的方式:

深度学习平台的分布式实现综述

Server之间复制主要是为容错考虑,因此Worker和Server之间的数据传输仍依赖参数服务器本身异步机制带来的带宽节省:在应用于深度学习时,主要借助于称作Delayed Block Proximal Gradient的方法:每次迭代只更新一个block的参数;Worker节点计算梯度的同时还需要计算特定坐标的学习速率,既该block的二阶偏导数的对角线。在数据传输时,PS-Lite还会引入部分定义的Filter来避免传输对模型影响不大的参数,例如Random Skip或者KKT Filter,引入这些Filter可以让传输的模型参数量减少十倍以上。关于Delayed Block Proximal Gradient的收敛证明,可以参见李沐的文章[10]。

Apache旗下的SINGA[7]从一开始设计就考虑了分布式架构。系统包含若干Server Group和Worker Group。每个Server Group维护完整的模型参数,相邻的Server Group定期同步模型参数。每个Worker Group负责计算,在数据并行中,每个Worker Group负责一个训练数据的分片,所有的Worker Group节点跟Server Group之间异步通信,然而在Worker Group内部,则是同步处理,因此这是一个典型的参数服务器结构。SINGA值得称道之处在于同时支持数据并行和模型并行,以及混合并行(两种并行的组合),在模型并行时,每个Worker Group只负责更新部分模型参数。

深度学习平台的分布式实现综述

SINGA的架构非常灵活,可以根据需要满足不同模式的分布式计算,除了类似DownpourSGD的结构之外,还可以配置成AllReduce,Sandblaster,Distributed Hogwild等不同范式。

深度学习平台的分布式实现综述

在采用SINGA训练深度学习模型时,需要根据模型特点决定如何采用数据并行和模型并行,从而减少网络带宽造成的瓶颈,例如选取具有低维特征的神经网络层作为Worker Group的边界,减少Worker之间的数据传输;选取神经网络层之间依赖小的部分应用模型并行等。凭借多样化的并行机制,SINGA尽管并不那么知名,但入围Apache项目还是有其值得称道之处的。

TensorFlow官方近期也放出了分布式版本[3]。TensorFlow没有采用Google第一代大规模深度学习系统的DistBelief,而是把任务组织成图结构,然后分解成子图分布到不同节点执行。

深度学习平台的分布式实现综述

从上图可以看到,在数据并行时,结构上仍然采用参数服务器,因此,Tensorflow在设计初主要考虑易用性,基于DistBelief提供对算法更好的抽象能力。目前尚没有看到TensorFlow在减少数据传输消耗方面做的工作。尽管TensorFlow在2015年发布的白皮书上声称同时提供数据并行和模型并行,但在当前的代码仓库里只看到前者(如有错误请指出)。

接下来一个不能不提的工作是微软的CNTK。CNTK只提供数据并行,它采用参数服务器模型实现了一种称为1-Bit Quantized SGD的算法,其目的就是用于节约带宽,算法的细节可以参见文献[11],其主要思想是压缩梯度的表示到只用1bit,把残差带到下一次的minibatch中。相比用浮点数(32位)表示梯度值,1-Bit SGD相当于节约了30多倍的传输带宽。

上面简要介绍了几个分布式深度学习框架的设计,其中重要一点都着力于网络传输的节省。下面介绍一个进一步优化这方面的工作,并且声称能够在普通以太网结构上运行的分布式深度学习系统。

首先看下以太网卡和Infiniband的吞吐量差别:

深度学习平台的分布式实现综述

典型深度学习任务的数据量

深度学习平台的分布式实现综述

以AlexNet为例,假设有8个节点,每个节点都安装1个GPU,那么Master每秒需要接收490M的浮点参数,同时也要发送这么多参数来确保Worker的下一轮迭代不至于被阻塞。参照前表,这些数字都超过了常规千兆甚至万兆以太网的带宽,naive的实现,是必须借助昂贵的Infiniband设备的。

因此,像TensorSpark这样简单实现参数服务器用于分布式深度学习训练的解决方案,是没有办法在常规网络硬件,特别是云计算提供商上跑大规模集群的。如何限制网络带宽,成为分布式深度学习设计中一个重要的考虑因素。在前一篇的公众号文章里我们提到了Eric Xing教授的Petuum项目,那么它应用在深度学习上是如何的呢?这里有一个Petuum和单机版深度学习Caffe的项目Poseidon[4],我们来看看这方面的设计。

深度学习平台的分布式实现综述

图中的Server就相当于DownpourSGD的Master,Clients则相当于Worker。跟DownpourSGD这样的基本参数服务器构型不同,Poseidon有所差别:首先,在每个Worker节点上增加了额外的一层,允许单节点运行多个线程任务,这主要是针对多CPU和多GPU的设计,方便任务线程绑定到1个CPU或者1个GPU。其次,Poseidon不仅允许Master和Worker之间的参数更新,还允许不同的Worker之间通信。为了减少网络开销,Poseidon做了如下工作:

引入Wait-free BP算法。BP算法是神经网络里最基本的算法,在后向传播过程中,错误消息E从神经网络的顶层一直传播到底层。每次迭代,每个Worker分别进行BP算法,只有当传播到达底层时,每个Worker才开始通信—把本地的参数更新发送到Master然后等待Master聚合各节点梯度后返回。以图来表示如下,其中push和pull就是跟参数服务器Master之间的交互。

深度学习平台的分布式实现综述

Wait-free BP算法主要用来减少等待和参数同步的时间。当第i+1层完成计算,把它的错误消息E_i+1传播到前一层i时,它的梯度已经能够发送,参数也可以更新。因为每层都有独立的参数,后续较低层(1,...,i)的计算并不影响较高层(i+1,...,L),因此,较高层的参数更新也不会影响较低层。

深度学习平台的分布式实现综述

Wait-free BP算法强制每层在它的梯度计算出来之后就开始通信,并且允许每层的参数部分更新,在理想情况下,当传播到达网络顶层时,通信和激素啊都已经完成,Worker可以开始下一轮迭代。以卷积神经网络为例子,底层的CONV(堆栈卷积层)是主要计算产生的地方,但参数只占据模型的10%,顶层的FC(全连接层)模型参数占据90%。采用Wait-free BP算法,把FC层的通信和CONV的计算一起来运行,极大减少了模型同步的时间。

引入SACP(Structured-Aware Communication Protocol)协议。这个协议一看名字就是专门针对带宽消耗设计的。该协议是专门针对矩阵型参数的机器学习模型来设计的——深度学习的参数就是典型的矩阵结构。以AlexNet为例,两个FC全连接层fc6和fc7之间的参数权重就是个4096*4096的矩阵。每次迭代时,都需要在Master和Worker之间交换这样2个矩阵。随着模型和集群的增大,交换的参数矩阵会更加庞大。

为减少带宽消耗,首先,Poseidon引入Worker之间的通信,称为SFB(Sufficient Factor Broadcasting)。在Worker和Master之间传递的矩阵参数∇W,可以通过矩阵分解写为∇W =uv',u,v'就是所谓Sufficient Factor,而u,v'可以通过直接从Worker节点之间的通信中获得,通过把矩阵转化为向量,减少了通信开销。随着集群节点的增多,这种手段也会带来副作用,因为P2P通信的成本会上升。

基于此Poseidon提出了SACP协议本身,这是一个混合Master/Worker之间通信和SFB的方案,它会动态决定是选取前者还是后者来进行参数交换,因此,在前边的Poseidon框图里我们看到了Bandwidth Manager,就是起这个作用。

因此,从设计上,我们可以看到基于Petuum的Poseidon为网络带宽消耗做了大量优化。在随后Eric Xing团队的进一步的工作中又提出了专门针对GPU集群的参数服务器,其目的主要在于让参数服务器更有效利用GPU内存,由于工作还未开源,因此不多提及,有兴趣者可直接阅读文献[5]。

可以看到,优化分布式的深度学习,可以从算法和结构两个角度来进行,前者通过加快收敛速度从而降低分布式开销,后者则从根本上去解决分布式深度学习面临的挑战。就目前看来,SINGA和Petuum都是在结构设计上值得深入研究的系统,而在未来,随着TensorFlow的快速演进,各种结构乃至算法的引入也是非常可能的事情,分布式深度学习系统,仍然在快速演进之中。

 

关于:中科研拓

深圳市中科研拓科技有限公司专注提供软件外包、app开发、智能硬件开发、O2O电商平台、手机应用程序、大数据系统、物联网项目等开发外包服务,十年研发经验,上百成功案例,中科院软件外包合作企业。通过IT技术实现创造客户和社会的价值,致力于为用户提供最佳的软件解决方案。联系电话400-0316-532,邮箱sales@zhongkerd.com,网址www.zhongkerd.com


  上一篇   [返回首页] [打印] [返回上页]   下一篇