Tensorflow - 在多个GPU上复制模型并共享变量?

时间:2017-06-30 20:18:22

标签: python tensorflow parallel-processing gpu distributed-computing

我正在尝试在多个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上的权重。

1 个答案:

答案 0 :(得分:0)

最简单的解决方案是使用in-graph replication

  

图形内复制。在此方法中,客户端构建一个包含tf.Graph的{​​{1}}   一组参数(在tf.Variable个节点固定为/job:ps);和   每个模型的计算密集型部分的多个副本   固定在/job:worker中的其他任务。

为此您只需将参数(占位符和变量)放在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,但需要使用tf.train.ClusterSpec进行更复杂的配置。您可以在tutorial on distributed tensorflow

中查看示例

推荐用于比较不同分发设置的this post