要在多个GPU上训练模型,可以在第一个GPU上创建一组变量,并在cifar10_multi_gpu_train中在其他GPU上重复使用它们(tf.variable_scope(tf.get_variable_scope(), reuse=device_num != 0)
)。
但是我遇到official CNN benchmarks在本地复制设置中,他们为每个GPU使用新的变量范围(tf.variable_scope('v%s' % device_num)
)。由于所有变量都是随机初始化的,因此使用post init op将值从GPU:0
复制到其他变量。
然后两个实现都在CPU上平均渐变并反向传播结果(至少这是我认为,因为基准代码是神秘的:)) - 可能导致相同的结果。
这两种方法之间有什么区别,更重要的是什么更快?
谢谢。
答案 0 :(得分:0)
区别在于,如果要重复使用变量,则每次迭代都将从所有GPU的原始位置广播变量开始,而如果要复制变量,则不需要广播,因此共享不应该更快。
不共享的一个缺点是,某个地方的错误或数值不稳定会更容易导致不同的GPU最终为每个变量使用不同的值。