分布式tensorflow:图形内复制和图形间复制之间的区别

时间:2017-01-11 20:41:52

标签: graph tensorflow distributed

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

  1. 在上面的链接中说

      

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

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

  2. 虽然上述链接中已有Between-graph replication示例,但是有人可以提供In-graph replication 实现(伪代码很好)并突出其主要内容 与Between-graph replication的差异?

    提前致谢!

  3. Edit_1:更多问题

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

    1. Replicated training中有以下声明:

        

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

      我有两个与上面的单词粗体相关的子问题。

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

      中共享

      # 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

1 个答案:

答案 0 :(得分:35)

首先,对于某些历史背景,"图形内复制"是我们在TensorFlow中尝试的第一种方法,它没有达到许多用户所需的性能,因此更复杂的"介于图形之间"方法是目前推荐的分布式培训方式。诸如tf.learn之类的高级库使用"之间的图形"分布式培训的方法。

回答您的具体问题:

  1.   

    这是否意味着在图之间存在多个tf.Graph s   复制方法?如果是,所提供的示例中的相应代码在哪里?

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

    (原则上,只要您为tf.Graph选项配置了tf.Session,就可以使用具有相同基础图的相同tf.ConfigProto.device_filters和多个tf.learn对象的单个TensorFlow流程每个会话都不同,但这是一个不常见的设置。)

  2.   

    虽然上面的链接中已经存在一个图形间复制示例,但是否有人可以提供图形内复制实现(伪代码很好)并突出显示它与图形间复制的主要区别?

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

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

  3. (在我看来,单个工作者中多个工作者和多个设备的处理方式之间的不一致是不幸的。图形内复制比图形复制之间更容易理解,因为它不依赖于隐式高级库,如"/job:worker/task:0"和TF-Slim,隐藏了其中的一些问题,并希望我们能够在未来提供更好的复制方案。)

    1.   

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

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

        

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

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

    2.   

      Replicated training中的示例是否支持多台计算机上的培训,每台计算机都有多个GPU?

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

      {{1}}

      ...您可以在本地计算机的GPU上添加一个循环,以实现分布式培训多个具有多个GPU的工作人员。