Cómo calcular la huella de memoria de un modelo particular de aprendizaje profundo

El consumo de memoria de una red neuronal depende de muchos factores y variables que son muy difíciles de explicar de una vez. Entonces, si tiene en mente una arquitectura específica y desea estimar la cantidad de memoria de GPU que necesitará antes de ejecutar cualquier cosa, a menos que conozca todas las partes internas (y quiero decir, el backend real de CUDA) del marco que usa, será Se duro.

¿Por qué?

  1. Algunas operaciones están en su lugar, lo que ahorra memoria. Saber cuáles, así como cuáles se pueden hacer en el lugar es muy útil.
  2. Asignar nuevas variables puede ser complicado: si tiene memoria fija para sus lotes, es más fácil, porque el consumo de memoria se vuelve menos volátil.
  3. La topología de la red es lo que te volverá loco. Si tiene una red FC secuencial, está bien, pero ¿qué pasa si tiene un montón de conexiones residuales concatenadas con salidas de ramas paralelas? Un algoritmo para calcular gradientes puede o no elegir la forma más práctica en cuanto a memoria.

A todos los efectos prácticos, ni siquiera me molesto. Acabo de ejecutar el código y miro lo que nvidia-smi me dice:

batch_size == 1

batch_size == 2

batch_size == 4

batch_size == 8

Estoy bastante seguro de que el usuario de Quora me regañaría por tal descuido, pero esta estimación es suficiente si no trabajas específicamente en la optimización de la memoria.

La generalización a través de los modelos por la gran cantidad de parámetros no tiene sentido, solo observe BPTT: consume mucha memoria, aunque la mayoría de los pesos en la red son compartidos.

FC : cantidad moderada de parámetros, topología simple, gradientes muy pequeños

CNN ; pocos parámetros, topología compleja, el tamaño de los gradientes puede variar

RNN : pocos parámetros, topología relativamente simple, gradientes ENORMES

También depende en gran medida de su método de optimización. Calcular el impulso de segundo orden no es lo mismo que el SGD de vainilla, por lo que para la misma arquitectura puede terminar con una imagen diferente.

Después de todo, cuando está diseñando el experimento, el 99.99% de las veces, la única pregunta relacionada con la memoria que tiene es “¿encajará en una GPU de 6/8/12/16 GB?”

Desafortunadamente, no hay una respuesta fácil, ya que todos los marcos de aprendizaje profundo en el nivel más bajo están utilizando optimizaciones complejas, que a veces son difíciles de predecir. Por ejemplo, las convoluciones se pueden implementar usando la Transformada rápida de Fourier, el algoritmo de Winograd, como convolución directa, y muchas más. La implementación real depende del rendimiento medido de cada candidato.

Cada uno tiene diferentes requisitos de memoria, por ejemplo. para el algoritmo de Winograd, las entradas y filtros de convolución se transforman en un espacio de Winograd, y esta representación tiene un tamaño diferente que el formato de datos ingenuo.

La mejor respuesta es realizar una búsqueda binaria sobre el posible tamaño de lote para encontrar el que cabe en la memoria en una GPU en particular.