¿Por qué el entrenamiento tarda tanto en mi GPU?

10

Detalles:

GPU : GTX 1080

Entrenamiento : ~ 1.1 millones de imágenes pertenecientes a 10 clases

Validación : ~ 150 mil imágenes pertenecientes a 10 clases

Tiempo por época : ~ 10 horas

He configurado CUDA, cuDNN y Tensorflow (GPU Tensorflow también).

No creo que mi modelo sea tan complicado que lleva 10 horas por época. Incluso verifiqué si mi GPU era el problema, pero no fue así.

¿El tiempo de entrenamiento se debe a las capas totalmente conectadas?

Mi modelo:

model = Sequential()
model.add()
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding="same", strides=2))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(3, 3), strides=2))
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu'))
model.add(Dense(4096))
model.add(Activation('relu'))
model.add(Dense(10))
model.add(Activation('softmax'))

model.summary()

opt = keras.optimizers.rmsprop(lr=0.0001, decay=1e-6)

model.compile(loss='categorical_crossentropy',
          optimizer=opt,
          metrics=['accuracy']
          )

Debido a que hay muchos datos, utilicé ImageDataGenerator.

gen = ImageDataGenerator(
 horizontal_flip=True
)

train_gen = gen.flow_from_directory(
        'train/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)

valid_gen = gen.flow_from_directory(
        'validation/',
        target_size=(512, 512),
        batch_size=5,
        class_mode="categorical"
)
Pradyumna Rahul
fuente
2
Voté para mover esto al desbordamiento de pila, pero realmente pertenece al intercambio de pila de ciencia de datos, IMO
generic_user
genérico_usuario: "ciencia de datos" puede usar "aprendizaje automático", pero no todo "aprendizaje automático" es para "ciencia de datos". (ML es solo otra herramienta, tensorflow es solo otra biblioteca; ML podría usarse pronto (si no lo está ya) incluso para las tareas mundanas, como la gestión de archivos de propiedades de preferencias del usuario.)
michael
ver también relacionado (tl; dr: verificar que realmente se ejecuta en gpu, ver las estadísticas de gpu que tf puede proporcionar) stackoverflow.com/questions/42527492/… stackoverflow.com/questions/38559755/…
michael
He intentado ese enfoque y dice que se está utilizando mi GPU actual. Para confirmar, también utilicé nvidia-smi para verificar la utilización de la GPU y fluctúa entre 85% y 99%.
Pradyumna Rahul

Respuestas:

7

Eso es lo esperado. Si divide el número de segundos entre el número de imágenes que procesó, obtendrá 33 milisegundos por imagen, lo que parece ser adecuado para una red tan pequeña. Las redes más grandes usualmente toman el estadio de 50 a 200 milisegundos por imagen.

Sí, es probable que una gran capa densa perjudique su rendimiento, ya que es una matriz enorme (256 por 4096) y una gran matriz de multiplicación para acompañarla cada vez que ejecuta la red.

shimao
fuente
¿Qué sugeriría para mejorar el rendimiento?
44
1: aumente el tamaño del lote a 32 o 64. 2: reduzca el tamaño de la capa FC a quizás 1024 o 2048 unidades y vea si ayuda. 3: parada temprana. Es posible que su red haya convergido o comience a sobreajustar antes de que termine su primera época, en cuyo caso debe entrenar menos.
¿Debo reducir los pasos por época?
Pradyumna Rahul
@shimao, ¿qué quisiste decir con "entrenar menos"? ¿Quieres decir usar menos datos?
EstadísticasSorceress
3

Como dijo shimao, eso es lo que esperarías. A pesar de no tener muchas capas, un tamaño de entrada de 512x512 es una imagen grande sobre la que se puede involucrar. El gran tiempo de cálculo probablemente se deba más a la convolución de 64 filtros sobre la imagen grande, en lugar de las capas completamente conectadas.

Sin embargo, la red que ha creado tiene un cuello de botella de información divertido. Comienza con 64 filtros en la imagen de tamaño original, que solo disminuye a medida que se reduce el tamaño de la imagen. A medida que la imagen pasa a través de su red, las características que está aprendiendo se vuelven cada vez más abstractas y complejas. Su capa Conv2D (32, (3, 3)) esencialmente limita la red a aprender un mapa de 128x128 de 32 características.

La mayoría de las arquitecturas de red duplican el número de características cada vez que se agrupan, y las arquitecturas de redes de imagen más recientes abandonan las capas completamente conectadas a favor de un grupo promedio sobre el mapa de características final, y básicamente realizan una regresión logística en la salida de ese grupo.

Intente comenzar con menos filtros, digamos 16 en su primera capa de convolución, duplicando cada vez que camina o agrupa. Haga esto unas pocas veces más de lo que es, para aumentar el campo receptivo y disminuir el tamaño del mapa de características. Haga esto a 64x64 o 32x32, que serían 128 o 256 filtros. También puede usar la agrupación Global Avg o Max de Keras para eliminar capas completamente conectadas. Eso debería duplicar la velocidad de la red, y esperaría un aumento en la precisión al mismo tiempo.

mpotma
fuente
Bueno, la arquitectura de red se basa en un trabajo de investigación que intentaba reproducir. lirmm.fr/%7Echaumont/publications/…
Pradyumna Rahul