8

是否有可能採取tf.scan操作的輸出並將其直接流式傳輸到不同的GPU,從而有效地在兩個GPU上並行運行兩個堆疊的RNN?事情是這樣的:有沒有辦法在TensorFlow中的多個GPU上並行堆疊的RNN?

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在輸出端有一個「邊界」,所有的迭代必須在輸出張量可以被下一個操作讀取之前完成。但是,您可以在不同的GPU上運行不同級別的lstm堆棧,並在掃描中獲得幀並行性。編寫您自己的MultiRNNCell版本,爲每個lstm層使用不同的設備。

此外,你可能想要使用tf.nn.dynamic_rnn而不是掃描。

相關問題