异步训练在分布式Tensorflow中如何工作?
neural-network
python
tensorflow
5
0

我已阅读Distributed Tensorflow Doc ,其中提到在异步培训中,

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

据我了解,如果我们将参数服务器与数据并行性体系结构一起使用,则意味着每个工作人员都可以计算梯度并更新自己的权重,而无需关心其他工作人员对分布式训练神经网络的更新。由于所有权重都在参数服务器(ps)上共享,我认为ps仍必须以某种方式协调(或汇总)所有工作人员的权重更新。我想知道聚合在异步训练中如何工作。或更笼统地说,异步培训如何在分布式Tensorflow中工作?

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

在异步培训中,工作人员之间没有权重同步。权重存储在参数服务器上。每个工作人员彼此独立地加载和更改共享的权重。这样,如果一个工作人员比另一个工作人员更快地完成了一次迭代,则无需等待即可继续进行下一个迭代。工人仅与共享参数服务器交互,而彼此不交互。

总体而言,它可以(取决于任务)显着加快计算速度。但是,有时结果比通过较慢的同步更新获得的结果更糟。

收藏
评论

当您在分布式TensorFlow中异步训练时,特定工作人员会执行以下操作:

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

  2. 工作者根据一批输入数据和在步骤1中读取的参数值在本地计算梯度。

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

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

(相反,在同步训练中, tf.train.SyncReplicasOptimizer类的实用程序将确保所有工作tf.train.SyncReplicasOptimizer读取每个模型参数相同的最新值;并且确保同步步骤的所有更新均被汇总为此,工作人员通过屏障进行同步,屏障在发送梯度更新后进入,在汇总更新应用于所有变量后退出。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号