8

Возможно ли выполнить вывод операции tf.scan и передать ее прямо на другой графический процессор, эффективно выполняя два сложенных RNN на двух графических процессорах параллельно? Что-то вроде этого:Есть ли способ распараллеливать сложенные RNN на несколько графических процессоров в TensorFlow?

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)) 

Будет TensorFlow автоматически позаботится о том, оптимизации, или не будет его блокировать поток графика, пока список ys1 будет завершен.

+0

Я думаю, что параллельный параллелизм будет быстрее, чем распараллеливание модели – titus

+1

, это не отвечает на ваш вопрос, но вот пример того, как делать параллелизм данных, если вы ищете один https://github.com/tensorflow /tensorflow/blob/master/tensorflow/models/image/cifar10/cifar10_multi_gpu_train.py – Julius

+0

Рассмотрите возможность разворачивания RNN с флагом завершения? –

ответ

1

К сожалению, tf.scan имеет «границу» на выходе, и все итерации должны быть выполнены до того, как выходные тензоры могут быть прочитаны следующими операциями. Тем не менее, вы можете запускать разные уровни стека lstm на разных графических процессорах и получать параллелизм кадров в ходе сканирования. Создайте собственную версию MultiRNNCell для использования отдельных устройств для каждого слоя lstm.

Также вы, вероятно, захотите использовать tf.nn.dynamic_rnn вместо сканирования.

Смежные вопросы