异步培训如何在分布式Tensorflow中工作?

Ruo*_*ong 22 python distributed asynchronous neural-network tensorflow

我读过Distributed Tensorflow Doc,它提到在异步训练中,

图的每个副本都有一个独立的训练循环,无需协调即可执行.

据我所知,如果我们将参数服务器与数据并行架构结合使用,则意味着每个工作人员都会计算渐变并更新自己的权重,而无需关心分布式训练神经网络的其他工作人员更新.由于所有权重都在参数服务器(ps)上共享,我认为ps仍然必须以某种方式协调(或聚合)来自所有工作者的权重更新.我想知道聚合在异步训练中是如何工作的.或者更一般地说,异步培训在分布式Tensorflow中如何工作?

mrr*_*rry 26

在Distributed TensorFlow中异步训练时,特定工作人员执行以下操作:

  1. 工作人员从PS任务并行读取所有共享模型参数,并将它们复制到工作人员任务.这些读取与任何并发写入不协调,并且不获取锁定:特别是工作者可能会看到来自一个或多个其他工作者的部分更新(例如,可能已应用来自另一个工作者的更新的子集,或者元素的子集在变量中可能已经更新).

  2. 工作人员根据一批输入数据和在步骤1中读取的参数值在本地计算渐变.

  3. 工人梯度为每个变量到适当的PS任务,和适用的梯度以它们各自的变量,使用由优化算法(例如SGD,SGD与动量,Adagrad,亚当等)确定的更新规则.更新规则通常使用(近似)可交换操作,因此它们可以独立地应用于来自每个工作者的更新,并且每个变量的状态将是所接收的更新序列的运行聚合.

在异步训练中,同时应用来自工作者的每个更新,并且如果在初始化use_locking=True相应的优化器(例如tf.train.GradientDescentOptimizer)时设置了可选标志,则可以在某种程度上协调更新.但请注意,此处的锁定仅为两个并发更新提供互斥,并且(如上所述)读取不获取锁定; 锁定不会在整个更新集中提供原子性.

(相比之下,在同步培训中,类似的实用程序tf.train.SyncReplicasOptimizer将确保所有工作人员为每个模型参数读取相同的最新值;并且同步步骤的所有更新在应用于它们之前进行聚合为了做到这一点,工作人员通过屏障进行同步,这些屏障在发送梯度更新后输入,并在聚合更新应用于所有变量后离开.)

  • 1.每个变量的更新直接应用于该变量的单个实例,该实例存储在PS任务中:基本上,每个工作人员为SGD执行更新`v - = learning_rate*grad_of_loss_wrt_v`(或更高级的东西)对于每个变量`v`的其他优化算法).您不需要做任何额外的事情来同步或聚合权重,因为只有一个共享副本! (2认同)
  • 2.异步培训通常比同步培训实现更高的*吞吐量*(就每单位时间消耗的训练数据而言),因为它永远不需要阻止另一个工作人员.但是,这是否会导致更快的准确时间取决于模型和网络的性能,因为在进行异步培训时可能需要运行大量步骤才能达到与同步培训过程相同的精度. (2认同)