使用 Horovod,您基本上运行 N 个独立实例(因此它是图间复制的一种形式),并且它们通过特殊的 Horovod 操作(基本上是广播 + 减少)进行通信。
现在假设实例 0 或其他一些外部实例加载您的数据(通过tf.data.Dataset
)。您将如何将其分配iterator.get_next()
给每个实例?使用 Horovod 广播效率低下,因为您会将所有数据复制到所有实例。
在每个实例中都有数据集,并在那里进行所有加载,然后shard
在数据集上使用也会效率低下,因为您将在任何地方加载数据,然后丢弃 (N-1)/N 个数据。所以这就是为什么也不想要分片,而是只将数据集加载到单个(生产者/数据集工作人员)实例中,然后将批次分配给所有火车工作人员。
我猜 TFMultiDeviceIterator
提供了一些类似的功能(或者基本上完全一样),但我不确定它是否与 Horovod 一起工作,以及你将如何设置它?
或者,也许您可以通过 TF 工作人员以某种方式进行分发(指南?(也许这也是您的配置MultiDeviceIterator
方式?)
如果可能的话,这应该是通过 TensorFlow 操作/函数(有许多相关函数可能已经给了我这个,但我可能不知道它们,或者误解了它是如何工作的)。或者答案可能是 TensorFlow 还没有提供任何此类功能?(知道这仍然很有用。然后我会用 C++ 实现我自己的解决方案,包装为 TensorFlow。但在这样做之前,最好知道这是否真的有必要。)
(相关也是这个Horovod问题。)
(这个问题实际上比 Horovod 更通用,虽然 Horovod 可能是一个很好的例子。对于分布式 TensorFlow,你可能总是遇到这个问题?)
(我在这里收集了所有分布式 TensorFlow 术语和方面的概述,主要是为了澄清。)