CUDA OOM - Ma i numeri non aggiungere upp?

0

Domanda

Sto cercando di formare un modello utilizzando PyTorch. Quando inizio un modello di formazione ottengo il seguente messaggio di errore:

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)

Mi chiedo perché questo errore si verifica. Da come la vedo io, ho 7.79 Gb di capacità totale. I numeri si indica con (742 MiB + 5.13 Mib + 792 MiB) non aggiungere fino a essere maggiore di 7.79 GiB. Quando posso controllare nvidia-smi Vedo questi processi in esecuzione

|    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 rendo conto che la somma di tutti questi numeri potrebbero tagliare vicino (168 + 363 + 161 + 742 + 792 + 5130 = 7356 MiB), ma questo è ancora inferiore a quanto dichiarato della mia GPU.

1

Migliore risposta

3

Questo è più di un commento, ma vale la pena sottolineare.

Il motivo, in generale, è davvero ciò che talonmies commentato, ma si sta sommando i numeri in modo non corretto. Vediamo cosa succede quando tensori sono spostati GPU (ho provato sul mio PC con RTX2060 con 5.8 G utilizzabile memoria della GPU in totale):

Eseguire i seguenti comandi python in modo interattivo:

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

Le seguenti sono le uscite di watch -n.1 nvidia-smi:

Subito dopo torch importazione:

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

Subito dopo la creazione di a:

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

Come si può vedere, è necessario 1251MB per ottenere pytorch per iniziare a utilizzare CUDA, anche se hai solo bisogno di un galleggiante singolo.

Subito dopo la creazione di b:

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

b esigenze 500000000*4 bytes = 1907MBquesto è lo stesso come l'incremento di memoria utilizzata dal python processo.

Subito dopo la creazione di c:

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

Nessuna sorpresa qui.

Subito dopo la creazione di d:

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

Nessun ulteriore allocazione di memoria, e la OOM errore:

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)

Ovviamente:

  • "Già assegnati" parte è riservata in totale da PyTorch" parte. Non è possibile riassumere, in caso contrario la somma supera il totale di memoria disponibile.
  • La memoria minima necessaria per ottenere pytorch in esecuzione su GPU (1251M) non è incluso nel "riservato in totale" parte.

Quindi nel tuo caso, la somma dovrebbe essere costituito da:

  • 792MB (riservato in totale)
  • 1251MB (minimo per ottenere pytorch in esecuzione su GPU, supponendo che questo è lo stesso per entrambi)
  • 5.13 GB (gratuito)
  • 168+363+161=692MB (altri processi)

Si somma fino a circa 7988MB=7.80 GB, che è esattamente il totale di memoria della GPU.

2021-11-23 06:13:39

In altre lingue

Questa pagina è in altre lingue

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