2017-12-24 4 views
0

分散TensorFlowのcontrib実装に問題があります。関連性のない詳細を気にすることなく、メモリコピーをCPUに保存するために、RDMA書き込みをソース/宛先テンソルから直接使用するために、特定のメッセージプロトコルを適用します。TensorFlowは、異なるステップID間でバッファを共有するテンソルをどのように同期させますか

私は2辺がABで、ABからテンソルを受け取りたいとします。 次のようにプロトコルである:

  • ABREQUESTメッセージを送信します。
  • Bローカルでテンソルを検索し(BaseRendezvousMgr::RecvLocalAsync)、AMETA-DATAという応答を送信します。
  • Aは、メタデータを使用して宛先テンソルを割り当て、ACKを宛先アドレスを含むBに送信します。
  • BACKを受信し、宛先アドレスへのリモートDMA書き込みを実行します。 REQUESTACK

Bは、ローカル生きテンソル続ける(および文献を()> 0)、ローカルマップへのローカルマップ(REQUESTコピーテンソルでそれを保存することで、ACKポップそれは地図から)。

私のソリューションを検証するために、各ステップでチェックサム計算を追加しました。場合によっては、REQUESTACKの間でチェックサムが変更されることがあります。私は2人の労働者とPSを実行すると、この問題が発生:

enter image description here

  • ライン1ワーカー0
  • ライン2からREQUESTある労働者にACKで0
  • ライン3は、作業者1にREQUESTです。
  • 行4は、作業者1にACKです。

各行の最後の値はチェックサムです。エラーは約50%の時間に発生します。私は常に4行目でそれを見ます。私は問題のテンソルが全てのstep-idの共有バッファを持っていることも見てきました。(これは与えられたものです。だから、他のスレッドが行3と行4との間でテンソルの内容を変更した可能性が非常に高いです。

質問はどうですか? 1行目と2行目、2行目と3行目の間でコンテンツが変更されないのはなぜですか?強調すると、3行目と4行目との間の時間は0.04秒未満であり、2と3との間の時間はほぼ2.5秒である。

ありがとうございました。必要に応じてコードが転記されます。

答えて

1

共有バッファにtf.Variableを使用していますか? tfe.Variable(妥当な読み書きセマンティクスを有効にする)またはtf.get_variable(...、use_resource = True)を使用すると、同期の問題がなくなります。

これ以外の点は、グラフを生成する方法が分からなければ理解しにくいです。

関連する問題