问题
RuntimeError: [enforce fail at ..\c10\core\CPUAllocator.cpp:76] data. DefaultCPUAllocator: not enough memory: you tried to allocate 1105920 bytes.
今天在使用自己电脑跑YOLOV7的时候,因为自己没有GPU所以使用CPU来跑测试模型,使用CPU来进行一张独立的图像进行预测,跑一张图像完全没有问题,非常的nice!!!但是,但是我接下来进行一段视频(多张图像)的预测,他给我说内存分配不足,
DefaultCPUAllocator: not enough memory: you tried to allocate 1105920 bytes.
,
而且它这个不是在跑第二张图像的是后出现的,是在计算第17张图像时出现,后面多次内存释放都不行~~~~~~~~
分析
在pytorch中,tensor有一个requires_grad参数,如果设置为True,则反向传播时,该tensor就会自动求导。tensor的requires_grad的属性默认为False,若一个节点(叶子变量:自己创建的tensor)requires_grad被设置为True,那么所有依赖它的节点requires_grad都为True(即使其他相依赖的tensor的requires_grad = False)
注
:
requires_grad是Pytorch中通用数据结构Tensor的一个属性,用于说明当前量是否需要在计算中保留对应的梯度信息,以线性回归为例,容易知道权重w和偏差b为需要训练的对象,为了得到最合适的参数值,我们需要设置一个相关的损失函数,根据梯度回传的思路进行训练。
当requires_grad设置为False时,反向传播时就不会自动求导了,因此大大节约了显存或者说内存。
那么本问题的解决方法也就随之而来, 在测试的时候让模型不要记录梯度就好, 因为其实也用不到。
解决方法
使用 with torch.no_grad(),在测试的时候让模型不要保存梯度:
with torch.no_grad():
output, _ = model(image) # 在图像计算前加入
这样在模型对每张图像进行计算的时候,不会再去求导,梯度不会保存!
完美解决!
希望这篇文章对你有用!
谢谢点赞评论!
文章出处登录后可见!