8

Tensorflow の論文が述べているように、Tensorflow のクロスデバイス通信は、「受信ノード」と「送信ノード」をデバイスに追加することによって実現されます。

私の理解では、デバイス (CPU デバイスのみが関与していることを考慮してください) は、操作の計算を実行する責任があります。ただし、データ(例:操作から生成されたテンソル、変数バッファ)はメモリに常駐します。あるデバイスから別のデバイスへのデータ転送が物理的にどのように行われるのかわかりません。データ転送は共有メモリによって実現されると思います。そうですか?

データ転送がどのように行われるかについての説明/対応するコードをいただければ幸いです。PS: TensorFlow ペーパー リンク、図 4 はクロスデバイス通信メカニズムを示しています。

4

1 に答える 1

16

RendezvousTensorFlow では、デプロイに応じて複数の異なる実装を持つインターフェイスを使用してクロスデバイス通信が実現されます。そのインターフェースに関するコメントは、一般的な考え方を説明しています。

// 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、データを転送する実際の作業を実行します。

  • IntraProcessRendezvous同じプロセスでデバイス間のデータ転送を処理します。転送が同じプロセス内の 2 つの CPU デバイス間で行われる (可能性は低い) 場合、転送は単純なTensor代入によって実現できます。それ以外の場合、TensorFlowデバイス固有の DMA ルーチンを開始して、CPU と GPU デバイスの間でデータを転送します。

  • クラスとそのBaseRemoteRendezvousサブクラスは、送信側と受信側が異なるプロセスにある可能性がある場合に、クロスデバイス通信を処理します。このクラスの主な実装は でRpcRemoteRendezvousgRPCを使用してリモート転送を処理します。

于 2016-11-21T00:49:55.273 に答える