让 CUDA 内存不足

Posted

技术标签:

【中文标题】让 CUDA 内存不足【英文标题】:Getting CUDA out of memory 【发布时间】:2018-07-06 12:20:30 【问题描述】:

我正在尝试训练一个网络,但我明白了, 我将批量大小设置为 300,我得到了这个错误,但即使我把它减少到 100,我仍然得到这个错误,更令人沮丧的是,在 ~1200 个图像上运行 10 个 epoch 大约需要 40 分钟,任何建议是怎么回事错了,我该如何加快这个过程! 任何提示都会非常有帮助,在此先感谢。

---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-31-3b43ff4eea72> in <module>()
      5         labels = Variable(labels).cuda()
      6 
----> 7         optimizer.zero_grad()
      8         outputs = cnn(images)
      9         loss = criterion(outputs, labels)

/usr/local/lib/python3.5/dist-packages/torch/optim/optimizer.py in     zero_grad(self)
    114                 if p.grad is not None:
    115                     if p.grad.volatile:
--> 116                         p.grad.data.zero_()
    117                     else:
    118                         data = p.grad.data

RuntimeError: cuda runtime error (2) : out of memory at /pytorch  /torch/lib/THC/generic/THCTensorMath.cu:35`

即使我的 GPU 是免费的

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.111                Driver Version: 384.111                       |
|-------------------------------+----------------------+----------------------+
| 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 108...  Off  | 00000000:05:00.0 Off |                   N/A |
| 23%   18C    P8    15W / 250W |  10864MiB / 11172MiB |      0%      Default |
    +-------------------------------+----------------------+----------------------+

|   1  GeForce GTX 108...  Off  | 00000000:08:00.0 Off |                  N/A |    
 | 23%   20C    P8    15W / 250W |     10MiB / 11172MiB |          0%      Default
+-------------------------------+----------------------+---------------

【问题讨论】:

由于你没有提供你的代码,人们不得不猜测哪里出了问题。为什么不尝试提供MCVE? 由于我不知道你的代码,我能给你的唯一建议是尝试减少你的批量大小。 【参考方案1】:

相当笼统的问题。这是我对这个问题的看法。

尝试将批次大小(批次数)设置为 1。如果这解决了问题,您可以尝试找到最佳批次大小。

即使对于bs=1,您也会收到“RuntimeError: cuda runtime error (2) : out of memory”:

不要使用太大的线性图层。 线性层 nn.Linear(m, n) 使用 O(nm)O(nm)O(nm) 内存:也就是说,权重的内存需求与特征数量成二次方,同时考虑梯度。

不要在整个训练循环中累积历史记录。 如果您在 10000 或更多的循环内递归地对损失求和,那么您的反向传播评估将是巨大的;占用大量内存。

使用del 明确删除不需要的张量

如果您怀疑其他 Python 进程正在占用您的内存,请在您的 GPU 上运行 ps -elf | grep python 和 python 进程 kill -9 [pid]

【讨论】:

以上是关于让 CUDA 内存不足的主要内容,如果未能解决你的问题,请参考以下文章

如何避免 PyTorch 中的“CUDA 内存不足”

使用 Numba 进行矩阵乘法时出现 CUDA 内存不足错误

CUDA 错误:内存不足 - Python 进程使用所有 GPU 内存

运行时错误:CUDA 在训练结束时内存不足并且不保存模型;火炬

如何在训练过程中检查CUDA内存不足的根本原因?

Tensorflow GPU错误CUDA_ERROR_OUT_OF_MEMORY:内存不足