我正在使用多个 GPU。我发现基本上使用多个 GPU 就是为每个设备声明一个具有共享权重的网络。
然后,权重实际上位于第一个 GPU( /gpu:0
) 上并与剩余的 GPU 共享,我确保使用 Tensorboard。以下是代码。
with tf.variable_scope(tf.get_variable_scope()):
for gid in range(num_gpus):
with tf.device('/gpu:%d' % gid):
with tf.name_scope('tower%s' % gid) as scope:
net = Net(...)
tf.get_variable_scope().reuse_variables()
完全没问题吗?或者在Net
定义中,我应该明确声明每个权重(例如,卷积层权重)/cpu:0
吗?
在CIFAR10
多 GPU 示例中,它们在 CPU 中声明权重并与多个 GPU 共享它们,如
kernel = _variable_with_weight_decay('weights',shape=[5, 5, 3, 64],...)
biases = _variable_on_cpu('biases', [64], tf.constant_initializer(0.0))
# _variable_with_weight_decay() and _variable_on_cpu explcitly() CPU
为什么?有原因吗?