CUDA_ERROR_OUT_OF_MEMORY в тензорном потоке

Когда я начал тренировать некоторую нейронную сеть, он встретил CUDA_ERROR_OUT_OF_MEMORY, но обучение могло продолжаться без ошибок. Поскольку я хотел использовать память gpu, как это действительно нужно, поэтому я устанавливаю gpu_options.allow_growth = True. Журналы выглядят следующим образом:

I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcudnn.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties:
name: GeForce GTX 1080
major: 6 minor: 1 memoryClockRate (GHz) 1.7335
pciBusID 0000:01:00.0
Total memory: 7.92GiB
Free memory: 7.81GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0:   Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device:0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0)
E tensorflow/stream_executor/cuda/cuda_driver.cc:965] failed to allocate 4.00G (4294967296 bytes) from device: CUDA_ERROR_OUT_OF_MEMORY
Iter 20, Minibatch Loss= 40491.636719
...

И после использования команды nvidia-smi она получает:

+-----------------------------------------------------------------------------+   
| NVIDIA-SMI 367.27                 Driver Version: 367.27                            
|-------------------------------+----------------------+----------------------+   
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |  
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M.
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 0000:01:00.0     Off |                  N/A |   
| 40%   61C    P2    46W / 180W |   8107MiB /  8111MiB |     96%      Default |   
+-------------------------------+----------------------+----------------------+   
|   1  GeForce GTX 1080    Off  | 0000:02:00.0     Off |                  N/A |   
|  0%   40C    P0    40W / 180W |      0MiB /  8113MiB |      0%      Default |   
+-------------------------------+----------------------+----------------------+   
                                                                              │
+-----------------------------------------------------------------------------+   
| Processes:                                                       GPU Memory |   
|  GPU       PID  Type  Process name                               Usage      |   
|=============================================================================|   
|    0     22932    C   python                                        8105MiB |
+-----------------------------------------------------------------------------+ 

После того как я прокомментировал gpu_options.allow_growth = True, я снова тренировал сеть, и все было нормально. Не было проблемы с CUDA_ERROR_OUT_OF_MEMORY. Наконец, запустив команду nvidia-smi, она получает:

+-----------------------------------------------------------------------------+   
| NVIDIA-SMI 367.27                 Driver Version: 367.27                            
|-------------------------------+----------------------+----------------------+   
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |  
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M.
|===============================+======================+======================|
|   0  GeForce GTX 1080    Off  | 0000:01:00.0     Off |                  N/A |   
| 40%   61C    P2    46W / 180W |   7793MiB /  8111MiB |     99%      Default |   
+-------------------------------+----------------------+----------------------+   
|   1  GeForce GTX 1080    Off  | 0000:02:00.0     Off |                  N/A |   
|  0%   40C    P0    40W / 180W |      0MiB /  8113MiB |      0%      Default |   
+-------------------------------+----------------------+----------------------+   
                                                                              │
+-----------------------------------------------------------------------------+   
| Processes:                                                       GPU Memory |   
|  GPU       PID  Type  Process name                               Usage      |   
|=============================================================================|   
|    0     22932    C   python                                        7791MiB |
+-----------------------------------------------------------------------------+ 

У меня есть два вопроса. Почему вышел CUDA_OUT_OF_MEMORY, и процедура продолжалась нормально? почему использование комментариев стало меньше после комментирования allow_growth = True.

Ответ 1

В случае, если это все еще актуально для кого-то, я столкнулся с этой проблемой при попытке запустить Keras/Tensorflow во второй раз после того, как первый запуск был прерван. Кажется, память GPU все еще выделена и поэтому не может быть выделена снова. Он был решен путем ручного завершения всех процессов python, использующих графический процессор, или, альтернативно, закрытия существующего терминала и повторного запуска в новом окне терминала.

Ответ 2

По умолчанию тензор потока пытается выделить часть per_process_gpu_memory_fraction памяти графического процессора для его процесса, чтобы избежать дорогостоящего управления памятью. (См. Комментарии GPUOptions).
Это может привести к сбою и CUDA_OUT_OF_MEMORY предупреждения CUDA_OUT_OF_MEMORY. Я не знаю, каков запасной вариант в этом случае (либо с использованием CPU ops или allow_growth=True).
Это может произойти, если другой процесс использует графический процессор в данный момент (например, если вы запускаете два процесса, работающих с tensorflow). Поведение по умолчанию занимает ~ 95% памяти (см. Этот ответ).

Когда вы используете allow_growth = True, память GPU не выделяется заранее и сможет расти по мере необходимости. Это приведет к меньшему использованию памяти (поскольку по умолчанию используется вся память), но снижает производительность, если не используется должным образом, так как требует более сложного распределения памяти (что не является наиболее эффективной частью взаимодействия ЦП и ГП).

