understanding recurrent neural network karpathy google for explanation example dummies machine-learning tensorflow nvidia keras

machine-learning - karpathy - recurrent neural network python



¿Por qué mi GPU es más lenta que la CPU cuando entreno modelos LSTM/RNN? (4)

Mi máquina tiene las siguientes especificaciones:

CPU: Xeon E5-1620 v4

GPU: Titan X (Pascal)

Ubuntu 16.04

Driver nvidia 375.26

CUDA tomó 8,0

cuDNN 5.1

He evaluado los siguientes ejemplos de Keras con Tensorflow como reference respaldada:

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

Mi gpu claramente está realizando mi cpu en modelos que no son lstm.

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

Alguien más ha experimentado esto?


Es sólo un consejo.

Usar GPU es poderoso cuando

  1. tu red neuronal es grande

  2. tu Batch_Size es grande

- Es lo que encontré de googlear.


Si usa Keras, use CuDNNLSTM en lugar de LSTM o CuDNNGRU en lugar de GRU . En mi caso (2 Tesla M60), estoy viendo un aumento de rendimiento 10x. Por cierto, estoy usando el tamaño de lote 128 como lo sugiere @Alexey Golyshev.


Tamaño de lote demasiado pequeño. Intenta aumentar.

Resultados para mi 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


Tengo problemas similares aquí:

Prueba 1

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

Ubuntu 14.04

imdb_bidirectional_lstm.py : 155s

Prueba 2

GPU: GTX 860m

Driver Nvidia: 369.30

CUDA Toolkit: v8.0

cuDNN: v6.0

imdb_bidirectional_lstm.py : imdb_bidirectional_lstm.py

Analizar

Cuando observo la curva de carga de la GPU, encontré una cosa interesante:

  • para lstm, la carga de GPU salta rápidamente entre ~ 80% y ~ 10%

Carga de GPU

Esto se debe principalmente a la computación secuencial en la capa LSTM. Recuerde que LSTM requiere una entrada secuencial para calcular los pesos de las capas ocultas de forma iterativa, es decir, debe esperar el estado oculto en el momento t-1 para calcular el estado oculto en el tiempo t .

Esa no es una buena idea para los núcleos de GPU, ya que son muchos núcleos pequeños a los que les gusta hacer cálculos en paralelo, la compuatación secuencial no puede utilizar completamente sus poderes de cómputo. Es por eso que estamos viendo la carga de GPU alrededor del 10% - 20% la mayor parte del tiempo.

Pero en la fase de propagación hacia atrás, la GPU podría ejecutar cálculos derivados en paralelo, por lo que podemos ver un pico de carga de la GPU en torno al 80%.