kan*_*hka 2 distributed tensorflow
我已经完成了这个 答案,但它没有给出在Between-Graph复制中选择多个客户端以提高性能的基本原理.与In-Graph复制相比,如何使用Between-Graph复制提高性能?
图中复制适用于同一台机器上的多个设备,但它不能很好地扩展到簇大小,因为一个客户端必须处理所有设备(甚至位于不同节点上的设备)之间的协调.
例如,假设您有两个GPU,一个在客户端的计算机上,另一个在另一台计算机上.感谢Tensorflow的神奇之处,一个简单的with tf.device('address_of_the_gpu_on_the_other_machine'):操作就是将操作放在远程计算机的GPU上.然后,图形将在两台机器上运行,但是在能够进行计算(损失计算等)之前,需要从两者收集数据.网络通信会减慢您的培训速度(当然,机器越多,所需的通信就越多).
另一方面,图之间的复制可以更好地扩展,因为每台机器都有自己的客户端,只需要协调与参数服务器的通信和执行自己的操作.图形在参数服务器上"重叠",它更新在所有工作图之间共享的一组变量.此外,通信开销也大大减少,因为现在您只需要与参数服务器进行快速通信,但是在进行下一次训练迭代之前,没有机器需要等待其他机器完成.
在此方法中,您只有一个由客户端管理的图表.此图表具有分布在多个设备上的节点,甚至跨越不同的计算机.这意味着,例如,在网络上具有两台机器PC1和PC2,客户机将明确地将操作分派给一台机器或另一台机器.该图在技术上不是"复制的",只是它的某些部分是分布式的.通常,客户端具有大批数据,这些数据以子批次分割,每个数据都被馈送到图形的计算密集型部分.仅复制此计算密集型部件,但是在拆分之前和计算之后的所有部件(例如,损失计算)都在客户端上运行.这是一个瓶颈.
另请注意,客户端决定哪些操作转到哪台机器,因此理论上可以在不同节点上具有不同的图形部分.您可以决定在所有节点上以相同的方式复制计算密集型部分,或者原则上可以说"所有卷积都在PC1上,所有密集层都转到PC2".Tensorflow的魔力将在适当的位置插入数据传输,以使事情适合您.
在这里,您有相同图表的多个相似副本.为什么相似?因为它们都有计算密集型部分(如上所述),还有输入管道,损失计算和它们自己的优化器(假设你正在使用异步训练(默认).这是我的另一层复杂性.我会离开).(深入了解Tensorflow的分布式框架,您还会发现并非所有工作者(及其图表)都相同,有一个"主要"工作人员进行初始化,检查点和摘要记录,但这对于理解大概的概念).
与上面不同,这里需要一个特殊的机器,parameter server(PS),它充当图形变量的中央存储库(警告:不是所有变量,只有全局变量,例如global_step网络的权重).您需要这样做,因为现在在每次迭代时,每个工作人员都会在训练步骤的每次迭代中获取变量的最新值.然后它向PS发送必须应用于变量的更新,PS将实际进行更新.
这与上述方法有何不同?首先,没有"大批量"在工人之间分裂.每个工作人员都可以处理尽可能多的数据,之后不需要拆分和重新组合.这意味着,不需要工人同步,因为训练循环完全独立.的培训,但是,是不是独立的,因为一个工人确实给变量更新将通过工人b都是看到的,因为它们都共享相同的变量.这意味着您拥有的工人越多,培训的速度就越快(受收益减少),因为有效地更新变量(大约每隔time_for_a_train_loop/number_of_workers几秒).同样,这种情况在工人之间没有协调的情况下发生,顺便提一下,这也使得培训更加健壮:如果工人死亡,其他人可以继续(由于有一个主要工作人员而有一些警告).
该方法的最后一个很酷的特征是,原则上,使用异构集群不会损失性能.每台机器都尽可能快地运行,等待着没有人.如果您尝试在异构群集上运行图形内复制,则速度受限于最慢的计算机(因为您在继续之前收集所有结果).
| 归档时间: |
|
| 查看次数: |
305 次 |
| 最近记录: |