Tensorflow 如何在多个GPU之间共享包含可变长度序列批次的队列?

Tensorflow 如何在多个GPU之间共享包含可变长度序列批次的队列?,tensorflow,tf-slim,Tensorflow,Tf Slim,根据本文,由多个GPU共享一个队列可能更好。 链接建议我们可以增加批量大小,然后自己分割批次。然而,当输入数据是可变长度序列时,增加批大小可能会导致许多零填充值 例如,如果我们创建一个4序列批处理并拆分该批处理,它可能是 /gpu:0 x,x,x,0,0,0,0,0,0 x,x,x,x,x,x,x,x,x,x /gpu:1 x,x,0,0,0,0,0,0,0 x,x,x,x,0,0,0,0 我的问题是:如何生产这样的批次: /gpu:0 x,x,x,0,0,0,0,0,0 x,x,x

根据本文,由多个GPU共享一个队列可能更好。 链接建议我们可以增加批量大小,然后自己分割批次。然而,当输入数据是可变长度序列时,增加批大小可能会导致许多零填充值

例如,如果我们创建一个4序列批处理并拆分该批处理,它可能是

/gpu:0

  • x,x,x,0,0,0,0,0,0
  • x,x,x,x,x,x,x,x,x,x

/gpu:1

  • x,x,0,0,0,0,0,0,0
  • x,x,x,x,0,0,0,0
我的问题是:如何生产这样的批次:

/gpu:0

  • x,x,x,0,0,0,0,0,0
  • x,x,x,x,x,x,x,x,x,x

/gpu:1

  • x,x,0,0,0
  • x,x,x,x,x
接下来,我尝试使用
tf.train.batch(data,batch_size=2,dynamic_pad=True)
创建批,将批放入
tf.PaddingFIFOQueue
,然后在不同的GPU上调用
tf.PaddingFIFOQueue.dequeue()。然而,似乎所有GPU在最新的tensorflow(master)上都获得了相同的数据

以下代码演示了该问题:

import tensorflow as tf

capacity = 10
queue = tf.FIFOQueue(capacity, tf.int64)
enqueue = queue.enqueue_many((list(range(capacity)),))

def clone_fn():
    clone_data = queue.dequeue()
    return clone_data

num_gpus = 2
all_clones_data = []
for gpu_index in range(num_gpus):
    with tf.device('/gpu:{}'.format(gpu_index)):
        all_clones_data.append(clone_fn())

with tf.Session(config=tf.ConfigProto(allow_soft_placement=True)) as sess:
    sess.run(enqueue)
    print(sess.run(all_clones_data))
在最新的tensorflow上,输出为
[0,0]

在旧的tensorflow(0.11)上,输出为
[1,0]
,这就是我想要的

它似乎还使用最新的tensorflow在所有GPU上获取相同的数据

有没有更好的方法在多个GPU之间共享包含可变长度序列的队列?

尝试使用

config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0)))
这有点违反直觉:,归档