2016-07-04 13 views
1

Im tensorflow multi-gpu CIFAR 10 example für jede GPU berechnen sie den Verlust (Linien 174-180)Multi-GPU CIFAR10 Beispiel in tensorflow: aggregiert Verlust

for i in xrange(FLAGS.num_gpus): 
    with tf.device('/gpu:%d' % i): 
    with tf.name_scope('%s_%d' % (cifar10.TOWER_NAME, i)) as scope: 
     loss = tower_loss(scope) 

Wenn ein paar Zeilen unter (Leitung 246), bewerten sie loss mit

_, loss_value = sess.run([train_op, loss]) 

welcher Verlust wird genau berechnet?

Ich schaute auf die tower_loss Funktion, aber ich sehe keine inkrementelle Aggregation über alle GPUs (Türme).

Ich verstehe, dass der gesamte Graph ausgeführt wird (über alle GPUs), aber welcher Wert des Verlustes wird zurückgegeben? Nur die loss auf der letzten GPU? Ich sehe keine Aggregation auf der aktuellen loss Variable.

Antwort

2

Die berechnete loss ist in der Tat nur der Verlust auf der letzten GPU. Im Code verwenden sie eine Python-Variable loss, um auf den Tensor zuzugreifen.

Sie können dies auch einfach überprüfen, indem Sie die Python-Variable drucken, die diesen Tensor darstellt. Z.B. print(loss) auf Leitung 244 Zugabe (mit einem 2-GPU-Setup), kehrt:

Tensor("tower_1/total_loss_1:0", shape=(), dtype=float32, device=/device:GPU:1) 
0

denke ich, der Gradient aus dem Verlust von jedem GPU Turm, berechnet durch die tower_grads Liste angehängt wird, und average_grad Funktion Mittelwert alles Gradienten. Ich verstehe die Frage hier nicht ganz, da die tower_loss() - Funktion innerhalb einer GPU liegt, die Aggregation und die Synchronisation aller GPU-Ausgaben werden daraus gesammelt. Die vorherige Antwort von print wird definitiv das letzte GPU-Ergebnis ausgeben, da es die letzte Ausgabe der for-Schleife aller GPU-Läufe ist, aber es bedeutet nicht, dass nur der letzte Verlust gesammelt wird.