张量流中的CUDA_ERROR_OUT_OF_MEMORY

luo*_*hao 25 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
...
Run Code Online (Sandbox Code Playgroud)

使用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 |
+-----------------------------------------------------------------------------+ 
Run Code Online (Sandbox Code Playgroud)

在我评论之后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 |
+-----------------------------------------------------------------------------+ 
Run Code Online (Sandbox Code Playgroud)

我有两个问题.为什么CUDA_OUT_OF_MEMORY出来并且程序正常进行?为什么评论后内存使用量会变小allow_growth = True

use*_*774 33

如果它仍然与某人相关,我在第一次运行中止后第二次尝试运行Keras/Tensorflow时遇到了这个问题.似乎仍然分配了GPU内存,因此无法再次分配.它通过手动结束使用GPU的所有python进程,或者关闭现有终端并在新的终端窗口中再次运行来解决.


Tho*_*eau 14

默认情况下,tensorflow尝试将一小部分per_process_gpu_memory_fractionGPU内存分配给他的进程,以避免代价高昂的内存管理.(参见GPUOptions评论).
这可能会失败并提出CUDA_OUT_OF_MEMORY警告.我不知道在这种情况下是什么回退(使用CPU操作或a allow_growth=True).
如果其他进程此刻使用GPU,则会发生这种情况(例如,如果启动两个进程运行tensorflow).默认行为需要大约95%的内存(请参阅此答案).

使用时allow_growth = True,GPU内存不会预先分配,并且可以根据需要增长.这将导致更小的内存使用(因为默认选项是使用整个内存)但如果不正确使用则会降低性能,因为它需要更复杂的内存处理(这不是CPU/GPU交互中最有效的部分) ).

  • 默认情况下,tensorflow仅考虑gpu内存的95%作为整个内存,因此7793MB似乎是正确的(请参阅额外链接).在`allow_growth`中使用更多内存应该与你的网络大小有关(我还没有找到任何关于这个的来源......).例如,如果你在GPU上分配两个4GB变量,它将适合'allow_growth`(~8GB),但不适用于预分配的内存,因此提高了`CUDA_ERROR_OUT_OF_MEMORY`警告 (2认同)

Sid*_*idK 14

我在尝试背靠背训练模型时遇到了这个问题。我认为由于之前的训练运行,GPU 内存不可用。所以我发现最简单的方法是在每次下一次训练之前手动刷新 GPU 内存。

使用 nvidia-smi 检查 GPU 内存使用情况:

nvidia-smi

nvidia-smi --gpu-reset
Run Code Online (Sandbox Code Playgroud)

如果其他进程正在积极使用 GPU,则上述命令可能不起作用。

或者,您可以使用以下命令列出所有使用 GPU 的进程:

sudo fuser -v /dev/nvidia*
Run Code Online (Sandbox Code Playgroud)

输出应如下所示:

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
Run Code Online (Sandbox Code Playgroud)

从这里,我得到了持有 GPU 内存的进程的 PID,在我的例子中是 24154。

使用以下命令通过其 PID 终止进程:

sudo kill -9 MY_PID
Run Code Online (Sandbox Code Playgroud)

用相关的 PID 替换 MY_PID。


ket*_*ett 5

张量流 2.0 阿尔法

问题是,Tensorflow 贪婪地分配所有可用的 VRAM。这会给一些人带来问题。

对于 Tensorflow 2.0 alpha / nightly,请使用以下命令:

import tensorflow as tf
tf.config.gpu.set_per_process_memory_fraction(0.4)
Run Code Online (Sandbox Code Playgroud)

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