张量流中的CUDA_ERROR_OUT_OF_MEMORY

时间:2016-09-13 08:31:33

标签: tensorflow

当我开始训练一些神经网络时,它遇到了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后内存使用量会变小。

6 个答案:

答案 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)

来源:https://www.tensorflow.org/alpha/guide/using_gpu

答案 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内存增长

enter image description here

Reference