2016-09-22 12 views
0

分散トレーニング中は、各エポック後に同期したい、チーフワーカーにいくつかの計算を行い、これらの計算に応じてトレーニングを進めるか中止します。私はそうするための障壁が必要です。分散型テンソルフローで障壁を作る正しい方法は何ですか?

私は、ドキュメントに似た何かを見ていないので、私は(勾配が保存され、分散訓練に適用される方法に類似)のキューに基づいたソリューションを実装:

def build_barrier(tasks, task_index, barrier_name): 
    queues = [] 
    for i, task in enumerate(tasks): 
     with tf.device('%s/cpu:0' % task): 
      with tf.name_scope(barrier_name): 
       queues.append(
        tf.FIFOQueue(
         len(tasks), 
         (tf.float32), 
         shapes=(()), 
         name=str(i), 
         shared_name=str(i))) 

    with tf.control_dependencies([queue.enqueue(1.) for queue in queues]): 
     return queues[task_index].dequeue_many(len(tasks)) 

アイデアがあたりのキューを作成することですワーカー。 '信号'の場合、私は各キューのトークンをプッシュし、 '結合'のために対応するキューから非常に多くのトークンをデキューします。

質問は正しい方法ですか、それとも良い方法ですか?

+1

SyncReplicasオプティマイザでこのような何かの強固な実装がhttps://github.com/tensorflow/tensorflow/blob/e8e06c5b66d7833ea8715c32c7ab9739714225fc/tensorflow/python/training/sync_replicas_optimizer(すなわち、いくつかのプロセスが/再起動を死ぬ場合でも動作します)あります。パイ#L34 –

答えて

1

解決策は、SyncReplicasOptimizerと非常によく似ています。 SyncReplicasOptimizerでは、バリアントをシミュレートするために同期トークンキューを使用し、各変数が累積してgrad更新を平均するためのアキュムレータを使用します。これは非常に典型的なバルク同期並列処理ですが、TensorflowでStale Synchronous Parallelismを実装する追加の作業があります。

また、Tensorflowは最新のバージョンでBarrierを提供しています。詳細については、こちらをご覧ください。

関連する問題