「グラフ内のレプリケーション」を使用している場合、グラフには計算ノードの複数のコピーが含まれています。通常、デバイスごとに1つのコピーがあります(分散CPUトレーニングを行っている場合はワーカータスク1つ、GPU分散またはローカルのマルチGPUトレーニングを行っている場合)。すべてのレプリカが同じグラフ内にあるため、トレーニングプロセス全体を制御するには、tf.Session
が1つ必要です。 は、を呼び出さないワーカーにtf.Session
のオブジェクトを作成する必要があります。
グラフ内のトレーニングでは、パフォーマンスの分離のためにワーカータスクとは別の1つのマスターを持つのが一般的ですが、クライアントプログラムと一緒に配置することができます。その場合は、単に"client"
という単一タスクジョブを作成し、そのタスクでserver.target
を使用してセッションを作成します。次の例では、あなたの"client"
、"worker"
、および"ps"
仕事のために、単一のスクリプトを書くことができる方法を示しています。
server = tf.train.Server({"client": ["client_host:2222"],
"worker": ["worker_host0:2222", ...],
"ps": ["ps_host0:2222", ...]})
if job_name == "ps" or job_name == "worker":
server.join()
elif job_name == "client":
# Build a replicated graph.
# ...
sess = tf.Session(server.target)
# Insert training loop here.
# ...
私はまた、各ワーカーのためのserver.join()を呼び出してもいいですか?または、どのように各ワーカーのtf.Sessionオブジェクトを作成せずにワーカーを統合するのですか? – Paul
はい、 'server.join()'を呼び出すことは重要です(そうしないと、ワーカーは何もしなくなり、ただ終了します)。私は100%あなたが労働者を「統合する」ことを意味するわけではありませんが、あなたが保障しなければならない主なことは、すべてのプロセスが同じ 'tf.trainで作成された' tf.train.Server'を持つことです。クラスタスペックは、すべてのワーカー(およびPSタスク)の名前を指定します。 – mrry
ワーカーでは、「ターゲットサーバー:grpc:// localhost:1338」というメッセージが表示されます。マスターはtf.Session.run()を呼び出し、マスター・プロセスはすべて完了した時点で終了します。残念ながら、ワーカーは "Started with server:grpc:// localhost:1338"と表示し、処理を終了しません。マスターが完了したら、各作業者のプロセスを自動的に終了する方法はありますか? – Paul