2017-01-24 2 views
1

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で共有する方法はありますか?

答えて

1

これはビットカウンタ - 直感的である

config = tf.ConfigProto(graph_options=tf.GraphOptions(optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L0))) 

で実行してみてください:, 7038

を提出
関連する問題