sendop/recvop and Rendezvous
tensorflow 如果是单进程多卡的化,计算图也是会分割的,一个卡对应一个计算子图。无论是单进程多卡还是多机多进程多卡,tf计算图都会分割成计算子图,一个卡对应一个计算子图。为了协作完成整个计算图的计算,子图之间需要有通信机制。
tensorflow 在分割子图时,会在图之间插入一些send/recv operations。这些节点负责在图之间传递数据。send/recv 通过一种Rendezvous机制传输数据。简单的说,Rendezvous封装了通信逻辑,类似一个信箱,sender 把数据放进去,receiver 把数据从里面拿出来,sender不阻塞,receiver可能阻塞。
对应于单进程模式和多进程模式,有两种Rendezvous,分别是IntraProcessRendezvous和RpcRemoteRendezvous。两种Rendezvous都继承了基类Rendezvous,都持有一个LocalRendezvousImpl的local变量,LocalRendezvousImpl也继承了Rendezvous,可以理解为这里使用了代理设计模式。
LocalRendezvousImpl简单地说是维护一个table,生产者把数据放进table,消费者从table里消费数据。IntraProcessRendezvous只做一些简单的处理。
RpcRemoteRendezvous 有些复杂。send 时,把数据保存在local ,等消费者通过rpc来取;rec 时,如果消费者消费的是同一个进程里另一个excutor 生产的数据,直接去local 取,否则通过grpc 去获取。
接下来,我们来看一下源码。
未完待续