深度学习 - 多 GPU CIFAR10 张量流中的示例:聚合损失



在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 上),但是损失的值将返回什么?只有最后一个 GPU 上的loss?我在实际的loss变量上没有看到任何聚合。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新