在张量流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
变量上看到任何聚合。
答案 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循环的最后一次输出,但并不意味着只收集了最后一次丢失。