Esto es más de un comentario, pero vale la pena señalar.
La razón, en general, es de hecho lo que talonmies comentó, pero se suma los números de forma incorrecta. Vamos a ver qué pasa cuando los tensores, se trasladó a la GPU (lo probé en mi PC con RTX2060 con 5.8 G utilizable memoria de la GPU en total):
Vamos a ejecutar los siguientes comandos de python de forma interactiva:
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()
Los siguientes son los resultados de watch -n.1 nvidia-smi
:
Justo después de torch
importación:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
Inmediatamente después de la creación de a
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 1251MiB |
Como usted puede ver, usted necesita 1251MB
para obtener pytorch para empezar a usar CUDA, incluso si usted sólo necesita una boya.
Inmediatamente después de la creación de b
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 3159MiB |
b
necesidades 500000000*4 bytes = 1907MB
este es el mismo como el incremento de la memoria utilizada por el pitón proceso.
Inmediatamente después de la creación de c
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 5067MiB |
No hay ninguna sorpresa aquí.
Inmediatamente después de la creación de d
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 5067MiB |
No más allá de la asignación de memoria, y el OOM se genera un error:
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)
Obviamente:
- El "ya asignados a" la parte incluida en el "reservado en total por PyTorch" parte. Usted no puede sumarlos, de lo contrario la suma supera el total de memoria disponible.
- La memoria mínima necesaria para obtener pytorch que se ejecutan en la GPU (
1251M
no está incluido en el "reservado" de la parte.
Así que, en su caso, la suma debe constar de:
- 792MB (reservado)
- 1251MB (mínimo para obtener pytorch que se ejecutan en la GPU, asumiendo que este es el mismo para los dos)
- 5.13 GB (gratis)
- 168+363+161=692MB (otros procesos)
Que la suma de hasta aproximadamente 7988MB=7.80 GB, que es exactamente lo que el total de memoria de la GPU.