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
tu red neuronal es grande
tu Batch_Size es grande
- Es lo que encontré de googlear.
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%
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%.