Tensorflow 跨设备通信

8
正如TensorFlow论文所述,TensorFlow的跨设备通信是通过向设备添加“接收节点”和“发送节点”来实现的。
据我所知,设备(请仅考虑涉及CPU设备)负责执行操作的计算。然而,数据(例如:从操作生成的张量、变量缓冲区)驻留在内存中。我不知道如何在物理上从一个设备传输数据到另一个设备。我猜想数据传输是通过共享内存实现的。这样对吗?
如果有关于数据传输如何实现的任何解释/相应代码,我将不胜感激。 附注: TensorFlow论文链接,图4显示了跨设备通信机制。
1个回答

16
在TensorFlow中,跨设备通信是通过Rendezvous接口实现的,该接口有多个不同的实现,具体取决于部署情况。该接口的注释描述了一般思路:
// A Rendezvous is an abstraction for passing a Tensor
// from a producer to a consumer, where the consumer may safely
// request the Tensor before or after it has been produced.  A
// producer never blocks when using a Rendezvous.  A consumer has the
// choice of making a blocking call or providing a callback: in either
// case, the consumer receives the Tensor as soon as it is available.

正如您在问题中所提到的,TensorFlow使用SendRecv操作在数据流图中表示通信,当图被分配到不同设备上时,这些操作会自动添加到图中。对于每个在不同设备上具有源和目的地的边缘,图分区器会插入一对共享相同“约会键”(自动生成的字符串名称,在待通信的张量约会索引中用作键)的SendRecv操作。Send操作的实现很简单:它调用Rendezvous::Send(),传入其约会键和单个输入张量,然后立即返回而不阻塞。Recv操作的实现略微复杂:它注册一个回调函数,以在具有给定键的张量可用时调用。该回调函数负责“生成”Recv操作的输出,并解除后续计算的阻塞。

Rendezvous 实现执行数据传输的实际工作:


@mrry 非常明确的指示 - WY Hsu
嗨@mrry,你知道如何利用Rendezvous在两台机器之间传输张量吗?我尝试使用自定义操作和tf.raw_ops.Send/Recv,但这些都没有成功地在两台机器之间传输张量。请参见https://github.com/tensorflow/tensorflow/issues/47257和https://github.com/tensorflow/tensorflow/issues/47277。 - CQ is not hot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接