2016-04-21 10 views
3

Ich benutze zwei Arbeiter/Replikate und ein Parameter-Server. wieverteilt Tensorflow tf.train.SyncReplicasOptimizer scheint nicht synchronisiert

--ps_hosts='hosta.com:2222' --worker_hosts='hosta.com:2223,hostb.com:2223' 

Mit dem tf.train.SyncReplicasOptimizer wie

opt = tf.train.SyncReplicasOptimizer(
      opt, 
      replicas_to_aggregate=2, 
      replica_id=FLAGS.task_id, 
      total_num_replicas=2, 
      variables_to_average=variables_to_average) 

Aus dem Protokoll i worker0 (hosta.com:2223) ist viel schneller als worker1 (hostb.com:2223) sehen aufgrund von Cross-Machine-Netzwerk kommunizieren. Sieht so aus, als ob Worker0 die Gradienten von worker1 nicht abgewartet hat. Selbst nachdem ich den Job von worker1 beendet habe, wird worker0 noch verarbeitet. Und worker0 viele doppelte Protokolle wie

INFO:tensorflow:Worker 0: 2016-04-21 03:24:02.659749: step 29010, loss = 0.40(812.0 examples/sec; 0.315 sec/batch) 
INFO:tensorflow:Worker 0: 2016-04-21 03:24:02.990509: step 29010, loss = 0.59(775.3 examples/sec; 0.330 sec/batch) 
INFO:tensorflow:Worker 0: 2016-04-21 03:24:04.650522: step 29013, loss = 0.56(774.0 examples/sec; 0.331 sec/batch) 
INFO:tensorflow:Worker 0: 2016-04-21 03:24:04.989555: step 29013, loss = 0.47(756.3 examples/sec; 0.338 sec/batch) 
INFO:tensorflow:Worker 0: 2016-04-21 03:24:06.549120: step 29016, loss = 0.49(816.6 examples/sec; 0.313 sec/batch) 
INFO:tensorflow:Worker 0: 2016-04-21 03:24:06.867229: step 29016, loss = 0.48(806.1 examples/sec; 0.318 sec/batch) 

hat also sollte nicht gehangen die tf.train.SyncReplicasOptimizer und alle der replicas_to_aggregate Arbeiter warten?

Antwort

7

Die tf.train.SyncReplicasOptimizer erfordert nur, dass es Gradienten von replicas_to_aggregate verschiedene Schritte erhält, bevor sie aggregieren und anwenden, aber nicht erfordern, dass sie aus verschiedenen Prozessen stammen. Ihr worker0 scheint mindestens doppelt so schnell zu laufen wie worker1 und führt zwei Schritte aus, bevor worker1 einen Schritt abschließt.

Wie Sie festgestellt haben, ist dies keine effiziente Nutzung von verteilten Ressourcen! Ich würde vorschlagen, versuchen Sie, Ihr System zu balancieren, so dass die Parameter von einer oder mehreren Maschinen bedient werden, die die gleiche Bandbreite wie die beiden Arbeiter haben. Eine Möglichkeit wäre, einen weiteren Parameterserver hinzuzufügen, der unter hostb.com:2222 läuft, so dass (ungefähr) die Hälfte der Parameter für jeden Arbeiter lokal ist.

+0

Danke. Wenn Trainingsdaten gleichmäßig auf "worker0" und "worker1" mit unterschiedlicher Trainingsgeschwindigkeit aufgeteilt werden, werden einige Stapel von langsameren Worker ignoriert, sodass das Modell möglicherweise nicht ausreichend trainiert wird. – LiuJia