张量流中的图形间复制:会话和变量

时间:2017-02-04 23:40:49

标签: tensorflow distributed

关于分布式Tensorflow中的图形间复制的问题,因为我没有从教程中获得一些时间。据我了解当前的模型:

我们在单独的进程中启动参数服务器并生成server.join()。 我们有工人,他们每个人都构建了类似的计算图,其中包含链接到参数服务器的参数节点(通过tf.train.replica_device_setter)和放置在工人自己的计算节点。

我没有找到:

  1. 会话如何在此模型中运行?因为在示例/教程中它隐藏在tf.train.Supervisor后面。 我们是否对每个工作人员都有单独的会话,还是只有一个会话来累积来自所有工作人员和参数服务器的图表?

  2. 如何在参数服务器上初始化全局变量?我想知道我可以在其中一个工作进程中初始化它们(选择它作为" master"),如果我通过tf.train.replica_device_setter将这些参数链接到worker上。这是对的吗?

  3. 在以下要点中:

  4. https://gist.github.com/yaroslavvb/ea1b1bae0a75c4aae593df7eca72d9ca

    全局变量仅在参数服务器进程中初始化,并且所有工作者都认为它们已初始化。考虑到他们甚至在不同的会议中工作,这怎么可能呢?我无法在更简单的例子中复制它。

    1. 我在核心程序中有主要会话,我进行模型的培训。训练循环的一部分是数据的集合,这又需要在张量流集群上进行计算。所以我需要创建这个集群,把受训模型的参数服务器当前状态,然后从计算中收集数据并继续训练循环。我怎样才能:1)将当前训练的模型传递给集群? 2)从集群中提取收集的数据并将其传递给主程序?
    2. 提前致谢!

      编辑:

      至q.3: 先前已回答(In tensorflow, is variable value the only context information a session stores?)在会话之间共享分布式运行时变量。 这是否意味着当我使用某些" target"创建会话时,所有变量将在同一图表上运行的那些会话之间共享?

2 个答案:

答案 0 :(得分:1)

猜猜我可以尝试自己回答这些问题,至少它可能对尝试利用分布式Tensorflow的其他新手有所帮助,因为截至目前,该主题缺乏简洁明了的博客文章。

希望更多知识渊博的人在需要时纠正我。

  1. 我们在所有服务器上都有单独的会话,这些会话共享其资源(变量,队列和读取器)但仅限于分布式设置(即将server.target传递给tf.Session构造函数) )。
  2. 参考:https://www.tensorflow.org/api_docs/python/client/session_management#Session

    1. 参数变量通常在一个" master"中初始化。处理。它可以是启动参数服务器的进程。 但仅仅在一个过程中完成此操作并非绝对必要。

    2. 因为p.1。复制:)

    3. 感谢@YaroslavBulatov的想法,我采用了以下方法,这似乎是最简单的方法:

      • 群集:一个本地"计算服务器"和N"工人"。
      • "计算服务器"保留全球网络的所有参数并执行培训步骤。所有培训操作都分配给它。
      • "工人"并行收集数据然后将其放入队列;这些数据由"计算服务器"在做训练时。
    4. 所以,高级算法:

      1. 启动群集中的所有单位
      2. 在计算服务器上构建comp图和训练操作
      3. 在工人上构建comp图(变量与计算相关联 服务器)。
      4. 与工人一起收集数据
      5. 在计算服务器上执行训练步骤并更新全局 网络
      6. 重复4-5直到收敛:)

        截至目前,我通过队列在计算服务器和工作人员之间进行协调(何时开始收集数据以及何时开始训练步骤),这绝对不是最优雅的解决方案。任何反馈都非常受欢迎。

答案 1 :(得分:0)

我也偶然发现了这些以及非常相似和相关的问题。我试图澄清所有这些in my overview of distributed TensorFlow。也许对某些人有用。

更具体地说,让我尝试回答您的问题:

  1. 您说您在图形间复制,即为每个工作人员构建一个单独的计算图。这意味着您到处也都有单独的会话,因为否则将无法使用该计算图。服务器(tf.distribute.Server)将不使用本地计算图。当远程会话(客户端)连接到它时,它只会执行事情。会话具有图形。如果只有一个会话,那么也只有一个图,那么您就有图内复制

  2. 如果您共享变量(例如,它们位于参数服务器上),那么只要其中一个工作程序进行初始化(例如,参数服务器本身)就足够了。否则,这取决于特定的分布式策略以及变量的同步方式。例如。镜像变量在每个副本上都有单独的副本,您需要以某种方式确保它们已同步。

  3. 在这种情况下,变量只有一个副本,它位于参数服务器上。该变量上的所有readwrite都是对参数服务器的RPC调用。

  4. 我不确定您所说的主程序是什么。您将拥有程序的多个实例,每个实例一个。但是您可能会将其中一个工作人员标记为 chief 工作人员,该工作人员还有其他责任,例如保存检查点。但是否则,所有工作人员都是平等的,并且都做相同的事情(这也是图间复制)。梯度累积或参数更新的外观取决于您的策略(例如,您是进行同步训练还是异步训练等)。