RuntimeError: CUDA out of memory

RuntimeError: CUDA out of memory. Tried to allocate 488.00 MiB (GPU 0; 23.70 GiB total capacity; 1.72 GiB already allocated; 399.56 MiB free; 2.40 GiB reserved in total by PyTorch)

问题描述

在用3090运行DBNet(icdar2015、resnet50)时,将batchsize设置为1爆出以上问题。(简直奇怪,按理来说,batchsize=4都可以的)
先对问题进行解释:

  • Tried to allocate 20.00 MiB: 尝试分配 20.00 MiB 的内存。

  • GPU 0; 23.70 GiB total capacity: GPU 0 的总内存容量为 23.70 GiB。

  • 2.76 GiB already allocated: 已经分配了 2.76 GiB 的内存。

  • 17.56 MiB free: 剩余可用内存为 17.56 MiB。

  • 2.77 GiB reserved in total by PyTorch: PyTorch 总共已经保留了 2.77 GiB 的内存

解决方法

尝试1

之前,我的代码中一些内存释放命令被注释,尝试将其恢复,但是无效

import torch
torch.cuda.empty_cache()

尝试2

我当时只运行一个程序tools/train.py,将这个程序暂停之后,利用下面命令(或者利用服务器的实例监控)发现还有大量现存被占用,猜测可能有其他进程占用显存。

nvidia-smi
//间隔0.01s刷新一次
watch -n 1 nvidia-smi

在这里插入图片描述
其中Memory-Usage为显存占用情况,由于从processes中无法得到当前占用显存的其他进程信息,遂输入以下命令查看当前运行的进程(Linux 或 macOS系统适用 )

ps aux | grep python

输出下图
在这里插入图片描述
各列具体参数请自行百度,第二列为进程号(PID),由图中可以看出,之前关掉的python tools/train.py进程还活着,既然如此,利用以下命令强制杀死上图中的后三个进程,其中PID为进程号

//根据进程号杀死,此处我是61***、45***、108****
kill -9 PID  
//根据脚本名字杀死进程

原因分析

有时候 Python 进程可能会在结束后仍然保留 GPU 内存,尝试关闭所有与 Python 相关的进程,然后再重新运行任务。

另外,一个问题,nvidia-smi无法显示当前占用显卡的进程,下面一张图片为tools/train.py正常运行时的截图。

如果显卡没有被进程占用的话,可以考虑降低batch_size以及num_workers。
以上不能解决,请移步https://blog.youkuaiyun.com/weixin_44935658/article/details/133704723继续探索其他解决方法。

希望能帮助到各位!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值