Ответ 3

Tensorflow 2.0 alpha

Проблема в том, что Tensorflow является жадным в распределении всех доступных VRAM. Это вызывает проблемы для некоторых людей.

Для Tensorflow 2.0 alpha/nightly используйте это:

import tensorflow as tf
tf.config.gpu.set_per_process_memory_fraction(0.4)

Источник: https://www.tensorflow.org/alpha/guide/using_gpu

Ответ 4

Я испытал ошибку памяти в Ubuntu 18.10. Когда я изменил разрешение моего монитора с 4k на fullhd (1920-1080), доступная память стала 438 МБ, и началось обучение нейронной сети. Я был очень удивлен таким поведением.

Кстати, у меня Nvidia 1080 с 8 ГБ памяти, до сих пор не знаю, почему доступно только 400 МБ

Ответ 5

Я столкнулся с этой проблемой, когда я пытаюсь запустить тензор-поток/керас во второй раз. Я использую экземпляр aws p2 с графическим процессором. Я не понимаю, где нужно установить gpu_options.allow_growth = True, моя информация о графическом процессоре выглядит следующим образом: + ---------------- -------------------------------------------------- ----------- + | NVIDIA-SMI 410.104 Версия драйвера: 410.104 CUDA Версия: 10.0 | | ------------------------------- + ----------------- ----- + ---------------------- + | Название графического процессора Персистент-М | Bus-Id Disp.A | Летучий Uncorr. ECC | | Fan Temp Perf Pwr: Использование/Крышка | Использование памяти | GPU-Util Compute M. | | =============================== + ================= ===== + ====================== | | 0 Тесла К80 Вкл | 00000000: 00: 1E.0 Выкл. | 0 | | N/A 45C P0 57 Вт /149 Вт | 11428MiB/11441MiB | 0% по умолчанию | + ------------------------------- + ----------------- ----- + ---------------------- +

+ ------------------------------------------------- ---------------------------- + | Процессы: Память GPU | | GPU PID Тип Имя процесса Использование | | ================================================= ============================ | | 0 29242 C... naconda3/envs/tenorflow_p36/bin/python 210MiB | | 0 30587 C... naconda3/envs/tenorflow_p36/bin/python 254MiB | + ------------------------------------------------- ---------------------------- +

Ответ 6

Я столкнулся с этой проблемой, когда пытался тренировать модель спина к спине. Я полагал, что память GPU была недоступна из-за предыдущих тренировочных заездов. Поэтому я обнаружил, что самый простой способ - вручную очищать память GPU перед каждой следующей тренировкой.

Используйте nvidia-smi для проверки использования памяти графическим процессором:

nvidia-smi

nvidi-smi --gpu-reset

Приведенная выше команда может не работать, если другие процессы активно используют графический процессор.

В качестве альтернативы вы можете использовать следующую команду для вывода списка всех процессов, использующих графический процессор:

sudo fuser -v /dev/nvidia*

И результат должен выглядеть следующим образом:

USER        PID ACCESS COMMAND
/dev/nvidia0:        root       2216 F...m Xorg
                     sid        6114 F...m krunner
                     sid        6116 F...m plasmashell
                     sid        7227 F...m akonadi_archive
                     sid        7239 F...m akonadi_mailfil
                     sid        7249 F...m akonadi_sendlat
                     sid       18120 F...m chrome
                     sid       18163 F...m chrome
                     sid       24154 F...m code
/dev/nvidiactl:      root       2216 F...m Xorg
                     sid        6114 F...m krunner
                     sid        6116 F...m plasmashell
                     sid        7227 F...m akonadi_archive
                     sid        7239 F...m akonadi_mailfil
                     sid        7249 F...m akonadi_sendlat
                     sid       18120 F...m chrome
                     sid       18163 F...m chrome
                     sid       24154 F...m code
/dev/nvidia-modeset: root       2216 F.... Xorg
                     sid        6114 F.... krunner
                     sid        6116 F.... plasmashell
                     sid        7227 F.... akonadi_archive
                     sid        7239 F.... akonadi_mailfil
                     sid        7249 F.... akonadi_sendlat
                     sid       18120 F.... chrome
                     sid       18163 F.... chrome
                     sid       24154 F.... code

Отсюда я получил PID для процесса, который удерживал память GPU, в моем случае это 24154.

Используйте следующую команду, чтобы завершить процесс с помощью его PID

sudo kill -9 MY_PID

Замените MY_PID на соответствующий PID

Ответ 7

Окружающая среда:
1.CUDA 10.0
2.cuNDD 10.0 3.tensorflow 1.14.0
4.pip установить opencv-contrib-python
5.git клон https://github.com/thtrieu/darkflow
6. Разрешение роста памяти графического процессора

enter image description here

Ссылка