2016-07-23 5 views
1

Ich versuche, Tensorflow Inception-Code für mehrere GPUs (auf 1 Maschine) zu gehen. Ich bin verwirrt, weil wir mehrere Verluste aus den verschiedenen Türmen, auch bekannt als die GPUs erhalten, wie ich sie verstehe, aber die loss Variable scheint ausgewertet nur der letzte Turm zu sein und nicht die Summe der Verluste aus allen Türmen:Tensorflow Inception Multiple GPU Trainingsverlust wird nicht summiert?

for step in xrange(FLAGS.max_steps): 
    start_time = time.time() 
    _, loss_value = sess.run([train_op, loss]) 
    duration = time.time() - start_time 

wo loss zuletzt speziell für jeden Turm definiert wurde:

for i in xrange(FLAGS.num_gpus): 
    with tf.device('/gpu:%d' % i): 
    with tf.name_scope('%s_%d' % (inception.TOWER_NAME, i)) as scope: 
     # Force all Variables to reside on the CPU. 
     with slim.arg_scope([slim.variables.variable], device='/cpu:0'): 
     # Calculate the loss for one tower of the ImageNet model. This 
     # function constructs the entire ImageNet model but shares the 
     # variables across all towers. 
     loss = _tower_loss(images_splits[i], labels_splits[i], num_classes, 
          scope) 

Könnte jemand erklären, wo der Schritt die Verluste aus verschiedenen Türmen zu kombinieren? Oder sind wir einfach der Verlust eines einzigen Turms, der auch die Verluste des anderen Turms repräsentiert?

Hier ist der Link zum Code: https://github.com/tensorflow/models/blob/master/inception/inception/inception_train.py#L336

Antwort

1

Zur Überwachung, unter Berücksichtigung aller Türme wie erwartet, Verlust einzelner Turm ist so repräsentativ wie Durchschnitt aller Verluste Türme. Dies liegt daran, dass keine Beziehung zwischen Charge und Turm besteht, der zugeordnet ist.

Aber die train_op verwendet Gradienten von allen Türmen, wie line 263, 278, so technisch Ausbildung berücksichtigt Chargen von allen Türmen, wie es sein sollte.

Beachten Sie, dass der Durchschnitt der Verluste eine geringere Varianz als der Verlust des einzelnen Turms haben wird, aber sie werden die gleiche Erwartung haben.

1

Ja, gemäß diesem Code werden Verluste nicht über GPU summiert oder gemittelt. Der Verlust pro GPU wird innerhalb jedes GPU (Turms) zur Gradientenberechnung verwendet. Nur Gradienten sind synchronisiert. Der Isnan-Test wird also nur für den Teil der Daten durchgeführt, der von der letzten GPU verarbeitet wurde. Dies ist nicht entscheidend, kann aber eine Einschränkung darstellen.

Wenn wirklich nötig ist, ich denke, Sie tun können, als Verlust Quer GPUs folgt werden gemittelt:

per_gpu_loss = [] 
for i in xrange(FLAGS.num_gpus): 
    with tf.device('/gpu:%d' % i): 
     with tf.name_scope('%s_%d' % (inception.TOWER_NAME, i)) as scope: 
      ... 
      per_gpu_loss.append(loss) 

mean_loss = tf.reduce_mean(per_gpu_loss, name="mean_loss") 
tf.summary.scalar('mean_loss', mean_loss) 

und dann ersetzen Verlust in sess.run als mean_loss:

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

loss_value ist jetzt ein Durchschnitt über Verluste, die von allen GPUs verarbeitet werden.

Verwandte Themen