张量流中的多 GPU CIFAR10 示例:聚合损失

Multi-GPU CIFAR10 example in tensorflow: aggregated loss

在张量流 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 变量的任何聚合。

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

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

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

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