8

tf.scan işleminin çıktısını alıp doğrudan iki farklı GPU üzerinde iki istifli RNN'yi etkin bir şekilde çalıştıran farklı bir GPU'ya aktarabilir miyiz? Böyle bir şey:TensorFlow'da çoklu GPU'lar üzerinde yığılmış RNN'leri paralel hale getirmenin bir yolu var mı?

cell1 = tf.nn.rnn_cell.MultiRNNCell(..) 
cell2 = tf.nn.rnn_cell.MultiRNNCell(..) 

with tf.device("/gpu:0"): 
    ys1 = tf.scan(lambda a, x: cell1(x, a[1]), inputs, 
      initializer=(tf.zeros([batch_size, state_size]), init_state)) 

with tf.device("/gpu:1"): 
    ys2 = tf.scan(lambda a, x: cell2(x, a[1]), ys1, 
      initializer=(tf.zeros([batch_size, state_size]), init_state)) 

otomatik TensorFlow o optimizasyon bak yoksa o ys1 kesinleşmiş listede kadar grafik akışını engeller olacaktır.

+0

Bence parti paralelliği, – titus

+1

modeline paralel olarak daha hızlı olacaktır, bu sizin sorunuza cevap vermez, ancak burada bir https://github.com/tensorflow arıyorsanız veri paralelliğini nasıl yapacağınıza dair bir örnek niteliğindedir /tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py – Julius

+0

RNN'yi bir sonlandırma bayrağıyla açmayı düşünün mü? –

cevap

1

Ne yazık ki, tf.scan çıkışında bir "sınır" vardır ve tüm iterasyonlar, çıkış tensörü bir sonraki işlemler tarafından okunabilmeden önce tamamlanmalıdır. Ancak, lstm yığınınızın farklı düzeylerini farklı GPU'larda çalıştırabilir ve bir taramada kare paralelliğini alabilirsiniz. Her lstm katmanı için ayrı aygıtları kullanmak için MultiRNNCell'in kendi sürümünüzü yazın.

Ayrıca, tarama yerine tf.nn.dynamic_rnn'yi de kullanmak isteyebilirsiniz.