Rendezvous
TensorFlow では、デプロイに応じて複数の異なる実装を持つインターフェイスを使用してクロスデバイス通信が実現されます。そのインターフェースに関するコメントは、一般的な考え方を説明しています。
// 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は、グラフがデバイス間で分割されたときにグラフに自動的に追加される ops を使用Send
して、データフロー グラフ内の通信を表します。Recv
異なるデバイス上にソースと宛先を持つエッジごとに、グラフ パーティショナーは、同じ「ランデブー キー」 (保留中のテンソルのランデブー インデックスでキーとして使用される自動生成された文字列名) を共有するSend
とop のペアを挿入します。Recv
伝達されます)。opの実装Send
は単純です。Rendezvous::Send()
ランデブー キーと単一の入力テンソルを渡して を呼び出し、ブロックせずにすぐに戻ります。opの実装Recv
はもう少し複雑です: 指定されたキーを持つテンソルが利用可能になったときに呼び出されるコールバックを登録します。そのコールバックRecv
は、 opの出力を「生成」し、後続の計算のブロックを解除します。
実装はRendezvous
、データを転送する実際の作業を実行します。