如何在多个 GPU 之间共享包含可变长度序列批次的队列?
How to share a queue containing variable length sequences batches between multiple gpus?
根据 ,多个 GPU 共享一个队列可能会更好。
而link建议我们可以增加batch size然后自己拆分batches。但是,当输入数据是可变长度序列时,增加批量大小可能会导致许多零填充值。
例如,如果我们创建一个 4-sequence batch 并拆分 batch,它可能是
/gpu:0
x, x, x, 0, 0, 0, 0, 0, 0
x, x, x, x, x, x, x, x, x
/gpu:1
x, x, 0, 0, 0, 0, 0, 0, 0
x, 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
/gpu:1
x, x, 0, 0, 0
x, x, x, x, x
在 slim 之后,我尝试使用 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]
,这就是我想要的。
似乎 slim 也使用最新的 tensorflow 在所有 GPU 上获取相同的数据。
有没有更好的方法在多个 GPU 之间共享包含可变长度序列的队列?
尝试运行
config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0)))
这个有点counter-intuitive:,归档7038
根据
例如,如果我们创建一个 4-sequence batch 并拆分 batch,它可能是
/gpu:0
x, x, x, 0, 0, 0, 0, 0, 0
x, x, x, x, x, x, x, x, x
/gpu:1
x, x, 0, 0, 0, 0, 0, 0, 0
x, 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
/gpu:1
x, x, 0, 0, 0
x, x, x, x, x
在 slim 之后,我尝试使用 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]
,这就是我想要的。
似乎 slim 也使用最新的 tensorflow 在所有 GPU 上获取相同的数据。
有没有更好的方法在多个 GPU 之间共享包含可变长度序列的队列?
尝试运行
config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0)))
这个有点counter-intuitive:,归档7038