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

时间:2016-07-04 17:45:05

标签: tensorflow deep-learning multi-gpu

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

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

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