为什么dynamic_rnn中的parallel_iterations不起作用?

时间:2018-03-11 14:50:27

标签: tensorflow

我想知道如何使用dynamic_rnn函数并使其并行。我设置gpu_options.allow_growth = True并使用tf.nn.dynamic_rnn(rnn_cell, inputs=X, dtype=tf.float32, time_major=False, parallel_iterations=50)来执行此操作。但是当我更改parallel_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))

提前致谢!我很感激任何建议。

1 个答案:

答案 0 :(得分:0)

您的观察结果并不意味着parallel_iterations不起作用。

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

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

对于CPU而言,如果并行运行内容始终有助于提高性能,则我们将在每个进程中运行一千个线程。 parallel_iterations只是一个旋钮,在某些情况下很有用。