在深度学习过程中,使用显卡的情况主要有两个过程:一、网络模型训练过程;二、网络模型测试过程。在这两个过程中,都可能存在爆显存或者爆内存的情况。在编程过程中,有很多同学应该都遇到这种情况,本文提供了针对这些问题的解决方案供大家参考。

正常情况下无论是训练还是测试,显卡占用的显存资源不会大范围波动。

情况1 训练过程中爆显存

在训练过程中,如果出现显存不够用的情况,可以先分析具体什么情况。

(1)如果瞬间爆掉显存,很大可能是因为显卡加载模型并载入训练数据时,所需要的基本显存空间不够用。解决办法是减小训练过程中一个batch的样本数,因为一个batch是一同批量输入网络模型中,一个batch中样本数越多占用的显存就越大。第二个解决办法是换个更好的显卡,越大越从容,一般做做实验使用4G或8G显存以上的显卡基本够用。

(2)如果显卡的显存占用随着训练的迭代进程逐渐升高,大概率是在代码里没有将梯度清零。

检查代码,看看有没有写

optimizer.zero_grad()    # 清空梯度

每对模型训练一次相应的模型会计算一次梯度,如果没有写这行代码,梯度会不断叠加,所以占用的显存就会逐渐增大。

情况2 测试过程中爆显存

如果是在测试过程中显存占用,可以在代码中加入

with torch.no_grad():
# 当你的代码是这么写的时候
prediction = net(testdata)
# 使用with torch.no_grad():
with torch.no_grad():
    prediction = net(testdata)

原因是当你的模型在测试数据时每次运行测试数据依旧会计算梯度并得到新的计算图,所以占用显存逐步增多,在测试过程中只需要网络计算输出结果,不需要网络计算梯度,使用

with torch.no_grad():

可以只计算输出结果。

当你加入了这个代码后,随着测试数据的预测进程,显存占用稳定不变。但是如果这时候你发现你的显存占用还在缓慢上升,那可能是你把预测的输出值存在类似列表等的容器中。因为网络和测试数据你都通过.cuda()移到了显卡上计算,这时候再把输出结果存在列表中,依旧是在显存内,所以随着更多的预测结果的输出,显存在缓慢增加,直到用完卡死。这时你可以把预测结果移到cpu上,利用电脑内存存储列表值。一般内存都远大于显存,而且本人发现,同样数据量下的tensor在显存上的占用比内存大很多。

with torch.no_grad():
    prediction = net(testdata)
    prediction.cpu()
    pre_list.append(prediction)

这样就可以保证你的显存不会爆掉啦。

目前发现的情况是在自己做实验时遇到的,也有可能有说错没有验证的地方,或者还有其他的情况,欢迎大家指正和补充。一起踩坑一起进步。

Pytorch 训练时有时候会因为加载的东西过多而显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法。 使用torch.cuda.empty_cache()删除一些不需要的变量代码示例如下: output = model(input) except RuntimeError as exception: if "out of... 模型训练显存炸解决方法 在模型训练中,应该理解梯度、反向传播、图层、显存这些概念,在模型训练过程中,一般会分为训练+验证+测试 ,在这些过程中,一般在训练过程中会比较占用显存,因为涉及到反向传播,需要大量的梯度,这些数据又存放在显存中。 在今天模型的训练中,突然发现可以训练,但是在验证过程中出现显存炸炸,提示我显存不足,我就很纳闷,一直在找问题,终于发现了: 在我的训练代码中: for epoch in range(0, epoch_num): net.train() 当深度学习运算时显存不够,可能会导致以下几种情况: 程序无法正常运行:由于显存不够,程序可能会因为无法存储所有需要的变量和张量而无法正常运行,导致程序崩溃或者出现错误信息。 运行缓慢:显存不够时,计算机可能会不得不频繁地将数据从内存中转移到硬盘或者其他存储设备中,这会导致计算速度变慢,从而影响程序的性能。 计算结果不准确:如果显存不够,计算机可能会不得不将数据分成多个部分进行计算,这可能会导... 作者丨游客26024@知乎(已授权)编辑丨极市平台来源丨https://www.zhihu.com/question/461811359/answer/2492822726题外话,我为什么要写这篇博客,就是因为我穷!没钱!租的服务器使用多GPU时一会钱就烧没了(gpu内存不用),急需要一种trick,来降低内存加速。回到正题,如果我们使用的数据集较大,且网络较深,则会造成训练较慢,此时我们要想加... 最近新配置并重装了一台电脑,内存只有48G,虚拟内存系统默认配置的,如下图,可以看到大概有5.3G,在计算过程中,发现可用的内存自动提高了,由原来的63.3G变成了116G,先电脑系统磁盘分配了850G,空间够大,如果可用空间不够,估计就不会自动分配了,原来就是可用空间不太多,会中断预测过程。首先,如果内存只差一点点的情况下,我们可以尽量关闭其他正在运行的不相关应用程序,尽可能多的释放内存,同时也可以减少其他应用程序的干扰,实际应用过程中,有时候真的就会干扰到深度学习的计算过程导致中断。 文章目录问题描述参考链接 问题描述 2020-07-20 10:48:49.753261: W tensorflow/core/common_runtime/bfc_allocator.cc:439] ****************************************___**____***************************************____________ 2020-07-20 10:48:49.753329: W tensorflow/core/framewor 自深度学习大潮兴起,模型就朝着越来越大、越来越 「深」 的方向发展。 2012 年,拥有 5 个卷积层的 AlexNet 第一次在视觉任务上展现出强大的能力。在此之后,基础模型就开始「深」化起来:2014 年的 VGG-Net 达到了 19 层;2015 年的 ResNet、2017 年的 DenseNet 更是将深度提升到了上百层。 模型大小的提升极大地提高了性能。因此,各大视觉任务都将 ResNet、D 问题:在模型训练的过程中,自己手动加入了每隔2000轮测试一下模型在测试集上的效果,结果24G的显存每次到4000轮也就是测试两次就显存了,后来通过验证找到了问题,并且在测试代码段最后加入torch.cuda.empty_cache() 便解决问题。...