私は2つの概念について混乱しましたIn-graph replication
。Between-graph replication
反復トレーニングTensorflow の公式 How-to で。
上記のリンクにはこう書いてある
グラフ内レプリケーション。このアプローチでは、クライアントは 1 セットのパラメータ (/job:ps に固定された tf.Variable ノード内) を含む単一の tf.Graph を構築します。...
これはつまり複数
tf.Graph
アプローチに何かありますかBetween-graph replication
? はいの場合、提供された例の対応するコードはどこにありますか?Between-graph replication
上記のリンクにはすでに例がありますが、In-graph replication
実装(疑似コードでも構いません)を提供して、 との主な違いを強調していただけますかBetween-graph replication
?前もって感謝します!
編集_1: その他の質問
詳細な説明と gist コードをありがとうございます @mrry @YaroslavBulatov! 皆さんの回答を見て、次の 2 つの質問があります。
次のような記述がある。反復トレーニング:
グラフ間のレプリケーション。このアプローチでは、各/job:workerタスクごとに別々のクライアントがあり、通常はワーカータスクと同じプロセスにあります。各クライアントは類似グラフパラメータ(以前と同様にtf.train.replica_device_setter()を使用して/job:psに固定され、同じタスクに決定論的にマッピングされます)と単一コピーモデルの計算集約型部分は、/job:worker のローカル タスクに固定されます。
上記の太字の単語に関連するサブ質問が 2 つあります。
(A) なぜ各クライアントが構築すると言うのか類似グラフ、 だがしかし同じグラフ? の例では、各クライアントにグラフが組み込まれているのだろうか?反復トレーニング以下のグラフ構築コードはすべての s 内で共有されるため、同じである必要があります
worker
。# Build model...
loss = ...
global_step = tf.Variable(0)
(B) そうではないでしょうか複数のコピーモデルの計算集約型部分の一部です。複数の
workers
?があるためです。の例では反復トレーニング複数のマシンでトレーニングをサポートし、それぞれに複数のGPUが搭載されていますか?そうでない場合、
In-graph replication
各マシンで複数のGPUでのトレーニングをサポートするために、およびマシン間のトレーニングの両方を同時に使用できますか?この質問をするのは、@mrryが、が基本的にで使用される方法と同じであるBetween-graph replication
と指摘したためです。In-graph replication
複数の GPU 用の CIFAR-10 サンプル モデル。
ベストアンサー1
まず、歴史的な背景から言うと、「グラフ内レプリケーション」は TensorFlow で最初に試したアプローチですが、多くのユーザーが求めるパフォーマンスを達成できなかったため、より複雑な「グラフ間」アプローチが分散トレーニングを実行するための現在推奨されている方法です。などの高レベルライブラリは、分散トレーニングtf.learn
に「グラフ間」アプローチを使用します。
具体的な質問にお答えします:
-
tf.Graph
これは、グラフ間レプリケーション アプローチに複数の があることを意味しますか? そうである場合、提供された例の対応するコードはどこにありますか?はい。典型的なグラフ間レプリケーション設定では、各ワーカーレプリカごとに別々のTensorFlowプロセスが使用され、それぞれが
tf.Graph
モデルごとに別々のものを構築します。通常、各プロセスはグローバルデフォルトグラフ(tf.get_default_graph()
) であり、明示的に作成されません。(原則的には、各セッションのオプションを別々に構成する限り、同じ基礎グラフを共有する同じオブジェクト
tf.Graph
と複数のオブジェクトを持つ単一の TensorFlow プロセスを使用できますが、これは珍しい設定です。)tf.Session
tf.ConfigProto.device_filters
-
上記のリンクにはすでにグラフ間レプリケーションの例がありますが、グラフ内レプリケーションの実装 (疑似コードでも構いません) を提供し、グラフ間レプリケーションとの主な違いを強調していただける方はいらっしゃいますか?
歴史的な理由から、グラフ内複製の例は多くありません(ヤロスラフの要点グラフ内レプリケーションを使用するプログラムでは、通常、各ワーカーに同じグラフ構造を作成するループが含まれます(たとえば、要旨の74行目)、ワーカー間で変数の共有を使用します。
グラフ内レプリケーションが存続する唯一の場所は、単一のプロセスで複数のデバイス(複数のGPUなど)を使用する場合です。複数の GPU 用の CIFAR-10 サンプル モデルこのパターンの例は次の通りです(GPUデバイス上のループを参照)。ここ)。
(私の意見では、複数のワーカーと単一のワーカー内の複数のデバイスの扱い方に矛盾があるのは残念です。グラフ内レプリケーションは、レプリカ間の暗黙的な共有に依存しないため、グラフ間レプリケーションよりも理解しやすいです。TF tf.learn
-Slim などの高レベル ライブラリは、これらの問題の一部を隠蔽し、将来的に優れたレプリケーション スキームを提供できるという希望を与えてくれます。)
-
なぜ各クライアントが似ているグラフではなく同じグラフ?
これらは同一である必要がないためです (また、これを強制する整合性チェックはありません)。特に、各ワーカーは、異なる明示的なデバイス割り当て ( 、 など) を持つグラフを作成する場合があります
"/job:worker/task:0"
。"/job:worker/task:1"
チーフワーカーは、非チーフワーカーでは作成されない (または使用されない) 追加の操作を作成する場合があります。ただし、ほとんどの場合、グラフは論理的に (つまり、デバイス割り当てを除いて) 同じです。そうではないでしょうか複数のコピー複数のワーカーがいるため、モデルの計算集約型部分はどうなりますか?
通常、各ワーカーは、モデルの計算集約型部分の単一のコピーを含む個別のグラフを持っています。ワーカーのグラフは、私ワーカーのノードが含まれていませんじゅう(i ≠ jと仮定)。(例外として、分散トレーニングにグラフ間レプリケーションを使用し、各ワーカーで複数のGPUを使用するためにグラフ内レプリケーションを使用する場合があります。その場合、ワーカーのグラフには通常、いいえグラフの計算集約型部分のコピー。いいえそのワーカー内の GPU の数です。
-
の例では反復トレーニングそれぞれ複数の GPU を搭載した複数のマシンでのトレーニングをサポートしますか?
サンプル コードでは、複数のマシンでのトレーニングのみをカバーしており、各マシンの複数の GPU でトレーニングする方法については何も説明していません。ただし、テクニックは簡単に構成できます。例のこの部分では、次のようになります。
# Build model... loss = ...
...ローカル マシンの GPU にループを追加して、それぞれ複数の GPU を持つ複数のワーカーの分散トレーニングを実現できます。