在 Tensorflow 上使用 MultiWorkerMirroredStrategy 实现周期性平均 SGD 的最佳方法是什么

问题描述

在运行 Ubuntu 20.04 的机器上,每台机器都有多个 GPU,我想在分布式环境中进行训练

我根据此 keras tutorial 修改了我的代码,使用 tf.distribute.MultiWorkerMirroredStrategy 在 2 台机器上进行训练,每台机器有 2 个 GPU,总共使用了 4 个 GPU。

但是,我发现训练过程的效率远低于我在具有 4 个 GPU 的单台机器上运行它的效率(我已经使用 tf 的 MirroredStrategy 对其进行了测试)。我怀疑这是由于多线程策略中 AllReduce 函数的同步特性。我注意到,随着训练的每一步,我的 GPU 使用率不断从 100% 波动到 5%。我不确定为什么,但我怀疑 GPU 空闲是在通信发生时/或当每个工作人员正在等待落后者完成他们的训练步骤时。

为了克服这个问题,我想实施周期平均 SGD;简而言之,这允许每个节点在与 AllReduce 通信以达成共识之前执行 n 步 SGD。因此,这将通信开销减少了 n 倍。最终我想实现某种自适应周期性平均来减少最终的收敛误差。这 paper 正是我希望实现的目标。

有什么办法可以用 tensorflow 的 MultiWorkerMirroredStrategy 来做到这一点,也许是自定义训练循环?否则,您有哪些优化 MultiWorkerMirroredStrategy 的方法

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)