2016-11-20 141 views
3

作为tensorflow纸状态,Tensorflow的跨装置的通信是通过将‘接收节点’和‘发送节点’到设备来实现的。Tensorflow跨设备通信

从我的理解,该设备(请只考虑CPU的设备都参与)负责执行操作的计算。但是,数据(例如:从操作产生的张量,可变缓冲区)驻留在内存中。我不知道如何实现从一个设备到另一个设备的数据传输物理。我猜数据传输是通过共享内存来实现的。是对的吗?

我将理解任何解释/对应关于所述数据传输是如何实现的代码。 PS:TensorFlow paper link,图4显示了跨设备通信机制。

回答

5

在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 OPS数据流图形通信。对于具有源和在不同的设备的目的地的每个边缘,所述图形分割器插入一个对共享相同“会合键” SendRecv OPS(自动生成的字符串名称被用作在会合索引中的密钥待传递张量)。 implementation of the Send op很简单:它调用Rendezvous::Send(),传入它的集合点和单输入张量,然后立即返回而没有阻塞。 implementation of the Recv op稍微复杂一些:它注册了一个回调函数,当具有给定密钥的张量变得可用时。 callback负责“产生”Recv op的输出,并解除后续的计算。

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

  • IntraProcessRendezvous处理在同一进程中的数据的设备之间的传输。在传输在同一进程中的两个CPU设备之间(不太可能)的事件中,传输可以通过simple Tensor assignment来实现。否则,TensorFlow kicks off用于在CPU和GPU设备之间传输数据的特定于设备的DMA例程。

  • BaseRemoteRendezvous类及其子类在发送方和接收方可以处于不同进程的情况下处理跨设备通信。这个类的主要实现是RpcRemoteRendezvous,其中uses gRPC来处理远程传输。

+0

非常感谢您! @mrry – kz28

+0

@mrry非常具体的指令 –