正如张量流论文所述,Tensorflow的跨设备通信是通过在设备中添加“接收节点”和“发送节点”来实现的。
根据我的理解,设备(请仅考虑涉及CPU设备)负责执行操作的计算。但是,数据(例如:从操作生成的Tensor,可变缓冲区)驻留在内存中。我不知道如何实现从一台设备到另一台设备的数据传输物理。我猜数据传输是通过共享内存实现的。是对的吗?
我将理解有关如何实现数据传输的任何解释/相应代码。 PS:TensorFlow paper link,图4显示了跨设备通信机制。
答案 0 :(得分:7)
在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使用Send
和Recv
操作代表数据流图中的通信,当图表跨设备分区时,这些操作会自动添加到图表中。对于在不同设备上具有源和目标的每个边,图分区器会插入一对Send
和Recv
个操作,这些操作共享相同的“集合点”(自动生成的字符串名称,用作要传达的未决张量的会合点索引中的关键字。 implementation of the Send
op很简单:它调用Rendezvous::Send()
,传入其集合键和单输入张量,然后立即返回而不会阻塞。 implementation of the Recv
op稍微复杂一点:当具有给定键的张量变得可用时,它会注册要调用的回调。 callback负责“生成”Recv
op的输出,并取消阻止后续计算。
Rendezvous
实现执行传输数据的实际工作:
IntraProcessRendezvous
处理同一进程中设备之间的数据传输。在(不太可能)事件中,传输在同一进程中的两个CPU设备之间,可以通过simple Tensor
assignment实现传输。否则,TensorFlow kicks off是一个特定于设备的DMA例程,用于在CPU和GPU设备之间传输数据。
在发送方和接收方可以处于不同进程的情况下,BaseRemoteRendezvous
类及其子类处理跨设备通信。此类的主要实现是RpcRemoteRendezvous
,uses gRPC用于处理远程传输。