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]()
Ссылка