我试图在多个GPU上运行一个简单的前馈网络(异步更新共享权重)。
然而,我无法得到重量分享。
根据我所做的研究,我只需要将reuse=True
设置为variable_scope
,但这似乎不起作用:
for i_, gpu_id in enumerate(gpus):
with tf.device(gpu_id):
# [Build graph in here.]
with variable_scope.variable_scope(variable_scope.get_variable_scope(), reuse=i_>0):
x = tf.placeholder(tf.float32, [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
y_ = tf.placeholder(tf.float32, [None, 10])
# More code..., see pastebin link below
# Start an interactive tensorflow session
sess = tf.Session()
# Initialize all variables associated with this session
sess.run(tf.initialize_all_variables())
以上是代码的一个示例,在完整的代码(https://pastebin.com/i4NBnHHC)中,我展示了如何在一个GPU上训练不会更新另一个GPU上的权重。
最佳答案
最简单的解决方案是使用in-graph replication:
在图形复制中。在这种方法中,客户机构建一个
一组参数(固定到tf.Graph
的tf.Variable
节点中);以及
模型的计算密集型部分的多个副本,每个副本
固定到/job:ps
中的其他任务。
为此,您只需将参数(占位符和变量)放在CPU设备上:
# in-graph replication
import tensorflow as tf
num_gpus = 2
# place the initial data on the cpu
with tf.device('/cpu:0'):
input_data = tf.Variable([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.],
[10., 11., 12.]])
b = tf.Variable([[1.], [1.], [2.]])
# split the data into chunks for each gpu
inputs = tf.split(input_data, num_gpus)
outputs = []
# loop over available gpus and pass input data
for i in range(num_gpus):
with tf.device('/gpu:'+str(i)):
outputs.append(tf.matmul(inputs[i], b))
# merge the results of the devices
with tf.device('/cpu:0'):
output = tf.concat(outputs, axis=0)
# create a session and run
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print sess.run(output)
在tensorflow社区中,一种更复杂的称为图间复制的方法是more preferred,但是需要一种更复杂的配置
/job:worker
。你可以在他们的tutorial on distributed tensorflow中看到这个例子。建议this post比较不同的分布设置。
关于python - Tensorflow-在多个GPU上复制模型并共享变量?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44854258/