CUDA OOM - Mais les chiffres n'ont pas d'ajouter upp?

0

La question

Je suis en train de former un modèle à l'aide de PyTorch. Au début de l'apprentissage du modèle je reçois le message d'erreur suivant:

RuntimeError: CUDA out of memory. Tried to allocate 5.37 GiB (GPU 0; 7.79 GiB total capacity; 742.54 MiB already allocated; 5.13 GiB free; 792.00 MiB reserved in total by PyTorch)

Je me demande pourquoi cette erreur se produit. De la façon dont je le vois, j'ai 7.79 GiB capacité totale. Les chiffres, il est indiquant (742 MiB + 5.13 GiB + 792 MiB) ne pas ajouter jusqu'à plus de 7.79 GiB. Quand je vérifie nvidia-smi Je vois ces processus en cours d'exécution

|    0   N/A  N/A      1047      G   /usr/lib/xorg/Xorg                168MiB |
|    0   N/A  N/A      5521      G   /usr/lib/xorg/Xorg                363MiB |
|    0   N/A  N/A      5637      G   /usr/bin/gnome-shell              161MiB |

Je me rends compte qu'en additionnant tous ces chiffres peuvent couper à proximité (168 + 363 + 161 + 742 + 792 + 5130 = 7356 MiB), mais c'est encore moins que la capacité indiquée de mon GPU.

1

La meilleure réponse

3

C'est plus un commentaire, mais mérite d'être souligné.

La raison en général est en effet ce que talonmies commenté, mais vous êtes en additionnant les nombres de manière incorrecte. Nous allons voir ce qui se passe lorsque les tenseurs sont déplacés vers le GPU (j'ai essayé sur mon PC avec RTX2060 avec 5,8 G utilisable mémoire GPU au total):

Passons à l'exécution de la suite de commandes python de manière interactive:

Python 3.8.10 (default, Sep 28 2021, 16:10:42) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> a = torch.zeros(1).cuda()
>>> b = torch.zeros(500000000).cuda()
>>> c = torch.zeros(500000000).cuda()
>>> d = torch.zeros(500000000).cuda()

Voici les sorties de watch -n.1 nvidia-smi:

Juste après torch d'importation:

|    0   N/A  N/A      1121      G   /usr/lib/xorg/Xorg                  4MiB |

Juste après la création de a:

|    0   N/A  N/A      1121      G   /usr/lib/xorg/Xorg                  4MiB |
|    0   N/A  N/A     14701      C   python                           1251MiB |

Comme vous pouvez le voir, vous avez besoin 1251MB pour obtenir pytorch pour commencer à utiliser CUDA, même si vous avez seulement besoin d'un seul flotteur.

Juste après la création de b:

|    0   N/A  N/A      1121      G   /usr/lib/xorg/Xorg                  4MiB |
|    0   N/A  N/A     14701      C   python                           3159MiB |

b besoins 500000000*4 bytes = 1907MB, c'est le même que l'augmentation de la mémoire utilisée par le python processus.

Juste après la création de c:

|    0   N/A  N/A      1121      G   /usr/lib/xorg/Xorg                  4MiB |
|    0   N/A  N/A     14701      C   python                           5067MiB |

Pas de surprise ici.

Juste après la création de d:

|    0   N/A  N/A      1121      G   /usr/lib/xorg/Xorg                  4MiB |
|    0   N/A  N/A     14701      C   python                           5067MiB |

Aucune autre allocation de mémoire, et le OOM erreur est levée:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
RuntimeError: CUDA out of memory. Tried to allocate 1.86 GiB (GPU 0; 5.80 GiB total capacity; 3.73 GiB already allocated; 858.81 MiB free; 3.73 GiB reserved in total by PyTorch)

Évidemment:

  • Le "déjà alloué" la partie est incluse dans le "réservés au total par PyTorch" partie. Vous ne pouvez pas résumer, sinon la somme dépasse le total de la mémoire disponible.
  • La mémoire minimale requise pour obtenir pytorch en cours d'exécution sur GPU (1251Mn'est pas incluse dans le "réservés au total de la partie".

Donc dans votre cas, la somme doit être constitué de:

  • 792MB (réservé au total)
  • 1251MB (minimum pour obtenir pytorch en cours d'exécution sur GPU, en supposant que c'est le même pour nous deux)
  • 5.13 GO (gratuit)
  • 168+363+161=692MB (autres processus)

Ils résument à environ 7988MB=7.80 GO, ce qui est exactement vous faites le total de la mémoire graphique.

2021-11-23 06:13:39

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................