我正在使用多个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
为什么?有原因吗?