【问题标题】:Multi-GPU CIFAR10 example in tensorflow: aggregated losstensorflow 中的多 GPU CIFAR10 示例:聚合损失
【发布时间】:2016-11-06 11:51:42
【问题描述】:

在 tensorflow multi-gpu CIFAR 10 example 中,他们为每个 GPU 计算损失(第 174-180 行

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)

当下面几行时(第 246 行),他们评估 loss

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

究竟计算了什么损失?

我查看了 tower_loss 函数,但没有看到所有 GPU(塔)上的任何增量聚合。

我知道整个图形正在执行(在所有 GPU 上),但是会返回什么损失值?最后一个 GPU 上只有 loss?我在实际的 loss 变量上没有看到任何聚合。

【问题讨论】:

    标签: tensorflow deep-learning multi-gpu


    【解决方案1】:

    计算出的loss 确实只是最后一个 GPU 上的损失。在代码中,他们使用 Python 变量 loss 来访问张量。

    您还可以通过打印表示该张量的 Python 变量来轻松验证这一点。例如。添加print(loss)on 第 244 行(使用 2-GPU 设置),将返回:

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

    【讨论】:

      【解决方案2】:

      我认为根据每个 GPU 塔的损失计算的梯度会附加到 tower_grads 列表中,并且 average_grad 函数会平均所有梯度。我不太明白这里的问题,因为 tower_loss() 函数在一个 GPU 内,所有 GPU 输出的聚合和同步都是从中收集的。 print前面的答案肯定会打印出最后的GPU结果,因为它是所有GPU运行的for循环的最后输出,但不代表只收集最后一个loss。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-17
        • 1970-01-01
        • 2017-08-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多