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