当我开始训练一些神经网络时,它遇到了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
后内存使用量会变小。
答案 0 :(得分:24)
如果它仍然与某人相关,我在第一次运行中止后第二次尝试运行Keras / Tensorflow时遇到此问题。似乎仍然分配了GPU内存,因此无法再次分配。它通过手动结束使用GPU的所有python进程,或者关闭现有终端并在新的终端窗口中再次运行来解决。
答案 1 :(得分:11)
默认情况下,tensorflow尝试将GPU内存的一小部分per_process_gpu_memory_fraction
分配给他的进程,以避免代价高昂的内存管理。 (参见GPUOptions评论)
这可能会失败并引发CUDA_OUT_OF_MEMORY
警告。
我不知道在这种情况下是什么回退(使用CPU操作或allow_growth=True
)
如果其他进程此刻使用GPU,则会发生这种情况(例如,如果启动两个进程运行tensorflow
)。
默认行为需要大约95%的内存(请参阅此answer)。
使用allow_growth = True
时,GPU内存未预先分配,并且可以根据需要增长。这将导致更小的内存使用(因为默认选项是使用整个内存)但如果不正确使用则会降低性能,因为它需要更复杂的内存处理(这不是CPU / GPU交互中最有效的部分) )。
答案 2 :(得分:1)
Tensorflow 2.0 alpha
问题在于,Tensorflow在分配所有可用的VRAM方面很贪婪。这会给某些人带来麻烦。
对于Tensorflow 2.0 alpha /每晚,请使用此:
import tensorflow as tf
tf.config.gpu.set_per_process_memory_fraction(0.4)
答案 3 :(得分:1)
在尝试背靠背训练模型时,我遇到了这个问题。我发现GPU内存由于之前的训练而无法使用。因此,我发现最简单的方法是在每次下次训练之前手动刷新GPU内存。
使用nvidia-smi检查GPU内存使用情况:
nvidia-smi
nvidi-smi --gpu-reset
如果其他进程正在积极使用GPU,则上述命令可能不起作用。
或者,您可以使用以下命令列出使用GPU的所有进程:
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
从这里,我得到了保存GPU内存的进程的PID,在我的情况下为24154。
使用以下命令通过其PID终止进程
sudo kill -9 MY_PID
用相关的PID替换MY_PID
答案 4 :(得分:0)
我在Ubuntu 18.10中遇到内存错误。 当我将显示器的分辨率从4k更改为Fullhd(1920-1080)时,可用内存变为438mb,并且开始了神经网络训练。 这种行为让我感到非常惊讶。
顺便说一句,我有8GB内存的Nvidia 1080,仍然不知道为什么只有400mb可用
答案 5 :(得分:0)
环境:
1.CUDA 10.0
2.cuNDD 10.0
3.tensorflow 1.14.0
4.pip安装opencv-contrib-python
5.git clone https://github.com/thtrieu/darkflow
6.允许GPU内存增长