分布式 TensorFlow:谁应用参数更新?

Posted

技术标签:

【中文标题】分布式 TensorFlow:谁应用参数更新?【英文标题】:Distributed Tensorflow: who applies the parameter update? 【发布时间】:2019-01-08 07:43:35 【问题描述】:

我使用过TensorFlow,但对分布式TensorFlow 进行训练模型还是很陌生。我的理解是,当前的最佳实践有利于异步更新的数据并行模型:

Google Brain 团队在 2016 年 4 月发表的一篇论文进行了基准测试 各种方法,发现数据并行与同步 使用一些备用副本进行更新是最有效的,不仅 收敛速度更快,但也产生了更好的模型。 ——第十二章 Hands-On Machine Learning with Scikit-Learn and Tensorflow.

现在,我在进一步阅读此架构时感到困惑的是要弄清楚哪个组件应用了参数更新:worker 还是参数服务器?

在我下面的插图中,我很清楚,工作人员计算了梯度dJ/dw(损失 J 相对于参数权重 w 的梯度)。但是谁应用梯度下降更新规则呢?

有点令人困惑的是,O'Reilly article on Distributed TensorFlow 声明如下:

在更集中的架构中,设备将其输出发送到 参数服务器的梯度形式。这些服务器收集 并聚合梯度。在同步训练中,参数 服务器计算模型的最新版本,并发送 它回到设备。在异步训练中,参数服务器发送 梯度到本地计算新模型的设备。同时 架构,循环重复直到训练终止。

以上段落建议在异步训练中:

    worker 计算梯度并将其发送到参数服务器。 参数服务器将梯度广播给工作人员。 每个工作人员接收广播的梯度并应用更新规则。

我的理解正确吗?如果是,那么这对我来说似乎不是很异步,因为工作人员必须等待参数服务器广播渐变。任何解释将不胜感激。

【问题讨论】:

【参考方案1】:

我知道这是在 2018 年提出的,但让我们试一试。

    每个 Worker 计算梯度 当工作人员完成梯度计算后,它会将其发送到参数服务器。 worker 然后从参数服务器收到新参数,而无需等待其他worker。

在同步部分,在每个工人都将其更新发送到服务器之前,工人不会继续训练。

这在异步情况下意味着每个工作人员可以有略微不同的梯度,因为他们正在获取梯度而不等待每个工作人员更新参数服务器。

【讨论】:

以上是关于分布式 TensorFlow:谁应用参数更新?的主要内容,如果未能解决你的问题,请参考以下文章

37-分布式tensorflow

实战| 使用Docker实现分布式TensorFlow

tensorflow 基础学习二:实现一个神经网络

TensorFlow:训练时参数不更新

使用伯克利AI分布式框架Ray加速TensorFlow

重要更新 | 谷歌发布 TensorFlow 1.4,迁移Keras,支持分布式训练