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 = 1907MB
questo è 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.