CUDA OOM - Ale liczby nie sumują się do upp?

0

Pytanie

Staram się trenować model z pomocą PyTorch. Na początku uczenia modelu otrzymuję następujący komunikat o błędzie:

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)

Zastanawiam się, dlaczego występuje ten błąd. Sądząc po tym, jak ja to widzę, mam łączna pojemność 7,79 gb. Liczby, które wskazuje (742 MB + 5,13 GB + 792 MB), w sumie nie przekraczają 7,79 GB. Gdy sprawdzę nvidia-smi Widzę, jak te procesy są wykonywane

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

Rozumiem, że sumowanie tych wszystkich cyfr może doprowadzić do zamknięcia (168 + 363 + 161 + 742 + 792 + 5130 = 7356 MiB), ale to i tak mniej deklarowanej mocy mojego procesora graficznego.

1

Najlepsza odpowiedź

3

To raczej komentarz, ale na niego warto zwrócić uwagę.

Powód w całości naprawdę w tym, że wypowiadał się Тэлонмис, ale źle zsumujesz cyfry. Zobaczmy, co się dzieje, gdy тензоры są przenoszone na procesor graficzny (próbowałem to na KOMPUTERZE z RTX2060 głównych używanej pamięci karty graficznej 5,8 G):

Przyjrzyjmy się następujące polecenia pythona w trybie interaktywnym:

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

Poniżej znajdują się wyniki watch -n.1 nvidia-smi:

Raz po torch import:

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

Natychmiast po utworzeniu a:

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

Jak widać, trzeba 1251MB aby pytorch zacząć korzystać z CUDA, nawet jeśli potrzebny jest tylko jeden pływak.

Natychmiast po utworzeniu b:

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

b potrzeby 500000000*4 bytes = 1907MBto to samo, co i zwiększenie ilości pamięci używanej przez proces python.

Natychmiast po utworzeniu c:

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

Tu nie ma nic dziwnego.

Natychmiast po utworzeniu d:

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

Dalsza alokacja pamięci nie jest wymagane, i występuje błąd OOM:

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)

Oczywiście:

  • Część "już przydzielone" jest włączona w część "zarezerwowane w sumie PyTorch". Nie można podsumować je, w przeciwnym razie kwota przekroczy całkowitą dostępną pamięć.
  • Minimalna pamięć, niezbędne do uruchomienia pytorch na GPU (1251M) nie wchodzi w sekcji "zarezerwowane tylko".

Tak więc w twoim przypadku kwota powinna składać się z:

  • 792 MB (jest zarezerwowane)
  • 1251 MB (minimum do uruchomienia pytorch na GPU, jeśli założyć, że jest to tak samo dla nas obu)
  • 5.13 GB (za darmo)
  • 168+363+161=692 MB (inne procesy)

Stanowią one około 7988 MB=7,80 GB, co dokładnie odpowiada całkowitej pamięci procesora graficznego.

2021-11-23 06:13:39

W innych językach

Ta strona jest w innych językach

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