performance - load_data - Keras(backend Tensorflow) más lento en la GPU que en la CPU al entrenar ciertas redes
keras load_data() (1)
En el caso de redes pequeñas, la carga por lotes puede ser el culpable aquí.
Keras está cargando cada minibatch desde la RAM a la GPU al comienzo de cada iteración, creando así un cuello de botella en redes diminutas (donde el cálculo hacia adelante / hacia atrás es muy rápido).
Puede intentar usar model.fit_generator
lugar de simple, de modo que el subproceso de la CPU que carga minibatches funcione en paralelo.
Desafortunadamente, no hay forma de que yo sepa precargar todo el conjunto de datos en la GPU para Keras (ver mi problema )
Si está utilizando el backend de Tensorflow, puede usar la herramienta de creación de perfiles de Google Timeline para ver las causas de la ralentización. Para la referencia, mira este número
Tengo algunas dificultades para entender exactamente por qué las velocidades de GPU y CPU son similares con las redes de pequeño tamaño (la CPU a veces es más rápida) y la GPU es más rápida con las redes de mayor tamaño. El código en la parte inferior de la pregunta se ejecuta en 103.7s en un i7-6700k, pero cuando se usa tensorflow-gpu, el código se ejecuta en 29.5 segundos.
Sin embargo, cuando entreno una red que tiene 100 neuronas ocultas, en lugar de 1000 como en el siguiente ejemplo, obtengo ~ 20 segundos cuando uso la GPU, y ~ 15 segundos cuando uso la CPU.
Leí en otra respuesta de desbordamiento de pila que las transferencias de CPU-> GPU toman mucho tiempo, supongo que esto es en referencia a cargar los ejemplos de datos en la GPU.
¿Puede alguien explicar por qué ocurre esto, y posiblemente hacer referencia a algún cambio en el código que pueda hacer para maximizar la velocidad?
import numpy as np
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.utils import np_utils
from keras.layers.core import Dense, Activation, Flatten, Dropout
from sklearn.preprocessing import normalize
## Importing the MNIST dataset using Keras
from keras.datasets import mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# reshape for vector input
N, x, y = X_train.shape
X_train = normalize(np.reshape(X_train, (N, x * y)))
N, x, y = X_test.shape
X_test = normalize(np.reshape(X_test, (N, x * y)))
# one-hot encoding
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
model = Sequential()
model.add(Dense(output_dim=750, input_dim=784))
model.add(Activation(''relu''))
model.add(Dropout(0.2))
model.add(Dense(150))
model.add(Activation(''relu''))
model.add(Dropout(0.2))
model.add(Dense(50))
model.add(Activation(''relu''))
model.add(Dropout(0.2))
model.add(Dense(50))
model.add(Activation(''relu''))
model.add(Dropout(0.2))
model.add(Dense(10))
model.add(Activation(''softmax''))
model.compile(loss=''categorical_crossentropy'', optimizer=''Nadam'', metrics=[''accuracy''])
fit = model.fit(X_train, y_train, batch_size=128, nb_epoch=10, verbose=0)
## Printing the accuracy of our model, according to the loss function specified in model.compile above
score = model.evaluate(X_test, y_test, verbose=0)
print(''Test score:'', score[0])
print(''Test accuracy:'', score[1])