Predicción de los requisitos de memoria de CPU y GPU del entrenamiento de DNN

9

Digamos que tengo una arquitectura de modelo de aprendizaje profundo, así como un tamaño de mini lote elegido. ¿Cómo obtengo de estos los requisitos de memoria esperados para entrenar ese modelo?

Como ejemplo, considere un modelo (no recurrente) con entrada de dimensión 1000, 4 capas ocultas completamente conectadas de dimensión 100 y una capa de salida adicional de dimensión 10. El tamaño del mini lote es de 256 ejemplos. ¿Cómo se determina la huella aproximada de memoria (RAM) del proceso de entrenamiento en la CPU y en la GPU? Si hace alguna diferencia, supongamos que el modelo está entrenado en una GPU con TensorFlow (usando cuDNN).

Que
fuente

Respuestas:

2

La respuesta de @ik_vision describe cómo estimar el espacio de memoria necesario para almacenar los pesos, pero también necesita almacenar las activaciones intermedias, y especialmente para redes convolucionales que trabajan con datos 3D, esta es la parte principal de la memoria necesaria.

Para analizar tu ejemplo:

  1. La entrada necesita 1000 elementos
  2. Después de las capas 1-4, tienes 100 elementos, 400 en total
    1. Después de la capa final tienes 10 elementos.

En total para 1 muestra, necesita 1410 elementos para el pase hacia adelante. Excepto por la entrada, también necesita una información de gradiente sobre cada uno de ellos para el paso hacia atrás, que es 410 más, con un total de 1820 elementos por muestra . Multiplique por el tamaño del lote para obtener 465 920.

Dije "elementos", porque el tamaño requerido por elemento depende del tipo de datos utilizado. Para una precisión única float32, es 4B y la memoria total necesaria para almacenar los blobs de datos será de alrededor de 1,8 MB.

Jan Kukacka
fuente
1

Veo dos opciones:

  1. La red se carga desde el disco
  2. La red se crea sobre la marcha

En ambos casos, el tamaño de la memoria en la GPU debe multiplicarse por el tamaño del lote, ya que la mayor parte de la red se copia para cada muestra.

Regla general si se carga desde el disco: si el DNN toma X MB en el disco, la red será 2X en la memoria de la GPU para el tamaño de lote 1.

La red se crea sobre la marcha para el tamaño de lote 1: cuente el parámetro y multiplíquelo por 4 bytes (float32 bit): contando el número de parámetro manualmente: fc1: 1000x100 (pesos) + 100 (sesgos) fc2: 100x100 (pesos) + 100 (sesgos) fc3: 100x100 (pesos) + 100 (sesgos) fc4: 100x100 (pesos) + 100 (sesgos) salida: 100x10 (pesos) + 10 (sesgos)

Contando el número de parámetros usando Keras: model.count_params ()

ik_vision
fuente
3
Por lo que puedo decir, esto proporciona los requisitos de memoria para almacenar los pesos en sí , pero ignora cualquier memoria dedicada a almacenar todo lo que se requiere estrictamente para el entrenamiento , como los gradientes. Se requiere almacenar los gradientes, por ejemplo, para implementar el impulso. me estoy perdiendo?
Whaa
1
@Whaa esto es correcto, para el entrenamiento normal necesitas memoria para almacenar los pesos, las activaciones en el pase hacia adelante y los gradientes en el pase de propagación hacia atrás (3 veces la memoria incluso sin impulso).
mjul
@mjul mis experimentos muestran 4.5 veces la estimación de ik_vision. Entiendo la lógica detrás de 3x, pero no estoy seguro de por qué en la práctica está usando 4.5x. Debe haber otros Keras / TF de arriba?
Wes