RuntimeError: CUDA out of memory. Tried to allocate 20.00 MiB (GPU 0; 10.92 GiB total capacity; 1.43 GiB already allocated; 10.69 MiB free; 1.49 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF太长不看版
- 就是显存不够了,换显存更大的显卡(可以看下这个大哥的帖子)深度学习常见显卡介绍和比较或者调小你的batch_size吧
- 在报错的代码那里加上 torch.cuda.empty_cache( ),及时清理不用的缓存变量
- 同时使用model.eval()和torch.no_grad(),就像下面这样
self.model.eval()
with torch.no_grad():
{
训练代码
}
- 如果上面的方法对你都没用的话,那你可能就得接着往下看了
前段时间训练模型的时候突然碰到这么一个报错,读了一下发现说是内存爆了,我心里一寻思,不能吧,以前在Colab上跑都没遇到过这事,现在怎么换成高大上的实验室里的服务器反而爆内存了呢?
于是大概研究了一下,首先:
nvidia-smi
这行代码简单来说就是可以看到当前设备上显卡的使用情况,具体的解释这位大哥写的很详细啦
nvidia-smi 命令详解
于是我发现,我们这个服务器上一共是有两张卡的,其中一张卡占用率是100%,另一张卡是13%,按理说显存不应该爆呀?
后来我仔细看了一下代码,发现原因是这么回事:
首先,熟悉pytorch的朋友可能都知道,Pytorch内部有这么一个函数:
torch.nn.DataParallel(),这个函数简单来说就是可以把数据分别移动到你所有可用的显卡上进行计算,那么在0卡被占满的情况下就肯定会报错了
所以在这种情况下,可以跟用卡的大哥商量一下,比如说把1卡让出来(注意,显卡的编号是从0开始的,1卡也就是第二张显卡)
然后,查看一下你的代码,把其中设备的部分改为
device = torch.device('cuda:1')
或者直接不用GPU计算
device = torch.device('cpu')
那么这样做了之后,有可能还是会报错的
这是因为你的代码里可能会有这样的代码
以变量var为例
var.cuda()
因为默认的设备时cuda:0
所以你需要将代码改为
device = torch.device('cuda:1')
var.to(device)
那么如果还是没有解决的话,欢迎在评论区一起讨论自己遇到的问题哦



