CUDA OOM - Dar numerele nu se adaugă upp?

0

Problema

Am încercat să tren un model folosind PyTorch. Atunci când începe model de formare primesc următorul mesaj de eroare:

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)

Mă întrebam de ce această eroare se produce. La cum văd eu lucrurile, am 7.79 GiB capacitatea totală. Numerele se ateste (742 MiB + 5.13 GiB + 792 MiB) nu adăuga până să fie mai mare decât 7.79 GiB. Când m-am verifica nvidia-smi Am vedea aceste procese care rulează

|    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 |

Mi-am dat seama că însumarea tuturor acestor numere s-ar putea tăia aproape (168 + 363 + 161 + 742 + 792 + 5130 = 7356 MiB), dar acest lucru este încă mai mică decât capacitatea declarată a mea GPU.

1

Cel mai bun răspuns

3

Acest lucru este mai mult de un comentariu, dar merită subliniat.

Motivul, în general, este într-adevăr ceea ce talonmies comentat, dar sunt însumarea numere incorect. Să vedem ce se întâmplă atunci când tensorii sunt mutate de la GPU (am incercat acest lucru pe PC-ul meu cu RTX2060 cu 5.8 G utilizabil memorie GPU în total):

Hai să executați următoarele comenzi python în mod interactiv:

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()

Următoarele sunt ieșiri de watch -n.1 nvidia-smi:

Imediat după torch import:

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

Imediat după crearea a:

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

După cum puteți vedea, aveți nevoie de 1251MB pentru a obține pytorch pentru a începe folosind CUDA, chiar dacă aveți nevoie doar de un singur flotor.

Imediat după crearea b:

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

b are nevoie de 500000000*4 bytes = 1907MB, aceasta este la fel ca la creștere în memoria utilizată de python proces.

Imediat după crearea c:

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

Nici o surpriza aici.

Imediat după crearea d:

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

Nu mai departe de alocare de memorie, și OOM eroare este aruncat:

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)

Evident:

  • "Deja alocate" parte este inclusă în "rezervate în total de PyTorch" parte. Nu te poti rezuma-le, în caz contrar suma depășește total memorie disponibilă.
  • Minimul de memorie necesar pentru a obține pytorch rulează pe GPU (1251M) nu este inclus în "rezervate în total" parte.

Deci, în cazul dumneavoastră, suma ar trebui să constea din:

  • 792MB (rezervate în total)
  • 1251MB (minim pentru a obține pytorch rulează pe GPU, presupunând că acest lucru este același pentru amândoi)
  • 5.13 GB (gratuit)
  • 168+363+161=692MB (alte procese)

Acestea se ridică la suma de aproximativ 7988MB=7.80 GB, care este exact totală GPU-ului de memorie.

2021-11-23 06:13:39

În alte limbi

Această pagină este în alte limbi

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