Это скорее комментарий, но на него стоит обратить внимание.
Причина в целом действительно в том, что прокомментировал Тэлонмис, но вы неправильно суммируете цифры. Давайте посмотрим, что происходит, когда тензоры перемещаются на графический процессор (я попробовал это на своем ПК с RTX2060 с общей используемой памятью графического процессора 5,8 Г):
Давайте запустим следующие команды python в интерактивном режиме:
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()
Ниже приведены результаты watch -n.1 nvidia-smi
:
Сразу после torch
импортировать:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
Сразу после создания a
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 1251MiB |
Как видите, вам нужно 1251MB
чтобы заставить pytorch начать использовать CUDA, даже если вам нужен только один поплавок.
Сразу после создания b
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 3159MiB |
b
потребности 500000000*4 bytes = 1907MB
, это то же самое, что и увеличение объема памяти, используемое процессом python.
Сразу после создания c
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 5067MiB |
Здесь нет ничего удивительного.
Сразу после создания d
:
| 0 N/A N/A 1121 G /usr/lib/xorg/Xorg 4MiB |
| 0 N/A N/A 14701 C python 5067MiB |
Дальнейшее выделение памяти не требуется, и возникает ошибка 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)
Очевидно:
- Часть "уже выделено" включена в часть "зарезервировано в общей сложности PyTorch". Вы не можете суммировать их, иначе сумма превысит общую доступную память.
- Минимальная память, необходимая для запуска pytorch на GPU (
1251M
) не входит в раздел "зарезервировано всего".
Таким образом, в вашем случае сумма должна состоять из:
- 792 МБ (всего зарезервировано)
- 1251 МБ (минимум для запуска pytorch на GPU, если предположить, что это одинаково для нас обоих)
- 5.13 ГБ (бесплатно)
- 168+363+161=692 МБ (другие процессы)
Они составляют примерно 7988 МБ=7,80 ГБ, что в точности соответствует общей памяти графического процессора.