1

在 tensorflow多 GPU CIFAR 10 示例中,对于每个 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 上),但是会返回什么损失值?只有loss在最后一个 GPU 上?我没有看到实际loss变量的任何聚合。

4

2 回答 2

2

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

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

Tensor("tower_1/total_loss_1:0", shape=(), dtype=float32, device=/device:GPU:1)
于 2017-01-11T16:29:02.153 回答
1

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

于 2018-01-04T20:37:08.797 回答