在分布式张量流中使用图间复制提高性能

Performance improvement using Between-Graph replication in distributed tensorflow

我已经过了 答案,但它没有给出在 Between-Graph 复制中选择多个客户端以提高性能的理由。 与图内复制相比,使用图间复制将如何提高性能?

In-graph 复制适用于同一台机器上的多个设备,但它不能很好地扩展到 cluster-size,因为一个客户端必须协调所有设备(即使是那些位于不同的节点上)。

例如,假设您有两个 GPU,一个在客户端机器上,另一个在第二台机器上。感谢 Tensorflow 的魔法,一个简单的 with tf.device('address_of_the_gpu_on_the_other_machine'): 将在远程计算机的 GPU 上进行操作。然后该图将在两台机器上 运行,但是在能够继续计算(损失计算等)之前,需要从两台机器上收集数据。网络通信会减慢你的训练速度(当然,机器越多,需要的通信越多)。

另一方面,

Between-graph 复制的扩展性更好,因为每台机器都有自己的客户端,只需要协调与参数服务器的通信并执行自己的操作。图在参数服务器上“重叠”,它更新 one 一组变量,这些变量在所有工作图之间共享。此外,通信开销也大大减少,因为现在你只需要与参数服务器进行快速通信,而没有机器需要等待其他机器完成才能进行下一次训练迭代。

两种方法的图表有何不同?

In-graph 复制:

在这种方法中,您只有一个图 由客户端管理。该图的节点 分布在多个设备上,甚至分布在不同的机器上 。这意味着,例如,网络上有两台机器 PC1 和 PC2,客户端将 明确地 将操作分派给一台机器或另一台机器。从技术上讲,该图不是“复制的”,只是其中的某些部分是分布式的。通常,客户端有一大批数据被拆分为 sub-batches,每个数据都被馈送到图的 compute-intensive 部分。只有这个 compute-intensive 部分被复制,但所有部分 拆分之前和 计算(例如,损失计算)运行s 在客户端。 这是一个瓶颈

另请注意,它是客户端决定将哪些操作转到哪台机器,因此理论上可以在不同节点上拥有图形的不同部分。您可以决定在所有节点上相同地复制 compute-intensive 部分,或者您原则上可以说“所有卷积都在 PC1 上,所有密集层都在 PC2 上”。 Tensorflow 的魔力将在适当的地方插入数据传输,让一切为您所用。

Between-graph复制:

这里有同一张图的多个相似副本。为什么相似?因为它们都有 compute-intensive 部分(如上所述),还有输入管道、损失计算和它们自己的优化器(假设您使用的是异步训练(默认)。这是另一层复杂性我会放在一边)。 (深入研究 Tensorflow 的分布式框架,您还会发现并非所有工作人员(及其图表)都是平等的,只有一个“首席”工作人员负责初始化、检查点和摘要日志记录,但这对于理解总体思路)。

与上面不同,这里你需要一台特殊的机器,parameter server (PS),它充当图形变量的中央存储库(警告: 不是 all 变量,只有 global 变量,比如 global_step 和你的网络的权重)。您需要这个,因为现在在每次迭代中,每个工作人员都将在训练步骤的每次迭代中获取变量的最新值。然后它向 PS 发送必须应用于变量的 更新 ,PS 将实际进行更新。

这与上述方法有何不同? 一方面,没有在工人之间分配的“大批量”。每个工作人员处理尽可能多的数据,之后不需要拆分和重新组合。这意味着,不需要工人同步,因为训练循环是完全独立的。 但是训练并不是独立的,因为worker A对变量所做的更新会被worker B看到,因为他们共享相同的变量。这意味着您拥有的 worker 越多,训练速度越快(可能会减少 returns),因为有效地更新变量的频率更高(大约每 time_for_a_train_loop/number_of_workers 秒更新一次)。同样,这种情况在工人之间没有协调的情况下发生,这顺便也使培训更加稳健:如果一名工人死亡,其他人可以继续(由于有首席工人而有一些警告)。

这个方法最后一个很酷的特点是,原则上,我们的性能没有损失ng 异构集群。每台机器 运行 都以最快的速度运行,不等待任何人。如果您在异构集群上尝试 运行ning in-graph 复制,您的速度将受到最慢机器的限制(因为您在继续之前收集了所有结果)。