2016-07-23 77 views
1

我正在嘗試通過Tensorflow的多個GPU(1臺機器)的初始代碼。據我所知,我很困惑,因爲我們從不同的塔樓,也就是GPU中獲得了多個損失,但是loss變量評估似乎只是最後一個塔而不是所有塔的損失總和:Tensorflow初始多GPU處理損失不算總和?

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

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: 
     # 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) 

有人能解釋其中的步驟是將損失從不同的塔結合?或者,我們是否僅僅是一座塔的損失來代表另一座塔的損失呢?

這裏的鏈接代碼: https://github.com/tensorflow/models/blob/master/inception/inception/inception_train.py#L336

回答

1

對於監控的目的,考慮到所有的塔如預期,單塔的損失爲代表的平均的所有塔的損失。這是由於它所分配的批次和塔之間沒有關係。

但是train_op使用所有塔的梯度,根據line 263,278,所以技術上的訓練考慮到所有塔的批次,因爲它應該是。

請注意,平均損失的方差比單塔的損失低,但他們會有相同的期望值。

1

是的,根據這個規範,損失不會在gpus上求和或平均。每個gpu(塔)內使用每個gpu的損耗進行梯度計算。只有漸變是同步的。所以isnan測試只針對最後一個gpu處理的數據部分進行。這並不重要,但可以是一個限制。

如果真的需要,我認爲你可以做如下拿到場均失橫的GPU:

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) 

,然後替換sess.run損失mean_loss:

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

loss_value現所有gpus處理的損失的平均值。