2017-01-31 16 views
11

Moja maszyna ma następującą specyfikację:Dlaczego mój procesor graficzny jest wolniejszy od procesora podczas szkolenia modeli LSTM/RNN?

procesora: Xeon E5-1620 v4

GPU: Titan X (Pascal)

Ubuntu 16.04

sterownika Nvidia 375.26

CUDA tookit 8.0

cuDNN 5.1

Mam odwzorować na poniższych przykładach Keras z Tensorflow jak poparte reference:

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 

Moja gpu jest wyraźnie się wykonując mój cpu w modelach bez LSTM.

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

Czy ktoś jeszcze tego doświadczył?

Odpowiedz

8

Zbyt mały rozmiar partii. Spróbuj zwiększyć.

wyników dla moich 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 
+0

Mogłabym zwiększyć wielkość partii zarówno dla mojego procesora GPU, jak i procesora, a oba będą działać podobnie, oczekiwałbym, że procesor gpu będzie działał lepiej. Wydaje się, że zbliżamy się do podobnych czasów, mimo że moja karta graficzna jest znacznie silniejsza niż 1050ti. Mój gpu wyraźnie przewyższa mojego cpu na cnns, ale nie lstm, dlaczego tak jest? – agsolid

+1

@agsolid Twój procesor jest bardzo szybki. Mój Core i3-4330 oblicza imdb_lstm.py (partia = 128) w 110 sekundach na epokę a 25 na GPU. Twój procesor graficzny jest także szybszy niż mój. Różnica dotyczy procentu wykorzystania (twój jest niższy). –

+0

Jak mogę wykorzystać pełną moc GPU? – agsolid

1

Mam podobne problemy tutaj:

testowe 1

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

Ubuntu 14.04

imdb_bidirectional_lstm.py: 155s

testowe 2

GPU: GTX 860m

Nvidia Kierowca: 369,30

CUDA Toolkit: v8.0

cuDNN: v6.0

imdb_bidirectional_lstm.py: 450s

Analizować

Kiedy obserwować krzywą obciążenia GPU, znalazłem jedną ciekawą rzecz:

  • dla LSTM, obciążenie GPU skacze szybko między ~ 80% i ~ 10%

GPU load

Wynika to głównie z obliczeń sekwencyjnych w warstwie LSTM.Pamiętaj, że LSTM wymaga sekwencyjnego wejścia do iteracyjnego obliczania mas ukrytych warstw, innymi słowy, musisz czekać na stan ukryty w czasie t-1, aby obliczyć stan ukryty w czasie t.

To nie jest dobry pomysł na rdzenie GPU, ponieważ są one wieloma małymi rdzeniami, które lubią wykonywać obliczenia równolegle, sekwencyjne kompilacje nie mogą w pełni wykorzystać swoich mocy obliczeniowych. Właśnie dlatego widzimy obciążenie procesora graficznego około 10% - 20% przez większość czasu.

Jednak w fazie wstecznej propagacji GPU może równolegle wykonywać obliczenia pochodne, więc możemy zobaczyć szczyt obciążenia GPU około 80%.

+0

'GTX 860m' jest mobilnym GPU, a więc ma bardzo ograniczoną przepustowość i vram. Zdecydowanie zaleciłbym, aby nie analizować niczego na mobilnym protokole roboczym. –

+0

Testowałem swój własny model c-lstm zeszłej nocy (1 warstwa CNN + warstwa 1 lstm), używając zarówno '' GTX 860m'' i '' GTX 1060''. Okazuje się, że 1060 jest tylko ** 1,28 ** razy szybszy niż 860m. Tak więc chciałbym potwierdzić, że 1060 jest wolniejsze niż CPU dla '' imdb_bidirectional_lstm''. Przetestuję dziś mój pomysł. –

+0

'' GTX 1060'': jedna epoka bierze '' 320s'' –

Powiązane problemy