首先,对于某些历史背景,"图中复制"是我们在TensorFlow中尝试的第一种方法,并且它没有达到许多用户所需的性能,因此更复杂的"图形间"方法是当前的建议的方式来执行分布式培训.高级库,例如tf.learn
使用"图形间"方法进行分布式培训.
回答您的具体问题:
这是否意味着
tf.Graph
图之间的复制方法有多个?如果是,所提供示例中的相应代码在哪里?
是.典型的图之间复制设置将为每个工作副本使用单独的TensorFlow过程,并且每个过程将为tf.Graph
模型构建一个单独的过程.通常,每个进程都使用全局默认图(可通过tf.get_default_graph()
),并且不会显式创建.
(原则上,只要为每个会话配置不同的选项,就可以使用具有相同tf.Graph
和多个tf.Session
共享相同基础图的对象的单个TensorFlow进程tf.ConfigProto.device_filters
,但这是一种不常见的设置.)
虽然在上面的链接中已经存在一个图形间复制示例,但是任何人都可以提供图形内复制实现(伪代码很好)并突出显示它与图形复制之间的主要区别吗?
由于历史原因,图中复制的例子并不多(雅罗斯拉夫的要点是一个例外).使用图中复制的程序通常包括为每个工作者创建相同图形结构的循环(例如,要点的第74行上的循环),并使用工作者之间的变量共享.
图中复制持续存在的一个地方是在单个进程中使用多个设备(例如,多个GPU).多个GPU的CIFAR-10示例模型就是这种模式的一个示例(请参阅此处的 GPU设备循环).
(在我看来,单个工作者中多个工作者和多个设备的处理方式之间的不一致是不幸的.图形内复制比图形间复制更容易理解,因为它不依赖于副本之间的隐式共享.更高级的库,如tf.learn
TF-Slim,隐藏了其中的一些问题,并希望我们能够在未来提供更好的复制方案.)
为什么我们说每个客户端构建一个类似的图形,但不是相同的图形?
因为它们不需要相同(并且没有执行此操作的完整性检查).特别是,每个工人可能会产生具有不同的显式设备分配(的曲线图"/job:worker/task:0"
,"/job:worker/task:1"
等等).主要工作人员可能会创建非主要工作人员创建(或由其使用)的其他操作.但是,在大多数情况下,图形在逻辑上(即模数设备分配)是相同的.
它不应该是模型的计算密集型部分的多个副本,因为我们有多个工作人员吗?
通常,每个工作人员都有一个单独的图表,其中包含模型的计算密集型部分的单个副本.worker i的图形不包含worker j的节点(假设i≠j).(例外情况是您在分布式培训中使用图形间复制,在每个工作程序中使用多个GPU的图形内复制.在这种情况下,工作者的图形通常包含N个计算机副本图的密集部分,其中N是该工作者中的GPU数.)
复制培训中的示例是否支持多台计算机上的培训,每台计算机都有多个GPU?
示例代码仅涵盖多台计算机上的培训,并且没有说明如何在每台计算机上的多个GPU上进行培训.但是,这些技术很容易构成.在这部分示例中:
# Build model... loss = ...
...您可以在本地计算机的GPU上添加一个循环,以实现多个具有多个GPU的多个工作人员的分布式培训.