(原创、不是重复文章)xxx GiB reserved in total by PyTorch的问题

RuntimeError: CUDA out of memory. Tried to allocate 72.00 MiB (GPU 0; 4.00 GiB total capacity; 1.60 GiB already allocated; 40.11 MiB free; 1.72 GiB reserved in total by PyTorch)

这个报错一开始看一定很抽象,因为内存4G,1.6G分配了,为什么只剩下40.11MB?后面的1.72G reserved in total by PyTorch又是什么意思?

两篇github文章(前一篇就够用了)

How does "reserved in total by PyTorch" work? - PyTorch Forums

OOM error where ~50% of the GPU RAM cannot be utilised/reserved · Issue #35901 · pytorch/pytorch · GitHub

解答:(以下用我自己的话总结,可能难理解,建议看最底下的贴图)

在你代码启动的那一刻,pytorch开始加载model,你的模型的复杂程度导致所需要的参数数量不一致,而这些参数所占用的内存不是用的系统内存,而是用你的GPU内存(即显存)【这里补充一句,很多人遇到比这篇文章更头疼的问题就是为什么GPU的memrory-usage都占满了,但是GPU-util却接近0%,我上面那句话可以帮助你理解这个问题,具体内容这里不讲】这里要知道的是:这些GPU的内存由两部分组成:为tensor所分配的内存+缓存。

就这样,随着model不断加载,你的GPU也内存不断被占用。我以上面报错的信息为例说明这问题:我有4G的GPU显存,此刻你的model还没被加载完,但你的GPU内存已经只剩40.11MB了,也就是说,剩下的3.96G都被占用了,注意到这3.96G==1.6G+2.36G(1.6G指为tensor所分配的内存,2.36G指缓存)。可是现在的情况是:接下来你还需要72MB内存去储存你剩余的模型参数,但是现在只剩40.11MB了那此刻就会造成内存不够用的情况了。

比较抽象的事情来了:当系统发现GPU内存不够的时候,它会在报错前做一件事情,就是把GPU中一部分缓存释放掉。注意到缓存不是随便释放的,是释放那些看起来没什么用的缓存。我们知道现在有2.36的缓存,那么它会释放掉2.24G的缓存,剩下0.12G的缓存。做完这件事后再报错(我一开始很奇怪:把缓存释放了不就有内存可以用了?为什么还会报错?后来我想了一下,可能是因为这些缓存还是有点用的,删了它们可能会对后续造成影响,有点拆东墙补西墙的感觉,所以为了保险还是报错了)

提问:现在GPU的内存还是3.96G==1.6G+2.36G吗?很明显不是,而是1.72G==1.6G+0.12G,这就是为什么说1.72 GiB reserved in total by PyTorch的原因,而这句话1.60 GiB already allocated什么意思不用多说了吧。至于这句话:40.11 MiB free人家也没说错吧。

至此,结束。以上只是我自己的理解,可能有不恰当的地方,底下的图片是当时找的资料,就是根据它来理解的,可以看底下图片的。

 

 

 

 

  • 38
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
在这个错误信息中,反映了GPU内存不足的问题。具体情况如下: - “GPU 0; 4.00 GiB total capacity” 表示该GPU设备的总容量为4.00 GiB。 - “3.40 GiB already allocated” 表示已经分配了3.40 GiB的内存。 - “0 bytes free” 表示没有剩余的内存可供分配。 - “3.47 GiB reserved in total by PyTorch” 表示PyTorch保留了3.47 GiB的内存。 根据这些信息,可以得出以下结论: 1. 内存不足:已经分配的内存量(3.40 GiB)接近了GPU的总容量(4.00 GiB)。由于没有剩余内存可供分配,因此无法分配额外的32.00 MiB内存,导致出现了“CUDA out of memory”的错误。 2. PyTorch保留内存:PyTorch保留了大约3.47 GiB的内存。保留的内存是为了提高计算性能和内存管理效率,但它也占用了GPU的一部分内存。因此,虽然保留的内存可以使用,但在计算时需要考虑已分配和保留内存的总和,以避免超出GPU容量。 针对这个问题,您可以尝试以下解决方法: 1. 减少内存使用:优化模型、减小批次大小或使用更小的数据类型(例如float32到float16)可以减少内存使用量。 2. 释放内存:在每个迭代周期结束时,手动释放不再使用的Tensor对象,以便及时回收内存。可以使用`torch.cuda.empty_cache()`来释放PyTorch保留的内存。 3. 设置max_split_size_mb:根据错误信息中的建议,您可以尝试设置`max_split_size_mb`参数来避免内存碎片化。具体使用方法可参考PyTorch文档中有关内存管理的部分。 请注意,GPU的总容量是固定的,无法改变。因此,如果以上解决方法无法满足您的需求,可能需要考虑使用更大容量的GPU设备或分布式训练等策略来解决内存不足的问题

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值