前一篇文章中,我们提到了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做了如下工作:

  1. 引入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的计算一起来运行,极大减少了模型同步的时间。

  2. 引入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的快速演进,各种结构乃至算法的引入也是非常可能的事情,分布式深度学习系统,仍然在快速演进之中。

[1] Strategies and Principles of Distributed Machine Learning on Big Data, Eric P. Xing, Qirong Ho, Pengtao Xie, Wei Dai.arXiv:1512.09295 (2015)

[2] https://github.com/adatao/tensorspark

[3] https://github.com/tensorflow/tensorflow/tree/master/tensorflow/core/distributed_runtime

[4] Poseidon: A System Architecture for Efficient GPU-based Deep Learning on Multiple Machines, Zhang, Hao and Hu, Zhiting and Wei, Jinliang and Xie, Pengtao and Kim, Gunhee and Ho, Qirong and Xing, Eric, arXiv preprint arXiv:1512.06216

[5] GeePS: Scalable deep learning on distributed GPUs with a GPU-specialized parameter server, Cui, Henggang and Zhang, Hao and Ganger, Gregory R and Gibbons, Phillip B and Xing, Eric P, Proceedings of the Eleventh European Conference on Computer Systems, 2016

[6] https://github.com/yahoo/CaffeOnSpark

[7] Deep Learning At Scale and At Ease, Wang, Wei and Chen, Gang and Chen, Haibo and Dinh, Tien Tuan Anh and Gao, Jinyang and Ooi, Beng Chin and Tan, Kian-Lee and Wang, Sheng, arXiv preprint arXiv:1603.07846

[8] https://blog.twitter.com/2016/distributed-learning-in-torch

[9] Deep learning with Elastic Averaging SGD, Sixin Zhang, Anna Choromanska, Yann LeCun, arXiv preprint arXiv:1412.06651

[10] Communication Efficient Distributed Machine Learning with the Parameter Server, Li, Mu and Andersen, David G and Smola, Alex J and Yu, Kai, NIPS 2014

[11] 1-bit stochastic gradient descent and its application to data-parallel distributed training of speech DNNs, Seide, Frank and Fu, Hao and Droppo, Jasha and Li, Gang and Yu, Dong, INTERSPEECH 2014

原文链接:http://chuansong.me/n/316789851542

深度学习平台的分布式实现综述相关推荐

  1. 英特尔分布式深度学习平台Nauta-安装、配置与管理指南

    2019独角兽企业重金招聘Python工程师标准>>> 英特尔分布式深度学习平台Nauta-安装.配置与管理指南 随着人工智能的发展,深度学习的价值不断增长,但实现它可能是一个复杂耗 ...

  2. 英特尔为 Kubernetes 推出分布式深度学习平台:Nauta

    2019独角兽企业重金招聘Python工程师标准>>> 随着人工智能的发展,深度学习的价值不断增长,但实现它可能是一个复杂耗时的过程.英特尔(Intel)正寻求通过其在 Kubern ...

  3. 英特尔贡献基于 Kubernetes 分布式深度学习平台:Nauta

    随着人工智能的发展,深度学习的价值不断增长,但实现它可能是一个复杂耗时的过程.英特尔(Intel)正寻求通过其在 Kubernetes 进行分布式深度学习的新开源平台来改变这一状况,该深度学习平台称为 ...

  4. 【深度学习】老师木讲架构:深度学习平台技术演进

    新智元推荐   来源:OneFlow [新智元导读]近日,袁进辉(老师木)代表OneFlow团队在全球互联网架构大会上海站做了<深度学习平台技术演进>的报告.报告包括深度学习的计算力问题. ...

  5. 深度学习模型压缩与加速综述!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:Pikachu5808,编辑:极市平台 来源丨https://zh ...

  6. 微博深度学习平台架构和实践

    深度学习平台介绍: 什么是深度学习框架? 深度学习框架是进行深度学习的工具.简单来说,一套深度学习框架就是一套积木,各个组件就是某个模型或算法:开发者通过简单设计和组装就能获得自己的一套方案.深度学习 ...

  7. 感悟:微博深度学习平台架构和实践

    TensorFlow.Caffe和MXNet是三大主流的深度学习开源框架:TensorFlow的优势是社区最活跃,开源算法和模型最丰富:Caffe则是经典的图形领域框架,使用简单,在科研领域占有重要地 ...

  8. 第五十六期:百度CTO王海峰CNCC2019演讲:深度学习平台支撑产业智能化

    百度CTO王海峰在会上发表题为<深度学习平台支撑产业智能化>的演讲,分享了百度关于深度学习技术推动人工智能发展及产业化应用的思考,并深度解读百度飞桨深度学习平台的优势,以及与百度智能云结合 ...

  9. 一口气发布11项新升级,免费送出1亿元算力:国产深度学习平台PaddlePaddle大更新...

    郭一璞 夏乙 发自 香格里拉 量子位 出品 | 公众号 QbitAI 深度学习框架里的唯一国货PaddlePaddle,集中迎来一大波更新. 百度PaddlePaddle全景图也首次曝光. 在框架核心 ...

最新文章

  1. 关于python 中的__future__模块
  2. Kali Linux打开多个终端窗口
  3. 自动化电子测试软件,自主开发的MIL测试自动化测试工具
  4. lib60870-IEC 60870-5-101 / 104 协议对总查询的处理
  5. 在阿里淘系6个月能有哪些收获成长?
  6. lumen 下使用自定义配置文件
  7. 3.从Paxos到Zookeeper分布式一致性原理与实践---Paxos 工程实践
  8. MSDN URL 重写
  9. tsp遗传算法 c语言,遗传算法解决TSP问题
  10. (附源码)ssm心理咨询服务平台 毕业设计 324615
  11. android地球经纬度平面图,地球经纬度划分图高清 怎么划分经纬度
  12. 个人网站可以申请微信授权登录吗
  13. 一个故事看懂计算机操作系统的进化史
  14. 第二章 Silicon labs EFR32 MG21 验证蓝牙的私有Characteristic的读/写
  15. MCU学习——无线遥控模块
  16. 淘宝彩票移动项目开发实践
  17. 计算机网络中型网吧规划设计,中小型网咖网络规划设计开题报告
  18. 卷积神经网络的训练过程,卷积神经网络如何训练
  19. 搜狗输入法中英文都默认使用英文标点设置
  20. Linux系统之部署Rsyslog 日志服务器

热门文章

  1. GDAL——命令使用专题——gdalinfo命令
  2. spring cloud gateway获取真实ip以及跨服务器时路由转发的一些问题
  3. 【Android取证篇】华为手机OTG备份密码重置教程
  4. bixby怎么编程_Bixby将优先考虑Yahoo和AOL内容,因为三星获得了报酬
  5. 扫地机器人朋友圈文案_扫地机器人的简单文案
  6. 使用python itchat模块实现微信聊天机器人_code
  7. 【“计算机科学与技术”专业小白成长系列】计算机科学与技术主要学什么?
  8. 锁子甲 bulid+sim
  9. MFC设置应用程序图标
  10. 数据库分类和负载均衡方案