CUDA OOM - Но цифры не складываются в upp?

0

Вопрос

Я пытаюсь обучить модель с помощью PyTorch. При начале обучения модели я получаю следующее сообщение об ошибке:

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)

Мне интересно, почему возникает эта ошибка. Судя по тому, как я это вижу, у меня общая емкость 7,79 гигабайта. Цифры, которые он указывает (742 МБ + 5,13 ГБ + 792 МБ), в сумме не превышают 7,79 ГБ. Когда я проверю nvidia-smi Я вижу, как эти процессы выполняются

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

Я понимаю, что суммирование всех этих цифр может привести к закрытию (168 + 363 + 161 + 742 + 792 + 5130 = 7356 MiB), но это все равно меньше заявленной мощности моего графического процессора.

1

Лучший ответ

3

Это скорее комментарий, но на него стоит обратить внимание.

Причина в целом действительно в том, что прокомментировал Тэлонмис, но вы неправильно суммируете цифры. Давайте посмотрим, что происходит, когда тензоры перемещаются на графический процессор (я попробовал это на своем ПК с 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 ГБ, что в точности соответствует общей памяти графического процессора.

2021-11-23 06:13:39

На других языках

Эта страница на других языках

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

Популярное в этой категории

Популярные вопросы в этой категории