Prédiction des besoins en mémoire CPU et GPU de la formation DNN

10

Disons que j'ai une architecture de modèle d'apprentissage en profondeur, ainsi qu'une taille de mini-lot choisie. Comment puis-je dériver de ces exigences de mémoire attendues pour la formation de ce modèle?

Par exemple, considérons un modèle (non récurrent) avec une entrée de dimension 1000, 4 couches cachées entièrement connectées de dimension 100 et une couche de sortie supplémentaire de dimension 10. La taille du mini-lot est de 256 exemples. Comment déterminer l'empreinte mémoire approximative (RAM) du processus de formation sur le processeur et sur le GPU? Si cela fait une différence, supposons que le modèle est formé sur un GPU avec TensorFlow (utilisant donc cuDNN).

Whaa
la source

Réponses:

3

La réponse de @ik_vision décrit comment estimer l'espace mémoire nécessaire pour stocker les poids, mais vous devez également stocker les activations intermédiaires, et en particulier pour les réseaux convolutionnels travaillant avec des données 3D, c'est la partie principale de la mémoire nécessaire.

Pour analyser votre exemple:

  1. L'entrée nécessite 1000 éléments
  2. Après les couches 1-4, vous avez 100 éléments, 400 au total
    1. Après la couche finale, vous avez 10 éléments

Au total, pour 1 échantillon, vous avez besoin de 1410 éléments pour la passe avant. À l'exception de l'entrée, vous avez également besoin d'une information de gradient sur chacun d'eux pour la passe arrière, soit 410 de plus, totalisant 1820 éléments par échantillon . Multipliez par la taille du lot pour obtenir 465 920.

J'ai dit "éléments", car la taille requise par élément dépend du type de données utilisé. Pour une précision simple, float32il est de 4B et la mémoire totale nécessaire pour stocker les blobs de données sera d'environ 1,8 Mo.

Jan Kukacka
la source
1

Je vois deux options:

  1. Le réseau est chargé à partir du disque
  2. Le réseau est créé à la volée

Dans les deux cas, la taille de la mémoire du GPU doit être multipliée par la taille du lot, car la majeure partie du réseau est copiée pour chaque échantillon.

Règle générale si chargé à partir du disque: Si le DNN prend X Mo sur le disque, le réseau sera 2X dans la mémoire GPU pour la taille de lot 1.

Le réseau est créé à la volée pour la taille de lot 1: compter le paramètre et multiplier par 4 octets (float32 bit): compter le nombre de paramètres manuellement: fc1: 1000x100 (poids) + 100 (biais) fc2: 100x100 (poids) + 100 (biais) fc3: 100x100 (poids) + 100 (biais) fc4: 100x100 (poids) + 100 (biais) sortie: 100x10 (poids) + 10 (biais)

Compter le nombre de paramètres à l'aide de Keras: model.count_params ()

ik_vision
la source
3
Pour autant que je sache, cela donne les besoins en mémoire pour stocker les poids eux - mêmes , mais ignore toute mémoire dédiée au stockage de tout ce qui est strictement requis pour la formation , comme les gradients. Le stockage des dégradés est nécessaire, par exemple pour implémenter l'élan. me manque-t-il?
Whaa
1
@Whaa c'est correct, pour un entraînement normal, vous avez besoin de mémoire pour stocker les poids, les activations dans la passe avant et les gradients dans la passe de propagation arrière (3x la mémoire même sans élan).
mjul
@mjul mes expériences montrent une estimation d'ik_vision de 4,5x. Je comprends le raisonnement derrière le 3x mais je ne sais pas pourquoi dans la pratique il utilise le 4.5x. Il doit y avoir d'autres frais généraux Keras / TF ??
Wes