您当前的位置:网站首页>三八线,Tensorflow结构是怎么支撑分布式练习的?,饥饿鲨进化破解版

三八线,Tensorflow结构是怎么支撑分布式练习的?,饥饿鲨进化破解版

2019-04-04 15:29:58 投稿作者:admin 围观人数:244 评论人数:0次

作者 | 杨旭东

转载自知乎《算法工程师的自我涵养》专栏

Me重生红楼种种田thods that scale with computation are the future of AI.

—Rich Sutton, 强化学习之父

大数据年代的互联网运用产生了许多的数据,这些数据就好比是石油,里边蕴含了许多常识等候被发掘。深度学习便是发掘数据中躲藏常识的利器,在许多范畴都取得了十分成功的运用。可是,许多的数据使得模型的操练变得复王水杂,运用多台设备散布式操练成了必备的挑选。

Tensorflow是现在比较盛行的深度学习结构,本文侧重介绍tensorflow结构是怎样支撑散布式操练的。

散布式操练战略

模型并行

所谓模型并行指的是将模型布置到许多设备上(设备或许散布在不同机器上,下同)运转,比方多个机器的GPUs。当神经网络模型很大时,由于显存约束,它是难以完好地跑在单个GPU上,这个时分就需求把模型分割成更小的部分,不同部分跑在不同的设备上,例如将网络不同的层运转在不同的设备上。

由于模型分割开的各个部分之间有相互依赖联络,因而核算功率不高。所以在模型巨细不算太大的情况下一般不运用模型并行。

安娜卡列尼娜
终极一家

在tensorf三八线,Tensorflow结构是怎样支撑散布式操练的?,饥饿鲨进化破解版low的术语中,模型并行称之为"in-graph replication"。

数据并行

数据并行在多个设备上放置相同的模型,各个设备选用不同的操练样本对模型操练。每个Worker具有模型的完好副本并且进行各自独自的操练。

图1. 数据并行示例

比较较模型并行,数据并行方法能够支撑更大的操练规划,供给更好的扩展性,因而数据并行是深度学习最常选用的散布式操练战略。

在tensorflow的术语中,数据并行称之为"between-graph replication"。

散布式并行形式

深度学习模型的操练是一个迭代的进程,如图2所示。在每一轮迭代中,前向传达算法会依据当时参数的取值核算三八线,Tensorflow结构是怎样支撑散布式操练的?,饥饿鲨进化破解版出在一小阎王部分操练数据上的猜测值,然后反向传达算法再依据丢失函数核算参数的梯度并更新参数。在并行化地操练深度学习模型时,不同设备(GPU或CPU)能够在不同操练数据上运转这个迭代的进程,而不同并行形式的差异在于不同的参数更新方法。

图2. 深度学习模型训韩非练流程图

数据并行能够是同三八线,Tensorflow结构是怎样支撑散布式操练的?,饥饿鲨进化破解版步的(synchronous),也能够是异步的(asynchronous)。

异步操练

异步操练中,各个设备完结一个mini-batch操练之后,不需求等候其它节点,直接去更新模型的参数。从下图中能够看到,在每一轮迭代时,不同设备会读取参数最新的取值,但由于不同设备读取参数取值的时刻不相同,所以得到的值也有或许不相同。依据当时参数的取值和随机获取的一小部分操练数据,不同设备各自运转反向读心神探传达的进程并独登时更新参数。能够简略地以为异步形式便是单机形式仿制了多份,每一份运用不同的操练数据进行操练。

图3. 异步形式深度学习模型操练流程图

