with load_data lecun_uniform descargar bias_initializer performance tensorflow gpu cpu keras

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])