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继续探索其他解决方法。
希望能帮助到各位!