异步操练总领会操练速度会快许多,可是异步操练的一个很严峻的问题是梯度失效问题(stale gradients),刚开端一切设备选用相同的参数来操练,可是异步情况下,某个设备完结一步操练后,或许发现模型参数现已被其它设备更新过了,此刻这个设备核算出的梯度就过期了。由于梯度失效问题,异步操练或许堕入次优解(sub-optimal training performance)。图4中给出了一个详细的样例来阐明异步形式的问题。其间黑三八线,Tensorflow结构是怎样支撑散布式操练的?,饥饿鲨进化破解版色曲线展现了模型的丢失函数,黑色小球表明了在t0时刻参数所对应的丢失函数的巨细。假定两十分协助个设备d0和d1在时刻t0一起读取了参数的取值,那么设备d0和d1核算出来的梯度都会将小黑球向左移动。假定在时刻t1设备d0现已完结了反向传达的核算并更新了参数,修改后的参数处于图4中小灰球的方位。可是这时的设备d1并不知道参数现已被更新了,所以在时刻t2时,设备d1会持续将小球向左移动,使得小球的方位到达图4中小白球的当地。从图4中能够看到,当参数被调整到小白球的方位葳蕤怎样读时,将无法到达最长处。

图4. 异步形式操练深度学习模型存在的问题示意图

在tensorflow中异步操练是默许的并行操练形式。

同步操练

所谓同步指的是一切的设备都是选用相同的模型参数来操练,等候一切设备的mini-batch操练完结后,搜集它们的梯度后履行模型的一次参数更新。在郯城天气预报同步形式下,一切的设备一起读取参数的取值,并且当反向传达算法完结之后同步更新参数的取值。单个设备不会独自对参数进行更新,而会等候一切设备都完结反向传达之后再一致更新参数 。

图5. 同步形式深度学习模型操练流程图

同步形式相当于通过聚合多个设备上的mini-batch构成一个更大的batch来操练模型,相对于异步形式,在同步模型下依据并行的worker数量线性添加学习速率会取得不错的作用。假如运用tensorflow estimator接口来散布式操练模型的话,在同步形式下需求恰当削减操练步数(相对于选用异步形式来说),不然需求花费较长的操练时刻。Tensorflow estimator接口仅有支撑的中止操练的条件就大局操练步数到达指定的max_steps。

Tensorflow供给了tf.train.SyncReplicasOptimizer类用于履行同步操练。通过运用SyncReplicasOptimzer,你能够很便利的结构一个同步操练的散布式使命。把异步操练改形成同步操练只需求两步:

下图能够一望而知地看出同步操练与异步操练之间的差异。

图6. 异步操练形式与同步操练形式的比照

同步操练看起来很不错,可是实践上需求各个设备的核算才能要均衡,并且要求集群的通讯也要均衡,类似于木桶效应,一个拖油瓶会严峻拖慢操练进展,所以同步操练方法相对来说操练速度会慢一些。

尽管异步形式理论上存在缺点,但由于操练深度学习模型时运用的随机梯度下降自身便是梯度下降的一个近似解法,并且即使是梯度下降也无法确保到达大局最优值。在实践运用中,在相一起刻内运用异步形式操练的模型不一定比同步形式差。所以这两种操练形式在实践中都有十分广泛的运用。

散布式操练架构

Parameter Server架构

Parameter server架构(PS架构)是深度学习最常选用的散布式操练架构。在PS架构中,集群中的节点被分为两类:parameter server和worker。其间parameter server寄存模型的参数,而worker担任核算参数的梯度。在每个迭代进程,worker从parameter sever中取得参数,然后将核算的梯度回来给parameter server,parameter server聚合从worker传回的梯度,然后更新参数,并将新的参数播送给worker。

图7. Parameter Server三八线,Tensorflow结构是怎样支撑散布式操练的?,饥饿鲨进化破解版架构

Ring AllReduce架构

PS架构中,当worker数量较多时,ps节点的网络带宽将成为体系的瓶颈。

Ring AllReduce架构中各个设备都是worker,没有中心节点来聚合一切worker核算的梯度。Ring AllReduce算法将 device 放置在一个逻辑环路(logical ring)中。每个 device 从上行的device 接纳数据,并向下行的 deivce 发送数据,因而能够充分利用每个 device 的上下行带宽。

