Параллелизм данных для RNN в тензорном потоке

Недавно я использовал tensorflow для разработки системы NMT. Я попытался обучить эту систему на нескольких видеокартах, используя метод параллелизма данных, чтобы ускорить ее. Я следую стандартному способу параллелизма данных, широко используемому в тензорном потоке. Например, если мы хотим запустить его на компьютере с 8-gpus. Во-первых, мы создаем большой пакет, который содержит в 8 раз больше размера пакета, используемого в одном графическом процессоре. Затем мы делим эту большую партию поровну на 8 мини-партий. Мы отдельно обучаем их на разных gpu. В конце мы собираем градиенты для обновления параметров. Но я обнаружил, что когда я использовал dynamic_rnn, среднее время, затрачиваемое на одну итерацию в 8 GPU, в два раза больше времени, затрачиваемого на одну итерацию, обученную на одном GPU. Я удостоверяюсь, что размер пакета для каждого графического процессора одинаков. У кого есть лучший способ ускорить обучение RNN в тензорном потоке?


person user4193910    schedule 28.11.2017    source источник
comment
Среднее время итерации по своей природе больше, вам нужно отправить данные на все графические процессоры, дождаться их завершения, вычислить обновление и обновить параметры. Разница в том, что теоретически вам потребуется меньше тренировочных шагов, потому что вы тренируетесь на больших партиях, поэтому в целом время обучения должно быть сокращено.   -  person GPhilo    schedule 28.11.2017
comment
Очень интересный вывод заключается в том, что среднее время итерации будет намного меньше, если вы используете tf.static_rnn. Кроме того, если вы не используете RNN и запускаете другие нейронные модели, используя тот же параллелизм данных, вы обнаружите, что коэффициент ускорения является приемлемым. Поэтому я думаю, что тензорный поток плохо поддерживает RNN, особенно для tf.dynamic_rnn.   -  person user4193910    schedule 29.11.2017