正如tensorflow论文所述,Tensorflow的跨设备通信是通过在设备中添加“接收节点”和“发送节点”来实现的。
根据我的理解,设备(请考虑仅涉及CPU设备)负责执行操作的计算。然而,数据(例如:操作产生的张量、变量缓冲区)驻留在内存中。不知道如何实现从一台设备到另一台设备的数据传输身体上的。我猜数据传输是通过共享内存来实现的。是对的吗?
我将感谢有关如何实现数据传输的任何解释/相应代码。
附:TensorFlow 论文链接,图4展示了跨设备通信机制。
在 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
and Recv
当图表跨设备分区时自动添加到图表中的操作。对于在不同设备上具有源和目标的每条边,图分区器会插入一对Send
and Recv
共享相同“集合点键”(自动生成的字符串名称,用作要通信的待处理张量的集合点索引中的键)的操作。这的实施Send op很简单:它调用Rendezvous::Send()
,传入其集合点键和单个输入张量,然后立即返回而不会阻塞。这的实施Recv op稍微复杂一些:它注册一个回调,当具有给定键的张量可用时调用。那callback负责“产生”输出Recv
op,并解除后续计算的阻塞。
The Rendezvous
实现执行传输数据的实际工作:
IntraProcessRendezvous在同一进程中处理设备之间的数据传输。如果传输发生在同一进程中的两个 CPU 设备之间(不太可能),则可以通过simple Tensor任务。否则,TensorFlow揭开序幕用于在 CPU 和 GPU 设备之间传输数据的设备特定 DMA 例程。
The BaseRemoteRendezvous类及其子类在发送方和接收方可以位于不同进程的情况下处理跨设备通信。该类的主要实现是RpcRemoteRendezvous, which 使用 gRPC处理远程传输。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)