Consumo de memoria CNN

10

Me gustaría poder estimar si un modelo propuesto es lo suficientemente pequeño como para ser entrenado en una GPU con una cantidad dada de memoria

Si tengo una arquitectura CNN simple como esta:

  • Input: 50x50x3
  • C1: 32 núcleos 3x3, con relleno (supongo que en realidad son 3x3x3 dada la profundidad de entrada)
  • P1: 2x2 con zancada 2
  • C2: 64 núcleos 3x3, con relleno
  • P2: 2x2 con zancada 2
  • FC: 500 neuronas
  • Output: clases de softmax 10
  • Mini lote de 64

Suponiendo valores de coma flotante de 32 bits, ¿cómo calcula el costo de la memoria de cada capa de la red durante el entrenamiento? y luego la memoria total requerida para entrenar a tal modelo?

Simón
fuente

Respuestas:

7

Voy a suponer por C1, C2, etc, que quiere decir capas convolucionales, y por P1, P2ustedes capas medias de fondo común, y FCmedios capas totalmente conectadas.

Podemos calcular la memoria requerida para un pase hacia adelante como este:

Una imagen

Si está trabajando con valores float32, siga el enlace proporcionado anteriormente por @Alexandru Burlacu que tiene:

Input: 50x50x3 = 7,500 = 7.5K

C1: 50x50x32 = 80,000 = 80K

P1: 25x25x32 = 20,000 = 20K

C2: 25x25x64 = 40,000 = 40K

P2: 12x12x64 = 9,216 = 9.2K <- Esto es un problema (y mi aproximación es una suposición muy ondulada aquí). En lugar de trabajar con 50, 25, '12 .5 ', tendría más sentido trabajar con múltiplos de 32. He oído que trabajar con múltiplos de 32 también es más eficiente desde el punto de vista de la memoria. La razón por la que es una mala idea es que la agrupación de 2x2 no divide el espacio correctamente, por lo que puedo decir. Siéntete libre de corregirme si me equivoco.

FC: 1x500 = 500 = 0.5K

Output: 1 x 10 = 10 = 0.01K (casi nada)

Memoria total: 7.5K + 80K + 20K + 40K + 0.5K = 157.2K * 4 bytes = 628.8 KB

Eso es para una imagen.

Minibatch

Si está trabajando con un tamaño de minibatch de 64, está leyendo 64 de estos en la memoria a la vez y realizando todas las operaciones juntas, ampliando todo de esta manera:

Input: 64x50x50x3 = 480,000 = 480K = 0.48M

C1: 64x50x50x32 = 5,120,000 = 5.12M

P1: 64x25x25x32 = 1,280,000 = 1.28M

C2: 64x25x25x64 = 2,560,000 = 2.56M

P2: 64x12x12x64 = 589,824 = 590K = 0.59M

FC: 64x500 = 32,000 = 32K = 0.032M

Output: 1x10x64 = 640 = 0.64K = 0.00064M (no nos importa, esto es pequeño)

Memoria total: 10M x 4 bytes ~ 40MB (digo aproximado porque el sitio web también dice un valor aproximado)

EDITAR: leí mal el sitio web, lo siento.

Según el sitio web, un pase hacia atrás requiere aproximadamente el triple, debido a la necesidad de almacenar:

  • las activaciones y los gradientes asociados para cada neurona: son del mismo tamaño;

  • los gradientes de los pesos (parámetros) que son del mismo tamaño que los parámetros;

  • el valor del impulso, si lo estás usando;

  • algún tipo de memoria miscelánea (no entiendo esta parte)

EstadísticasSorceress
fuente
¿Necesitamos considerar también la memoria requerida para pesos / parámetros? Por ejemplo, para su capa C1superior que tiene, 50x50x32pero esos serían solo los valores para los mapas de activación de capa, ¿qué pasa con los valores aprendidos ( 32x3x3) dentro del núcleo mismo?
Simon
Sí, de acuerdo con cs.stanford.edu/~quocle/tutorial2.pdf . El algoritmo de backprop que utiliza SGD necesita los valores anteriores de los pesos. Pero con la agrupación máxima (¿está haciendo la agrupación máxima?), No necesita hacer un seguimiento del gradiente con respecto a cada conexión. Debe realizar un seguimiento de qué conexión proviene el valor máximo, y solo calcular el gradiente para esa rama.
EstadísticasSorceress
@StatsSorceress, gracias por esta respuesta, pero una pregunta apareció en mi mente, ¿qué sucede si el tamaño de la capa de convolución es 11x11 en lugar de 3x3? ¿Y qué sucede si un ReLU seguido de una capa convolucional?
saeed masoomi
2

Tal vez este enlace le dará una explicación sobre cómo calcular el uso de memoria de una red neuronal arbitraria. A continuación, en el enlace, se explica el uso de memoria del modelo VGGNet. Haga clic aquí y desplácese hacia abajo un poco))

Alexandru Burlacu
fuente
1

Mientras entrena una convNet, la memoria total requerida incluye lo siguiente:

  • Memoria para parámetros
  • Memoria para la salida de capas intermedias.
  • Memoria para el gradiente de cada parámetro.
  • Se necesita memoria adicional si está utilizando un optimizador como Momentum, RMSprop, Adams, etc.
  • Memoria miscelánea para implementación

Una buena aproximación aproximada es el número de parámetros x 3 x 4 (si está utilizando flotante de 32 bits) bytes

Bueno, así es como calculas el número de parámetros:

  • Capa de convección: (ancho del núcleo x altura del núcleo) x número de canales x profundidad + profundidad (agregue profundidad solo si hay sesgo)
  • Capa FC: entumecido de entrada * entumecido de salida + salida (la salida se agrega para incluir el número de sesgo)
  • Capa de grupo máx .: sin parámetro

Ahora solo suma el número de todos los parámetros y usa la fórmula que mencioné.

Vijendra1125
fuente