分散TensorFlowのcontrib実装に問題があります。関連性のない詳細を気にすることなく、メモリコピーをCPUに保存するために、RDMA書き込みをソース/宛先テンソルから直接使用するために、特定のメッセージプロトコルを適用します。TensorFlowは、異なるステップID間でバッファを共有するテンソルをどのように同期させますか
私は2辺がA
とB
で、A
はB
からテンソルを受け取りたいとします。 次のようにプロトコルである:
A
はB
にREQUEST
メッセージを送信します。B
ローカルでテンソルを検索し(BaseRendezvousMgr::RecvLocalAsync
)、A
にMETA-DATA
という応答を送信します。A
は、メタデータを使用して宛先テンソルを割り当て、ACK
を宛先アドレスを含むB
に送信します。B
はACK
を受信し、宛先アドレスへのリモートDMA書き込みを実行します。REQUEST
とACK
間
、B
は、ローカル生きテンソル続ける(および文献を()> 0)、ローカルマップへのローカルマップ(REQUEST
コピーテンソルでそれを保存することで、ACK
ポップそれは地図から)。
私のソリューションを検証するために、各ステップでチェックサム計算を追加しました。場合によっては、REQUEST
とACK
の間でチェックサムが変更されることがあります。私は2人の労働者とPSを実行すると、この問題が発生:
- ライン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秒である。
ありがとうございました。必要に応じてコードが転記されます。