😎 作者介绍:我是程序员行者孙,一个热爱分享技术的制能工人。计算机本硕,人工制能研究生。公众号:AI Sun,视频号:AI-行者Sun
🎈
本文专栏:本文收录于《AI实战中的各种bug》系列专栏,相信一份耕耘一份收获,我会把日常学习中碰到的各种bug分享出来,不说废话,祝大家早日中稿cvpr
🤓 欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深度学习从0到1系列文章。 🖥
随时欢迎您跟我沟通,一起交流,一起成长、进步!
问题
报错:torch.cuda.OutOfMemoryError: CUDA out of memory. Tried to allocate 250.00 MiB.
问题分析
这个错误信息表示在使用PyTorch框架进行深度学习训练时,GPU的内存不足。具体来说,程序试图分配250MB的内存,但GPU上只有124.81MB是空闲的,而且整个过程中已经使用了1.73GB的内存。
74378223 parameters, 74378207 gradients, 1446.2 GFLOPs,这能不报错吗 嘿嘿
其实我这里是故意将参数量设置特别大,主要为了出现这个问题,然后看怎么解决(也许有可能你的模型参数量就是这么大,后面也有解决办法)。
- 内存需求超过可用内存:程序尝试分配的内存超过了GPU当前可用的内存。
- 内存泄漏:程序可能存在内存泄漏,导致内存没有被正确释放。
- 多个进程占用内存:如果有多个进程同时使用GPU,它们占用的内存总和可能超出了GPU的容量。
解决步骤:
- 减少批量大小(Batch Size):
- 减小批量大小可以减少每次迭代所需的内存量。
batchsize我从16减小到1,就可以跑了,最简单的办法,但是batchsize影响训练的速度,workers影响读磁盘的速度,emm…改了肯定跑的慢
但是改了,确实有用哈
-
优化模型结构:
-
检查模型是否可以简化或优化,以减少内存使用。
在报错处、代码关键节点(一个epoch跑完…)插入以下代码(目的是定时清内存):
import torch, gc gc.collect() torch.cuda.empty_cache()
-
-
代码优化(好用):
在测试阶段和验证阶段前插入代码 with torch.no_grad()(目的是该段程序不计算参数梯度),如下:
def test(model,dataloader):
model.eval()
with torch.no_grad(): ###插在此处
for batch in tqdm(dataloader):
……
- 使用多个GPU:
-
如果有多个GPU可用,可以尝试将模型分布到多个GPU上。
-
--device 0,1,2,3
-
祝大家实验顺利,有效涨点~
以上是此问题报错原因的解决方法,欢迎评论区留言讨论是否能解决,如果有用欢迎点赞收藏文章,博主才有动力持续记录遇到的问题!!!
免费资料获取
关注博主公众号,获取更多粉丝福利。