张量流中的多 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。
在张量流 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。