Мне интересно, как использовать функцию 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.

Это очень простой 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
RestInBugs 11 Мар 2018 в 17:50

1 ответ

Лучший ответ

Ваши наблюдения не означают, что parallel_iterations не работают.

Всякий раз, когда у вас есть RNN, у вас есть зависимость данных, поскольку вывод n-го шага подается на (n + 1) -й шаг. В вашем примере с BasicRNNCell каждое вычисление эффективно зависит от предыдущего вычисления. Таким образом, практически нет возможности выполнять несколько шагов параллельно. С более сложными ячейками у вас могут быть некоторые вычисления на каждом шаге, которые не зависят от предыдущих шагов (например, уделяя некоторое внимание постоянной памяти). В таких случаях есть возможность параллельного выполнения разных шагов.

Даже если ваша модель допускает параллельное выполнение, вы не сможете увидеть, как это отражается на использовании памяти. Использование памяти зависит от многих факторов, в том числе от того, когда TF возвращает память графическому процессору; если вы вычисляете градиенты, вам может потребоваться хранить большинство активаций в памяти независимо от того, выполняете ли вы итерации параллельно или нет; итерации, которые выполняются параллельно, могут не давать много тензоров; и т.п.

Точно так же для ЦП, если параллельная работа всегда улучшала производительность, мы запускали бы тысячу потоков в каждом процессе. parallel_iterations - это просто ручка, которую полезно иметь в некоторых случаях.

1
iga 24 Авг 2018 в 04:08