如何解决这个奇怪的错误:“RuntimeError: CUDA error: out of memory”
Posted
技术标签:
【中文标题】如何解决这个奇怪的错误:“RuntimeError: CUDA error: out of memory”【英文标题】:How to fix this strange error: "RuntimeError: CUDA error: out of memory" 【发布时间】:2019-06-19 20:36:16 【问题描述】:我运行了一段关于深度学习网络的代码,首先我训练了网络,效果很好,但是运行到验证网络时出现这个错误。
我有五个 epoch,每个 epoch 都有一个训练和验证的过程。我在第一个时期验证时遇到了错误。所以我不运行验证代码,我发现代码可以运行到第二个epoch并且没有错误。
我的代码:
for epoch in range(10,15): # epoch: 10~15
if(options["training"]["train"]):
trainer.epoch(model, epoch)
if(options["validation"]["validate"]):
#if(epoch == 14):
validator.epoch(model)
我觉得验证的代码可能有一些错误。但我找不到。
【问题讨论】:
那么你最终如何修复这个错误呢?你会减少批量大小吗? @xiaoding,你能告诉我们,解决办法是什么? @Lauraishere,他们在下面评论说他们减少了批量大小并且它不起作用。我也一样。你的问题解决了吗,如果解决了,可以分享一下吗? 如果模型用于验证,可以尝试使用'torch.no_grad()'。 【参考方案1】:显示您提供的错误,因为您的 GPU 内存不足。解决此问题的一种方法是减少批处理大小,直到您的代码运行时不会出现此错误。
【讨论】:
我试过了,我把batch size减到8了,还是一样的错误。 训练集的数据量远大于验证集。为什么训练没有错误,还有时间验证? 另一种对我有帮助的方法是:我在终端sudo rm -rf ~/.nv
中运行了这个命令,然后重新启动了我的笔记本电脑。
也可能在训练期间使用的张量仍然处于活动状态,然后您在验证期间创建更多。
你可以在这里查看这个问题github.com/tensorflow/tensorflow/issues/19731【参考方案2】:
我尝试在以下列表中报告可能有多种原因:
-
模块参数:检查模块的维数。将一个大输入张量(例如,大小 1000)转换为另一个大输出张量(例如,大小 1000)的线性层将需要一个大小为 (1000, 1000) 的矩阵。
RNN 解码器最大步数:如果您在架构中使用 RNN 解码器,请避免循环大量步数。通常,您会修复给定数量的解码步骤,这对您的数据集来说是合理的。
张量使用:尽量减少您创建的张量的数量。垃圾收集器在它们超出范围之前不会释放它们。
批量大小:逐渐增加批量大小,直到内存不足。这是一个常见的技巧,即使是著名的库也会实现(参见 AllenNLP 中 BucketIterator 的
biggest_batch_first
描述。
另外,我建议你看看官方 PyTorch 文档:https://pytorch.org/docs/stable/notes/faq.html
【讨论】:
同一个网络用于训练和验证。为什么训练没有错误,验证时却出现?【参考方案3】:1.. 当您只执行验证而不是训练时, 您无需计算前向和后向相位的梯度。 在这种情况下,您的代码可以位于
with torch.no_grad():
...
net=Net()
pred_for_validation=net(input)
...
以上代码不使用 GPU 内存
2.. 如果您在代码中使用 += 运算符, 它可以在您的梯度图中连续累积梯度。 在这种情况下,您需要像以下站点一样使用 float()https://pytorch.org/docs/stable/notes/faq.html#my-model-reports-cuda-runtime-error-2-out-of-memory
即使 docs 使用 float() 引导,对我来说,item() 也可以像
entire_loss=0.0
for i in range(100):
one_loss=loss_function(prediction,label)
entire_loss+=one_loss.item()
3.. 如果在训练代码中使用 for 循环, 数据可以持续到整个 for 循环结束。 因此,在这种情况下,您可以在执行 optimizer.step() 后显式删除变量
for one_epoch in range(100):
...
optimizer.step()
del intermediate_variable1,intermediate_variable2,...
【讨论】:
关于第1点,我使用预训练的bert模型对文本数据进行转换(仅推理,不训练)。仍然得到 cuda out of memory 错误。 @LeiHao:尝试减少批量大小。【参考方案4】:最好的办法是找到占用gpu内存的进程并杀死它:
从以下位置找到python进程的PID:
nvidia-smi
复制 PID 并通过以下方式终止它:
sudo kill -9 pid
【讨论】:
除了游戏等明显的东西之外,还有哪些程序会占用大量 GPU 内存?【参考方案5】:如果有人因为 fast.ai 而到达这里,则可以通过 bs=N
控制诸如 ImageDataLoaders
之类的加载程序的批量大小,其中 N 是批量大小。
我的专用 GPU 被限制为 2GB 内存,在以下示例中使用 bs=8
在我的情况下工作:
from fastai.vision.all import *
path = untar_data(URLs.PETS)/'images'
def is_cat(x): return x[0].isupper()
dls = ImageDataLoaders.from_name_func(
path, get_image_files(path), valid_pct=0.2, seed=42,
label_func=is_cat, item_tfms=Resize(244), num_workers=0, bs=)
learn = cnn_learner(dls, resnet34, metrics=error_rate)
learn.fine_tune(1)
【讨论】:
这正是我遇到此错误的地方 - 尝试为“使用 fastai 和 pytorch 的编码人员深度学习”一书执行上述 jupyter 单元格。然而,起初,它并没有奏效。即使使用 num_workers=0 和 bs=8,它也会耗尽内存。我尝试使用 bs=4,尝试关闭所有其他正在运行的应用程序,但内存仍然不足。但是后来,我决定重新启动(对 Windows 来说总是一个好主意),在那之后,它花了一段时间,但运行成功。事实上,考虑一下,我可能会建议先重新启动,然后只使用 num_workers=0(在 Windows 下这是必需的)。【参考方案6】:我的电脑也遇到了同样的问题。您所要做的就是自定义适合您计算机的 cfg 文件。原来我的计算机将图像大小低于 600 X 600,当我在配置文件中进行相同的调整时,程序运行顺利。Picture Describing my cfg file
【讨论】:
【参考方案7】:我遇到了同样的问题,这段代码对我有用:
import gc
gc.collect()
torch.cuda.empty_cache()
【讨论】:
如果在 collab 上运行并且需要重置 GPU 内存则很好 有趣,你会把这段代码放在你的程序中的什么地方?一开始? 感谢Jupyter Lab
为我工作【参考方案8】:
我是 Pytorch 用户。就我而言,这个错误消息的原因实际上不是由于 GPU 内存,而是由于 Pytorch 和 CUDA 之间的版本不匹配。
通过下面的代码检查原因是否真的是由于您的 GPU 内存。
import torch
foo = torch.tensor([1,2,3])
foo = foo.to('cuda')
如果上述代码仍然出现错误,最好根据你的CUDA版本重新安装你的Pytorch。 (就我而言,这解决了问题。) Pytorch install link
Tensorflow/Keras 也会发生类似的情况。
【讨论】:
“根据您的 CUDA 版本重新安装 Pytorch”是什么意思?你如何对应cuda和pytorch的版本?假设我正在安装每晚版本,您的定义中适合的 cuda 版本是什么? @Blade,您的问题的答案不会是静态的。但是this page 建议当前的夜间构建是针对 CUDA 10.2 构建的(但可以安装 CUDA 11.3 版本等)。此外,previous versions 页面也有安装特定版本 CUDA 的说明。【参考方案9】:以下代码解决的问题:
import os
os.environ['CUDA_VISIBLE_DEVICES']='2, 3'
【讨论】:
【参考方案10】:如果您在 Google Colab 中遇到此错误,请使用以下代码:
import torch
torch.cuda.empty_cache()
【讨论】:
我们也可以在本地机器上使用此代码吗?我也不断收到这个错误,非常详细:RuntimeError: CUDA out of memory。尝试分配 20.00 MiB(GPU 0;3.95 GiB 总容量;2.80 GiB 已分配;39.31 MiB 空闲;PyTorch 总共保留 2.89 GiB)@ThembaTman 是的,你可以。empty_cache() 不会增加可用于 PyTorch 的 GPU 内存量。但是,在某些情况下,它可以帮助减少 GPU 内存碎片。以上是关于如何解决这个奇怪的错误:“RuntimeError: CUDA error: out of memory”的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch RNN 错误:RuntimeError:输入必须有 3 个维度得到 1
RuntimeError:字典迭代过程中改变大小 - 如何解决?
“RuntimeError:生成器引发了 StopIteration”如何解决这个 python 问题?
RuntimeError: Python is not installed as a framework 错误解决办法
你如何修复 numpy 和 pandas 的“runtimeError: package failed to pass a sanity check”?