it-swarm.com.de

Warum ist meine GPU langsamer als die CPU, wenn Sie LSTM/RNN-Modelle trainieren?

Mein Gerät hat die folgenden Spezifikationen: 

CPU: Xeon E5-1620 v4

GPU: Titan X (Pascal) 

Ubuntu 16.04

Nvidia-Treiber 375.26

CUDA nahm 8.0

cuDNN 5.1

Ich habe die folgenden Keras-Beispiele mit Tensorflow als Backed reference getestet: 

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

Meine GPU führt meine CPU eindeutig in Nicht-LSTM-Modellen aus. 

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

Hat das noch jemand erlebt? 

18
agsolid

Wenn Sie Keras verwenden, verwenden Sie CuDNNLSTM anstelle von LSTM oder CuDNNGRU anstelle von GRU . In meinem Fall (2 Tesla M60) sehe ich eine zehnfache Leistungssteigerung. Übrigens verwende ich die Stapelgröße 128, wie von @Alexey Golyshev vorgeschlagen.

13
neurite

Zu kleine Losgröße. Versuchen Sie zu erhöhen.

Ergebnisse für meinen GTX1050Ti:

 imdb_bidirectional_lstm.py 
 batch_size Zeit 
 32 (Standard) 252 .64 131 
 96 87 
 128 66 

 imdb_lstm.py 
 batch_size Zeit 
32 (Standard) 108 
 64 50 
 96 34 
 128 25 
12
Alexey Golyshev

Ich habe hier ähnliche Probleme:

Test 1

CPU: Intel (R) Xeon (R) CPU E5-2697 v3 bei 2.60 GHz

Ubuntu 14.04

imdb_bidirectional_lstm.py: 155s

Test 2

GPU: GTX 860m

Nvidia-Treiber: 369,30

CUDA Toolkit: v8.0

cuDNN: v6.0

imdb_bidirectional_lstm.py: 450s

Analysieren

Wenn ich die GPU-Lastkurve beobachte, fand ich eine interessante Sache: 

  • für lstm springt die GPU-Last schnell zwischen ~ 80% und ~ 10%

GPU-Last

Dies ist hauptsächlich auf die sequentielle Berechnung in der LSTM-Schicht zurückzuführen. Denken Sie daran, dass LSTM eine sequentielle Eingabe erfordert, um die Gewichtung ausgeblendeter Ebenen iterativ zu berechnen. Mit anderen Worten, Sie müssen zur Zeit t-1 auf den verborgenen Zustand warten, um zur Zeit t den verborgenen Zustand zu berechnen. 

Dies ist keine gute Idee für GPU-Kerne, da es viele kleine Kerne sind, die Berechnungen wie parallele Berechnungen durchführen, da sequentielle Berechnungen ihre Rechenleistung nicht voll ausschöpfen können. Aus diesem Grund sehen wir die GPU-Last meistens zwischen 10% und 20%.

In der Backpropagation-Phase konnte die GPU jedoch die Ableitungsberechnung parallel ausführen, so dass die GPU-Last um 80% liegt.

3
Zekun Zhang

Es ist nur ein Tipp. 

Die Verwendung von GPUs ist leistungsstark, wenn

  1. ihr neuronales Netzwerk ist groß.

  2. ihr Batch_Size ist groß.

- Ich habe es beim Googeln gefunden. 

1
Dane Lee