Graph 分布式tensorflow:图内复制与图内复制的区别

Graph 分布式tensorflow:图内复制与图内复制的区别,graph,tensorflow,distributed,Graph,Tensorflow,Distributed,当我阅读tensorflow的官方《如何操作》时,我对这两个概念感到困惑:在图形复制中和在图形复制之间 上面的链接说 在图形复制中。在这种方法中,客户端构建一个 包含一组参数的图(在tf.Variable节点中 固定到/作业:ps) 这是否意味着在图形之间的中有多个

当我阅读tensorflow的官方《如何操作》时,我对这两个概念感到困惑:
在图形复制中
在图形复制之间

  • 上面的链接说

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

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

  • 虽然在上面的链接中已经有一个
    图间复制
    示例,但有人能提供一个
    图间复制
    实现(伪代码很好)并突出显示其主要功能 图形复制之间的
    差异

    提前谢谢


  • 编辑_1:更多问题 非常感谢您的详细解释和要点代码@mrry@YaroslavBulatov!看了之后 在你的回答中,我有以下两个问题:

  • 本文件中有以下声明:

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

    我有两个子问题与上面的粗体字有关

    (A) 为什么我们说每个客户机构建类似的图,而不是相同的图? 我想知道在示例中每个客户机中构建的图形 应相同,因为所有
    工人内部共享以下图形构造代码:

    #构建模型…

    loss=…

    global\u step=tf.变量(0)

    (B) 它不应该是计算机密集型部分的多个副本吗 模型,因为我们有多个
    工作者

  • 中的示例是否支持在多台机器上进行培训,每台机器都有多个GPU?如果没有,我们可以吗 同时使用图形复制中的
    来支持多个方面的培训 每台机器上的GPU和图形复制之间的
    用于 跨机器训练?我问这个问题是因为 @mrry指出,图形复制中的
    与方法基本相同
    用于


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

    要回答您的具体问题:


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

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

    (原则上,只要为每个会话配置不同的
    tf.ConfigProto.device\u过滤器
    选项,就可以使用一个TensorFlow进程来处理相同的
    tf.Graph
    和多个共享相同基础图的
    tf.Session
    对象,但这是一种不常见的设置。)

  • 虽然在上面的链接中已经有一个图间复制示例,但是有谁能提供一个图内复制实现(伪代码很好)并强调它与图间复制的主要区别吗

    由于历史原因,图内复制的例子并不多(这是一个例外)。使用图内复制的程序通常会包括一个循环,该循环为每个辅助对象创建相同的图结构(例如,循环打开),并在辅助对象之间使用变量共享

    图内复制持续存在的一个地方是在单个进程中使用多个设备(例如多个GPU)。是这种模式的一个示例(请参见GPU设备上的循环)

  • (在我看来,处理多个工作进程和单个工作进程中的多个设备之间的不一致性是不幸的。图形内复制比图形间复制更容易理解,因为它不依赖副本之间的隐式共享。更高级别的库,如
    tf.learn
    和tf Slim,隐藏了这一点(我知道这些问题,并希望我们将来能够提供更好的复制方案。)

  • 为什么我们说每个客户端都构建了一个类似的图,而不是相同的

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

    它不应该是模型计算密集型部分的多个副本吗?因为我们有多个工人
    # Build model...
    loss = ...