CUDA OOM - Ale čísla nic neznamenají upp?

0

Otázka

Snažím se trénovat modelu pomocí PyTorch. Když začíná modelu školení se následující chybová zpráva:

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)

Zajímalo by mě, proč k této chybě dochází. Z toho, jak to vidím já, mám 7.79 GiB celkové kapacity. Čísla je uvádí (742 MiB + 5.13 GiB + 792 MiB) nemají přidat až být větší než 7.79 GiB. Když jsem zkontrolovat nvidia-smi Vidím, že tyto procesy běžící

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

Uvědomuji si, že součet všech těchto čísel by mohlo snížit to blízko (168 + 363 + 161 + 742 + 792 + 5130 = 7356 MiB), ale je to stále méně, než je uvedená kapacita mé GPU.

1

Nejlepší odpověď

3

To je spíš komentář, ale stojí za zmínku.

Důvod, proč obecně je opravdu to, co talonmies komentoval, ale ty jsou shrneme-li čísla nesprávně. Pojďme se podívat, co se stane, když tenzory jsou přesunuty do GPU (zkoušel jsem to na mém PC s RTX2060 s 5,8 G použitelné GPU paměť celkem):

Pojďme spusťte následující python příkazy interaktivně:

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

Jsou následující výstupy watch -n.1 nvidia-smi:

Hned po torch import:

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

Hned po vytvoření a:

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

Jak můžete vidět, budete potřebovat 1251MB získat pytorch chcete-li začít používat CUDA, i když budete potřebovat pouze jeden vůz.

Hned po vytvoření b:

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

b potřebuje 500000000*4 bytes = 1907MBje to stejný jako přírůstek v paměti používá python proces.

Hned po vytvoření c:

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

Žádné překvapení zde.

Hned po vytvoření d:

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

Žádné další přidělení paměti a OOM chyba je vyvolána:

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)

Samozřejmě:

  • "Již přidělené" část je zahrnuta v "vyhrazeno celkem PyTorch" část. Nemůžete shrnout, jinak částka vyšší než celková dostupná paměť.
  • Minimální paměť zapotřebí, aby si pytorch běží na GPU (1251M) není zahrnuta do "vyhrazeno celkem" část.

Takže ve vašem případě, součet by se měl skládat z:

  • 792MB (vyhrazeno celkem)
  • 1251MB (minimum získat pytorch běží na GPU, za předpokladu, že je to stejné pro nás pro oba)
  • 5.13 GB (zdarma)
  • 168+363+161=692MB (další procesy)

Součet roven přibližně 7988MB=7.80 GB, což je přesně to jsi celkem GPU paměti.

2021-11-23 06:13:39

V jiných jazycích

Tato stránka je v jiných jazycích

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