分布式张量流:图内复制和图间复制之间的差异
tensorflow
8
0

当阅读tensorflow官方方法指南中的复制训练时,我对两个概念感到困惑: In-graph replicationBetween-graph replication

  1. 上面的链接说

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

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

  2. 虽然上面的链接中已经存在一个Between-graph replication示例,但是谁能提供一个In-graph replication实现(伪代码很好),并强调其Between-graph replication主要区别?

    提前致谢!


编辑_1:更多问题

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

  1. 复制训练中有以下陈述:

    图形间复制。在这种方法中,每个/ job:worker任务都有一个单独的客户端,通常在与worker任务相同的过程中。每个客户端都会构建一个包含参数的相似图形 (与使用tf.train.replica_device_setter()像确定地映射到相同任务之前一样,固定到/ job:ps);和该模型的计算密集型部分的单个副本 ,固定在/ job:worker中的本地任务。

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

    (A)为什么我们说每个客户都建立相似的图 ,但不是相同的图 ?我想知道在重复训练的示例中在每个客户端中构建的图是否应该相同,因为以下图构造代码在所有worker中共享:

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

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

  2. 复制训练中的示例是否支持在多台机器上进行训练,每台机器都具有多个GPU?如果不是,我们是否可以同时使用In-graph replication来支持在每台机器上对多个GPU进行训练,以及Between-graph replication是否用于跨机训练?我问这个问题是因为@mrry表示In-graph replication本质上与用于多个GPU的CIFAR-10示例模型中使用的方式相同。

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

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

要回答您的特定问题:

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

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

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

  2. 虽然上面的链接中已经存在一个图间复制示例,但是谁能提供一个图内复制实现(伪代码很好)并突出其与图间复制的主要区别?

    由于历史原因,没有太多图文复制示例( 雅罗斯拉夫的要旨是一个例外)。使用图形内复制的程序通常将包含一个为每个工作程序创建相同图形结构的循环(例如,要点第74行上的循环),并在工作程序之间使用变量共享。

    图形内复制持续存在的一个地方是在单个进程中使用多个设备(例如,多个GPU)。 用于多个GPUCIFAR-10示例模型就是这种模式的示例(请参见此处的 GPU设备循环)。

(在我看来,不幸的是,如何处理多个工作程序和一个工作程序中的多个设备之间的不一致是令人遗憾的。与图形之间复制相比,图形内复制比图形间复制更易于理解,因为它不依赖于副本之间的隐式共享。更高级别的库(例如tf.learn和TF-Slim)隐藏了其中的一些问题,并希望我们将来能够提供更好的复制方案。)

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

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

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

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

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

    该示例代码仅涵盖了在多台机器上进行培训的内容,而没有说明如何在每台机器上的多个GPU上进行培训。但是,这些技术很容易构成。在示例的这一部分:

     # Build model... loss = ... 

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号