图8. Ring AllReduce架构示例

运用 Ring Allreduce 算法进行某个稠密梯度的平均值的根本进程如下:

以 4 个 device上的梯度求和进程为例:

Sc三八线,Tensorflow结构是怎样支撑散布式操练的?,饥饿鲨进化破解版atterReduce 阶段:

图9. Ring-AllReduce算法的ScatterReduce阶段

通过 num直_devices - 1 轮后,每个 device礼物 上都有一个 tensor 分片进qq红包得到了这个分片各个 device 上的和。

AllGather 阶段:

图10. R三八线,Tensorflow结构是怎样支撑散布式操练的?,饥饿鲨进化破解版ing-AllReduce算法的AllGather阶段

通过 num_devices - 1 轮后,每个 device 上都每个 tensor 分片都得到了这个分片各个 device 上的和;

由上例能够看出,通讯数据量的上限不会随散布式规划变大而变大,一次 Ring Allreduce 中总的通讯数据量是:

比较PS架构,Ring Allreduce架构是带宽优化的,由于集群中每个节点的带宽都被充分利用。此外,在深度学习操练进程中,核算梯度选用BP算法,其特色是后面层的梯度先被核算,而前面层的梯度慢于前面层,Ring-allreduce架构能够充分利用这个特色,在前面层梯度核算的一起进行后面层梯度的传递,然后进一步削减操练时刻。Ring Allreduce的操练速度根本上线性正比于GPUs数目(worker数)。

201林雪惠7年2月百度在PaddlePaddle渠道上初次引入了ring-allred江苏体彩七位数uce的架构,随后将其提交到tensorflow的contrib package中。同年8月,Uber为tensorflow渠道开源了一个愈加易用和高效的ring allreduce散布式操练库Horovod。最终,tensorflow官方总算也在1.11版别中支撑了allreduce的散布式操练战略CollectiveAllReduceStrategy,其跟estimator合作运用十分便利,只需求结构tf.estimator.RunConfig目标时传入CollectiveAllReduceStrategy参数即可。

图11. 运用CollectiveAllReduceStrategy的伪代码

散布式tensorflow

引荐运用 TensorFlow Estimator API 来编写散布式操练代码,理由如下:

要让tensorflow散布柏雪失踪前恐惧照片式运转,首要咱们需求界说一个由参加散布式核算的机器组成的集群,如下:

cluster = {'chief': ['host0:2222'],

'ps': ['host1:2222', 'host2:2222'],

'worker': ['host3:2222', 'host4:2222', 'host5:2222']}

集群中一般有多个worker,需求指定其间一个worker为主节点(cheif),chief节点会履行一些额定的作业,比方模型导出之类的。在PS散布式架构环境中,还需求界说ps节点。

要运转散布式Estimato瑶心魅r模型,只需求设置好TF_CONFIG环境变量即可,可参阅如下代码:

# Example of non-chief node:

os.environ['TF_CONFIG'] = json.dumps(

{'cluster': cluster,

'task':东芝 {'type': 'worker', 'index': 1}})

# Example of chief node:

os.environ['TF_CONFIG'] = json.dumps(

{'cluster': cluster,

'task': {'type': 'chief', 'index': 0}})

# Example of evaluator node (evaluator is not part of training cluster)

os.environ['TF_CONFIG'] = json.dumps(

{'cluster': cluster,

'task': {'type': 'evaluator', 'index': 0}})

界说好上述环境变量后,调用tf.estimator.train_and_evaluate即可开端散布式操练和评价,其他部分的代码跟开发单机的程序是相同的,

能够参阅下面的材料:

原文链接:

https://zhuanlan.zhihu.com/p/56991108

(本文为 AI科技大本营转载文章,转载请联络原作者)

征稿

开发 互联网 科技
声明:该文观念仅代表作者自己,搜毛豪杰老公是谁狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。
the end
克服消费痛点,最具性价比的车型,你值得拥有