分散トレーニング中は、各エポック後に同期したい、チーフワーカーにいくつかの計算を行い、これらの計算に応じてトレーニングを進めるか中止します。私はそうするための障壁が必要です。分散型テンソルフローで障壁を作る正しい方法は何ですか?
私は、ドキュメントに似た何かを見ていないので、私は(勾配が保存され、分散訓練に適用される方法に類似)のキューに基づいたソリューションを実装:
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))
アイデアがあたりのキューを作成することですワーカー。 '信号'の場合、私は各キューのトークンをプッシュし、 '結合'のために対応するキューから非常に多くのトークンをデキューします。
質問は正しい方法ですか、それとも良い方法ですか?
SyncReplicasオプティマイザでこのような何かの強固な実装がhttps://github.com/tensorflow/tensorflow/blob/e8e06c5b66d7833ea8715c32c7ab9739714225fc/tensorflow/python/training/sync_replicas_optimizer(すなわち、いくつかのプロセスが/再起動を死ぬ場合でも動作します)あります。パイ#L34 –