Tensorflow: Multi-GPU single input queueによれば、複数のGPUで1つのキューを共有する方が良いかもしれません。 そしてリンクは、バッチサイズを増やし、バッチを自分で分割できることを示唆していました。しかし、入力データが可変長シーケンスである場合、バッチサイズを大きくすると、ゼロ埋め込み値が多くなる可能性があります。我々は4-シーケンスバッチを作成し、バッチを分割した場合複数のgpus間で可変長シーケンスのバッチを含むキューを共有するにはどうすればよいですか?
例えば、それは可能性があり
/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.PaddingFIFOQueue
にバッチを入れ、バッチを作成するtf.train.batch(data, batch_size=2, dynamic_pad=True)
を使用してみました、その後、を呼び出します異なるGPUでしかし、すべてのGPUが最新のテンソルフロー(マスタ)で同じデータを取得しているようです。
次のコードは、問題を示しています最新のtensorflowオン
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.11)で [0, 0]
で、出力は何ですか [1, 0]
、ありますが欲しいです。
最新のテンソルフローを使用してすべてのGPUで同じデータが同じように取り出されているようです(slim)。
可変長シーケンスを含むキューを複数のGPUで共有する方法はありますか?