Почему Keras LSTM на процессоре в три раза быстрее, чем на GPU? - PullRequest
0 голосов
/ 24 сентября 2018

Я использую этот ноутбук от Kaggle для запуска нейронной сети LSTM.

Я начал обучение нейронной сети и увидел, что она слишком медленная.Это почти в три раза медленнее, чем тренировка процессора.

  • CPU perfomance: 8 мин за эпоху;
  • GPU perfomance: 26 мин за эпоху.

После этого я решил найти ответ в на этот вопрос по Stackoverflow и применил CuDNNLSTM (который работает только на GPU) вместо LSTM.

Следовательно, производительность GPU стала всего 1 мин за эпоху , а точность модели снизилась на 3%.

Вопросы:

1) Кто-нибудь знает, почему GPU работает медленнее, чем CPU в классическом слое LSTM?Я не понимаю, почему это происходит.

2) Почему, когда я использую CuDNNLSTM вместо LSTM, обучение становится намного быстрее и точность модели снижается?

PS:

My CPU: Процессор Intel Core i7-7700 (кэш-память 8M, до 4,20 ГГц)

My GPU: nVidia GeForce GTX 1050 Ti (4 ГБ)

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

В Keras - быстрая реализация LSTM с CuDNN.

model.add(CuDNNLSTM(units, input_shape=(len(X_train), len(X_train[0])), return_sequences=True))

Его можно запустить только на GPU с бэкэндом TensorFlow.

0 голосов
/ 23 января 2019

У меня была похожая проблема сегодня, и я нашел две вещи, которые могут быть полезны для других (это проблема регрессии для набора данных с ~ 2,1 млн строк, работающего на машине с 4 графическими процессорами P100):

  1. Использование слоя CuDNNLSTM вместо слоя LSTM на компьютере с графическим процессором сократило время подгонки с ~ 13500 секунд до ~ 400 секунд на эпоху.
  2. Уменьшено увеличение размера партии (от 500 до ~ 4700)до ~ 130 секунд за эпоху.

Снижение размера партии приводит к увеличению потерь и потерь в Val, поэтому вам нужно будет принять решение о сделках, которые вы хотите сделать.

0 голосов
/ 24 сентября 2018

Предполагается, что это просто другая, лучшая реализация, и, если реализация отличается, вы не должны ожидать идентичных результатов.

В общем, эффективная реализация алгоритма на GPU - это hard и получение максимальной производительности требует архитектурно-специфических реализаций.Поэтому не удивительно, если бы реализация, характерная для графических процессоров Nvidia, имела более высокую производительность по сравнению с обычной реализацией для графических процессоров.Также не удивительно, что Nvidia потратит значительно больше ресурсов на ускорение кода для своих графических процессоров по сравнению с командой, работающей над общей реализацией CNN.

Другая возможность заключается в том, что тип данных, используемый набэкэнд изменился с поплавка с двойной на одинарную или даже половинную точность.Меньшие типы данных означают, что вы можете обрабатывать больше чисел быстрее за счет точности.Для приложений NN это часто приемлемо, потому что нет нужды в том, чтобы конкретный номер был особенно точным для сети, чтобы получить приемлемые результаты.

...