1

Je suis en train d'obtenir une poignée rugueuse sur l'empreinte mémoire GPU de mes tensorflow modèles d'apprentissage en profondeur, et je suis compter sur a heuristic I've found avec suggère:Comment estimer l'empreinte GPU de mon modèle TensorFlow?

Le plus grand goulot d'étranglement pour être au courant lors de la construction des architectures ConvNet est le goulot d'étranglement de la mémoire. Beaucoup de GPU modernes ont une limite de 3/4/6 Go de mémoire, avec les meilleurs GPU ayant environ 12 Go de mémoire. Il existe trois principales sources de mémoire pour garder une trace de:

  • De la taille des volumes intermédiaires: Ce sont le nombre brut de activations à toutes les couches de la ConvNet, ainsi que leurs gradients (de taille égale). Habituellement, la plupart des activations sont sur les couches antérieures d'un réseau ConvNet (c'est-à-dire les premières couches de Conv). Ceux-ci sont conservés autour de parce qu'ils sont nécessaires pour la rétropropagation, mais une mise en œuvre intelligente qui exécute un ConvNet seulement au moment du test pourrait en réduire considérablement le nombre, en ne stockant que les activations actuelles à n'importe quel calque et en rejetant les précédentes activations sur couches ci-dessous.

  • De la taille des paramètres: Ce sont les chiffres qui tiennent les paramètres réseau, leurs gradients pendant rétropropagation, et souvent aussi un cache étape si l'optimisation utilise la dynamique, Adagrad ou RMSProp. Par conséquent, la mémoire pour stocker le paramètre vecteur seul doit habituellement être multipliée par un facteur d'au moins 3 ou ainsi.

  • Chaque mise en œuvre ConvNet doit maintenir la mémoire divers, tels que les lots de données d'image, peut-être leurs versions augmentée, etc.

Une fois que vous avez une estimation approximative du nombre total de valeurs (pour activations, dégradés et divers), le nombre doit être converti en taille en GB. Prenez le nombre de valeurs, il faut multiplier par 4 pour obtenir la première nombre d'octets (puisque chaque virgule flottante est de 4 octets, ou peut-être de 8 pour double précision), puis diviser par 1024 plusieurs fois pour obtenir la quantité de mémoire en Ko, Mo, et enfin GB. Si votre réseau ne correspond pas, une heuristique commune à « l'adapter » est de diminuer la taille du lot , puisque la plupart de la mémoire est généralement consommée par les activations.

Mais je ne suis pas sûr de quelques choses:

  1. Quel est le rôle de la taille des lots dans ce calcul? Il semble que cela n'affecte que les activations (c'est-à-dire que je devrais multiplier les activations par taille de lot). Est-ce exact?
  2. Comment puis-je savoir que ces choses se repose sur mon GPU (avec 12GiB) et qui sur ma RAM CPU (en tensorflow)? En général à peu près tous ceux-ci résident sur le GPU?
  3. Où dois-je chercher « divers »? Est-ce que les données d'entrée sont la source principale de ceci? Et si oui, est-ce que je compte un seul lot de telles données ou tout?

Répondre

0
  1. Vous avez un modèle unique qui est formé à l'aide des lots d'échantillons. Un seul lot est composé de plusieurs entrées. Ces entrées sont traitées en parallèle à l'aide du modèle. Ainsi, si votre lot contient un certain nombre d'éléments, chaque élément est transféré de la CPU (où se trouvent les files d'attente d'entrée) au GPU. Le GPU, par conséquent, calcule en utilisant le modèle à l'état t (pensez à ce modèle en tant que modèle avec ses paramètres gelés à l'étape de temps t) le passage avant pour chaque élément du lot d'entrée. Ensuite, les résultats du réseau sont accumulés dans un vecteur et maintenant l'étape de rétropropagation est calculée. Les gradients sont ainsi calculés (passage vers l'arrière) pour chaque élément du lot en utilisant le modèle au moment t (à nouveau), accumulés dans un vecteur et moyennés. En utilisant cette moyenne, les paramètres du modèle sont mis à jour et le modèle entre dans l'état t+1.

  2. En règle générale, tout ce qui est séquentiel par nature est sur le processeur (pensez aux entrées, à la file d'attente, au traitement des valeurs d'entrée uniques, ...). Cependant, tout ce que le réseau doit traiter est ensuite transféré de la CPU vers le GPU.

  3. La partie diverse est un peu déroutante. Je suppose que l'auteur parle de l'augmentation des données et du fait qu'une seule entrée peut être augmentée de façon infinie. Vous devez donc tenir compte du fait que si vous appliquez des transformations à un lot d'entrée (par exemple, une luminosité aléatoire à un lot entier d'images), ces transformations à calculer doivent être transférées de la CPU vers le GPU et les versions augmentées devrait être stocké dans la mémoire GPU avant le traitement. Cependant, l'opération de transfert, il serait fait la même chose, vous perdez un peu de temps de calcul (pour le preprocesing bien sûr), la mémoire allouée sera le même

+0

Pouvez-vous traduire cela en questions 1-3 comme ils se rapportent à l'interprétation du texte original? – orome

+0

Il y a 3 paragraphes différents, un par point. Cependant je vais éditer – nessuno