2016-09-02 6 views
1

同期イングラフレプリケーションを使用する場合、私はtf.Session.run()を1回だけ呼び出します。同期内グラフ複製にはいくつのセッションオブジェクトが必要ですか?

質問1:は、私はまだ各ワーカーのための新しいセッションオブジェクトを作成する必要があり、セッションのターゲットとしてマスターサーバー(tf.Session.run()を呼び出す1)のURLを渡す必要がありますか?

質問2:server.targetを使用して各サーバーのセッションターゲットを取得できますか、具体的にマスターサーバーのURLを指定する必要がありますか。

答えて

2

「グラフ内のレプリケーション」を使用している場合、グラフには計算ノードの複数のコピーが含まれています。通常、デバイスごとに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. 
    # ... 
+0

私はまた、各ワーカーのためのserver.join()を呼び出してもいいですか?または、どのように各ワーカーのtf.Sessionオブジェクトを作成せずにワーカーを統合するのですか? – Paul

+0

はい、 'server.join()'を呼び出すことは重要です(そうしないと、ワーカーは何もしなくなり、ただ終了します)。私は100%あなたが労働者を「統合する」ことを意味するわけではありませんが、あなたが保障しなければならない主なことは、すべてのプロセスが同じ 'tf.trainで作成された' tf.train.Server'を持つことです。クラスタスペックは、すべてのワーカー(およびPSタスク)の名前を指定します。 – mrry

+0

ワーカーでは、「ターゲットサーバー:grpc:// localhost:1338」というメッセージが表示されます。マスターはtf.Session.run()を呼び出し、マスター・プロセスはすべて完了した時点で終了します。残念ながら、ワーカーは "Started with server:grpc:// localhost:1338"と表示し、処理を終了しません。マスターが完了したら、各作業者のプロセスを自動的に終了する方法はありますか? – Paul