Tensorflow 为什么动态rnn中的并行迭代不';不行?

Tensorflow 为什么动态rnn中的并行迭代不';不行?,tensorflow,Tensorflow,我想知道如何使用动态函数并使其并行。我设置了gpu\u选项。允许\u growth=True并使用tf.nn.dynamic\u rnn(rnn\u单元格,输入=X,dtype=tf.float32,时间\u major=False,并行\u迭代=50)执行此操作。但是当我更改parallel\u iterations的值时,GPU内存消耗和运行时间都没有改变 这是一个非常简单的rnn,因此我认为可能不存在数据依赖性 basic_cell = BasicRNNCell(num_units=n_n

我想知道如何使用动态函数并使其并行。我设置了
gpu\u选项。允许\u growth=True
并使用
tf.nn.dynamic\u rnn(rnn\u单元格,输入=X,dtype=tf.float32,时间\u major=False,并行\u迭代=50)
执行此操作。但是当我更改
parallel\u iterations
的值时,GPU内存消耗和运行时间都没有改变

这是一个非常简单的rnn,因此我认为可能不存在数据依赖性

basic_cell = BasicRNNCell(num_units=n_neurons)
outputs, states = tf.nn.dynamic_rnn(basic_cell, X, dtype=tf.float32, parallel_iterations=50)
logits = fully_connected(states, n_outputs, activation_fn=None)
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y, logits=logits)
loss = tf.reduce_mean(cross_entropy)
optimizer = tf.train.AdamOptimizer(learning_rate)
train_op = optimizer.minimize(loss)
correct = tf.nn.in_top_k(logits, y, 1)
accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))

提前谢谢!我很感激你的建议。

你的观察并不意味着并行迭代不起作用

每当您有一个RNN时,您就有一个数据依赖关系,因为第n步的输出被馈送到(n+1)的第n步。在使用
basicrncell
的示例中,每次计算都有效地依赖于以前的计算。因此,基本上没有机会并行运行多个步骤。对于更复杂的单元,您可能会在每个步骤中进行一些独立于前面步骤的计算(例如,对恒定内存进行一些关注)。在这种情况下,存在并行执行不同步骤的机会

即使您的模型允许并行执行,您也可能无法看到它反映在内存使用中。内存使用取决于许多因素,包括TF何时将内存返回GPU;如果您正在计算梯度,那么无论是否并行运行迭代,您可能都需要在内存中保留大多数激活;并行运行的迭代可能不会产生很多张量;等等

同样对于CPU,如果并行运行总是有助于提高性能,那么我们将在每个进程中运行1000个线程<代码>并行迭代只是一个旋钮,在某些情况下很有用