【问题标题】:Distributed tensorflow: the difference between In-graph replication and Between-graph replication分布式张量流:图内复制和图间复制的区别
【发布时间】:2019-02-07 12:17:42
【问题描述】:

在阅读 tensorflow 官方 How-to 中的 Replicated training 时,我对这两个概念感到困惑:In-graph replicationBetween-graph replication

  1. 上面的链接说

    图内复制。在这种方法中,客户端构建单个 tf.Graph 包含一组参数(在 tf.Variable 节点中 固定到 /job:ps); ...

    这是否意味着Between-graph replication 方法中有多个 tf.Graphs?如果是,对应的代码在哪里 提供的例子?

  2. 虽然上面的链接中已经有一个Between-graph replication 示例,但任何人都可以提供一个In-graph replication 实现(伪代码很好)并突出显示其主要 与Between-graph replication的区别?

    提前致谢!


Edit_1:更多问题

非常感谢您的详细解释和要点代码@mrry @YaroslavBulatov!看了之后 您的回答,我有以下两个问题:

  1. Replicated training中有如下语句:

    图之间的复制。在这种方法中,有一个单独的 每个 /job:worker 任务的客户端,通常与 工人任务。每个客户端构建一个相似图,其中包含 参数(固定到 /job:ps 之前使用 tf.train.replica_device_setter() 将它们确定性地映射到 相同的任务);以及计算密集型部分的单一副本 模型,固定到 /job:worker 中的本地任务。

    我有两个与上述粗体字相关的子问题。

    (A) 为什么我们说每个客户端都构建相似图,而不是相同图? 我想知道Replicated training 示例中每个客户端中构建的图表 应该是相同的,因为下面的图形构造代码在所有workers 内共享。:

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

    (B) 不应该是计算密集型部分的多个副本 模型,因为我们有多个workers?

  2. Replicated training 中的示例是否支持在多台机器上进行训练,每台机器都有多个 GPU?如果没有,我们可以 同时使用In-graph replication 支持多个培训 每台机器上的 GPU 和 Between-graph replication 跨机训练?我问这个问题是因为 @mrry 表示In-graph replication 与方式基本相同 用于CIFAR-10 example model for multiple GPUs

【问题讨论】:

  • 这里是 examplein-graph replication —— 基本上你有一个图表并使用 with tf.device("/../worker/task:1/..) 将操作分配给工人
  • 多个tf.Graph 对象存在是因为您有多个进程,并且在每个进程中第一次使用默认图时会创建一个新的tf.Graph 对象
  • mirry,你能帮忙回答这个问题吗?stackoverflow.com/questions/44826477/…

标签: graph tensorflow distributed


【解决方案1】:

首先,对于一些历史背景,“图内复制”是我们在 TensorFlow 中尝试的第一种方法,它并没有达到许多用户要求的性能,所以更复杂的“图间”方法是当前推荐的执行分布式训练的方法。 tf.learn 等更高级别的库使用“between-graph”方法进行分布式训练。

回答您的具体问题:

  1. 这是否意味着中间图中有多个tf.Graphs 复制方法?如果是,提供的示例中对应的代码在哪里?

    是的。典型的图间复制设置将为每个工作人员副本使用单独的 TensorFlow 进程,并且每个进程都将为模型构建一个单独的tf.Graph。通常每个进程都使用全局默认图(可通过tf.get_default_graph() 访问)并且不会显式创建。

    (原则上,您可以使用具有相同 tf.Graph 的单个 TensorFlow 进程和共享相同底层图的多个 tf.Session 对象,只要您为每个会话配置不同的 tf.ConfigProto.device_filters 选项,但这是一种不常见的设置。)

  2. 虽然上面的链接中已经有一个图间复制示例,但任何人都可以提供一个图内复制实现(伪代码很好)并突出它与图间复制的主要区别吗?

    由于历史原因,图内复制的例子并不多(Yaroslav's gist 是一个例外)。使用图内复制的程序通常会包含一个循环,该循环为每个工作人员创建相同的图结构(例如line 74 of the gist 上的循环),并在工作人员之间使用变量共享。

    图内复制持续存在的一个地方是在单个进程中使用多个设备(例如多个 GPU)。 CIFAR-10 example model for multiple GPUs 是这种模式的一个示例(请参阅 GPU 设备上的循环 here)。

(在我看来,如何处理单个 worker 中的多个 worker 和多个设备之间的不一致是不幸的。图内复制比图间复制更容易理解,因为它不依赖于隐式共享副本。更高级别的库,例如 tf.learn 和 TF-Slim,隐藏了其中的一些问题,并希望我们可以在未来提供更好的复制方案。)

  1. 为什么我们说每个客户都构建一个相似图,而不是相同图?

    因为它们不需要相同(并且没有强制执行此操作的完整性检查)。特别是,每个工作人员可能会创建一个具有不同显式设备分配的图("/job:worker/task:0""/job:worker/task:1" 等)。首席工作人员可能会创建非首席工作人员未创建(或使用)的其他操作。但是,在大多数情况下,图表在逻辑上(即模设备分配)是相同的。

    不应该是模型计算密集型部分的多个副本,因为我们有多个工人吗?

    通常,每个工作人员都有一个单独的图表,其中包含模型计算密集型部分的单个副本。工人 i 的图形不包含工人 j 的节点(假设 i ≠ j)。 (例外情况是您使用图间复制进行分布式训练,使用图内复制在每个工作人员中使用多个 GPU。在这种情况下,工作人员的图表通常包含 N 图的计算密集型部分的副本,其中 N 是该工作器中的 GPU 数量。)

  2. Replicated training 中的示例是否支持在多台机器上进行训练,每台机器都有多个 GPU?

    示例代码仅涵盖在多台机器上的训练,并没有说明如何在每台机器上的多个 GPU 上进行训练。但是,这些技术很容易组合。在这部分示例中:

    # Build model...
    loss = ...
    

    ...您可以在本地机器中的 GPU 上添加一个循环,以实现分布式训练多个工人,每个工人都有多个 GPU。

【讨论】:

  • 感谢您的回复!你能看看添加的问题吗?
  • 我添加了对您其他问题的答案,但我认为我们已经处于单个 Stack Overflow 问题应涵盖的范围内。如果您还有其他问题,我会要求您发布单独的问题,而不是将它们添加到原始问题中。谢谢!
  • 太棒了!非常感谢您的回答@mrry!我现在没有其他问题。 :)
  • 我认为,对于集群训练的图内复制,存储在 /job:ps 中的 tf.Variable,需要将所有输入变量分派给所有 /job:worker。除了第二个要求,我不知道为什么图内比图间更受性能影响。我认为它们在性能方面本质上是相同的。能否向我们详细说明为什么图内复制的性能会受到影响?
  • 这可能是一个太涉及评论的问题,但直观的答案是(在大范围内)图内复制在单个 tf.Session 控制所有复制品。该会话维护大小为 O(num_replicas * nodes_in_graph) 的状态,并且它必须编组控制流量 num_replicas 倍大于单个会话必须在图之间的情况下。如果您的步骤足够短,那么这种控制开销可能会变得很大,并会降低训练的吞吐量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-22
  • 2017-08-19
  • 2016-02-10
  • 2013-02-23
  • 1970-01-01
  • 2014-11-01
  • 2013-07-01
相关资源
最近更新 更多