张量流中的CUDA_ERROR_OUT_OF_MEMORY
tensorflow
4
0

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

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

在尝试背靠背训练模型时,我遇到了这个问题。我发现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

收藏
评论

默认情况下,tensorflow尝试将GPU内存的per_process_gpu_memory_fraction分配给他的进程,以避免昂贵的内存管理。 (请参阅GPUOptions注释)。
这可能会失败并引发CUDA_OUT_OF_MEMORY警告。我不知道这种情况下的回退是什么(使用CPU ops或allow_growth=True )。
如果当前其他进程正在使用GPU,则可能发生这种情况(例如,如果您启动两个运行tensorflow进程)。默认行为占用〜95%的内存(请参阅此答案 )。

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

收藏
评论

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

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号