关于分布式Tensorflow中的图形间复制的问题,因为我没有从教程中获得一些时间。据我了解当前的模型:
我们在单独的进程中启动参数服务器并生成server.join()。 我们有工人,他们每个人都构建了类似的计算图,其中包含链接到参数服务器的参数节点(通过tf.train.replica_device_setter)和放置在工人自己的计算节点。
我没有找到:
会话如何在此模型中运行?因为在示例/教程中它隐藏在tf.train.Supervisor后面。 我们是否对每个工作人员都有单独的会话,还是只有一个会话来累积来自所有工作人员和参数服务器的图表?
如何在参数服务器上初始化全局变量?我想知道我可以在其中一个工作进程中初始化它们(选择它作为" master"),如果我通过tf.train.replica_device_setter将这些参数链接到worker上。这是对的吗?
在以下要点中:
https://gist.github.com/yaroslavvb/ea1b1bae0a75c4aae593df7eca72d9ca
全局变量仅在参数服务器进程中初始化,并且所有工作者都认为它们已初始化。考虑到他们甚至在不同的会议中工作,这怎么可能呢?我无法在更简单的例子中复制它。
提前致谢!
编辑:
至q.3: 先前已回答(In tensorflow, is variable value the only context information a session stores?)在会话之间共享分布式运行时变量。 这是否意味着当我使用某些" target"创建会话时,所有变量将在同一图表上运行的那些会话之间共享?
答案 0 :(得分:1)
猜猜我可以尝试自己回答这些问题,至少它可能对尝试利用分布式Tensorflow的其他新手有所帮助,因为截至目前,该主题缺乏简洁明了的博客文章。
希望更多知识渊博的人在需要时纠正我。
参考:https://www.tensorflow.org/api_docs/python/client/session_management#Session
参数变量通常在一个" master"中初始化。处理。它可以是启动参数服务器的进程。 但仅仅在一个过程中完成此操作并非绝对必要。
因为p.1。复制:)
感谢@YaroslavBulatov的想法,我采用了以下方法,这似乎是最简单的方法:
所以,高级算法:
重复4-5直到收敛:)
截至目前,我通过队列在计算服务器和工作人员之间进行协调(何时开始收集数据以及何时开始训练步骤),这绝对不是最优雅的解决方案。任何反馈都非常受欢迎。
答案 1 :(得分:0)
我也偶然发现了这些以及非常相似和相关的问题。我试图澄清所有这些in my overview of distributed TensorFlow。也许对某些人有用。
更具体地说,让我尝试回答您的问题:
您说您在图形间复制,即为每个工作人员构建一个单独的计算图。这意味着您到处也都有单独的会话,因为否则将无法使用该计算图。服务器(tf.distribute.Server
)将不使用本地计算图。当远程会话(客户端)连接到它时,它只会执行事情。会话具有图形。如果只有一个会话,那么也只有一个图,那么您就有图内复制。
如果您共享变量(例如,它们位于参数服务器上),那么只要其中一个工作程序进行初始化(例如,参数服务器本身)就足够了。否则,这取决于特定的分布式策略以及变量的同步方式。例如。镜像变量在每个副本上都有单独的副本,您需要以某种方式确保它们已同步。
在这种情况下,变量只有一个副本,它位于参数服务器上。该变量上的所有read
和write
都是对参数服务器的RPC调用。
我不确定您所说的主程序是什么。您将拥有程序的多个实例,每个实例一个。但是您可能会将其中一个工作人员标记为 chief 工作人员,该工作人员还有其他责任,例如保存检查点。但是否则,所有工作人员都是平等的,并且都做相同的事情(这也是图间复制)。梯度累积或参数更新的外观取决于您的策略(例如,您是进行同步训练还是异步训练等)。