分布式tensorflow:In-graph复制和Between-graph复制之间的区别

ROB*_* AI 22 distributed graph tensorflow

:我困惑的两个概念In-graph replicationBetween-graph replication读取时复制训练中tensorflow的官方操作方法.

  1. 在上面的链接中说

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

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

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

    提前致谢!


Edit_1:更多问题

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

  1. 复制培训中有以下声明:

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

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

    (A)为什么我们说每个客户端构建相似的图形,但不是相同的图形?我想知道复制培训示例中每个客户端中构建的图形 应该是相同的,因为下面的图形构造代码在所有workers 中共享:

    # Build model...

    loss = ...

    global_step = tf.Variable(0)

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

  2. 复制培训中的示例是否支持多台计算机上的培训,每台计算机都有多个GPU?如果没有,我们是否可以同时使用In-graph replication每台机器上的多GPU支持培训和Between-graph replication跨机器培训?我问这个问题是因为@mrry表示它与多个GPU的CIFAR-10示例模型中In-graph replication使用的方式基本相同.

mrr*_*rry 37

首先,对于某些历史背景,"图中复制"是我们在TensorFlow中尝试的第一种方法,并且它没有达到许多用户所需的性能,因此更复杂的"图形间"方法是当前的建议的方式来执行分布式培训.高级库,例如tf.learn使用"图形间"方法进行分布式培训.

回答您的具体问题:

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

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

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

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

    由于历史原因,图中复制的例子并不多(雅罗斯拉夫的要点是一个例外).使用图中复制的程序通常包括为每个工作者创建相同图形结构的循环(例如,要点的第74行上的循环),并使用工作者之间的变量共享.

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

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

  1. 为什么我们说每个客户端构建一个类似的图形,但不是相同的图形?

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

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

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

  2. 复制培训中的示例是否支持多台计算机上的培训,每台计算机都有多个GPU?

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

    # Build model...
    loss = ...
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 这可能过于涉及评论的问题,但直观的答案是(在大规模)图形内复制在控制所有副本的单个`tf.Session`上创建了一个控制平面瓶颈.该会话认为具有尺寸O(num_replicas*nodes_in_graph)状态,并且它必须编组控制流量比单个会话更大num_replicas时间必须在图形间的情况.如果您的步骤足够短,则此控制开销可能会变得很严重并降低培训的吞吐量. (4认同)