Почему мой GPU медленнее, чем процессор при обучении моделей LSTM/RNN?

Моя машина имеет следующую спецификацию:

CPU: Xeon E5-1620 v4

GPU: Titan X (Pascal)

Ubuntu 16.04

Драйвер Nvidia 375.26

CUDA takeit 8.0

cuDNN 5.1

Я сравнивал следующие примеры Keras с Tensorflow в качестве поддерживаемой справки:

SCRIPT NAME                  GPU       CPU
stated_lstm.py               5sec      5sec 
babi_rnn.py                  10sec     12sec
imdb_bidirectional_lstm.py   240sec    116sec
imbd_lstm.py                 113sec    106sec

Мой gpu явно не выполняет мой процессор в моделях, отличных от lstm.

SCRIPT NAME                  GPU       CPU
cifar10_cnn.py               12sec     123sec
imdb_cnn.py                  5sec      119sec
mnist_cnn.py                 3sec      47sec 

Кто-нибудь еще испытал это?

Ответ 1

Слишком маленький размер партии. Попытайтесь увеличить.

Результаты для моего GTX1050Ti:

imdb_bidirectional_lstm.py
batch_size      time
32 (default)    252
64              131
96              87
128             66

imdb_lstm.py
batch_size      time
32 (default)    108
64              50
96              34
128             25

Ответ 2

У меня есть похожие проблемы:

Тест 1

CPU: Intel (R) Xeon (R) CPU E5-2697 v3 @2.60 ГГц

Ubuntu 14.04

imdb_bidirectional_lstm.py: 155 с

Тест 2

GPU: GTX 860m

Nvidia Драйвер: 369.30

CUDA Toolkit: v8.0

cuDNN: v6.0

imdb_bidirectional_lstm.py: 450s

Проанализировать

Когда я наблюдаю кривую нагрузки GPU, я нашел одну интересную вещь:

  • для lstm, загрузка графического процессора происходит быстро между ~ 80% и ~ 10%

загрузка графического процессора

В основном это связано с последовательным вычислением в слое LSTM. Помните, что LSTM требует последовательного ввода для вычисления веса скрытого слоя итеративно, другими словами, вы должны подождать скрытое состояние в момент времени t-1 для вычисления скрытого состояния в момент времени t.

Это не очень хорошая идея для ядер GPU, так как у них много небольших ядер, которые любят параллельно выполнять вычисления, последовательное вычисление не может полностью использовать свои вычислительные мощности. Вот почему мы видим, что загрузка GPU составляет от 10% до 20% в большинстве случаев.

Но в фазе backpropagation GPU может запускать производные вычисления параллельно, поэтому мы можем видеть, что максимальная загрузка GPU составляет около 80%.