【问题标题】:Tensorflow Inception Multiple GPU Training Loss is not Summed?Tensorflow Inception Multiple GPU Training Loss 没有求和?
【发布时间】:2016-07-23 20:29:24
【问题描述】:

我正在尝试查看 Tensorflow 的多个 GPU 的初始代码(在 1 台机器上)。我很困惑,因为据我了解,我们从不同的塔(也就是 GPU)获得了多个损失,但评估的 loss 变量似乎只是最后一个塔的损失,而不是所有塔损失的总和:

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

【问题讨论】:

    标签: neural-network tensorflow conv-neural-network


    【解决方案1】:

    出于监控目的,考虑到所有塔都按预期工作,单塔损失与所有塔损失的平均值一样具有代表性。这是因为批次和分配给它的塔之间没有关系。

    但是train_op 使用来自所有塔的梯度,就像 line 263278 一样,所以技术上的培训应该考虑所有塔的批次。

    请注意,损失平均值的方差低于单塔损失的方差,但它们的期望值相同。

    【讨论】:

      【解决方案2】:

      是的,根据此代码,损失不会在 gpus 中求和或平均。每个 gpu 的损失在每个 gpu(塔)内部用于梯度计算。只有梯度是同步的。所以isnan测试只针对最后一个gpu处理的部分数据进行。这并不重要,但可能是一个限制。

      如果真的需要,我认为您可以执行以下操作来获得跨 gpus 的平均损失:

      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中的loss替换为mean_loss:

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

      loss_value 现在是所有 gpus 处理的损失的平均值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-05-21
        • 2020-12-04
        • 2017-12-13
        • 2020-12-21
        • 2018-11-10
        • 1970-01-01
        • 2016-11-20
        • 2018-08-16
        相关资源
        最近更新 更多