这类问题我又碰上了一次。二十四 GB 的卡上跑完一次 7B 推理,调用 empty_cache 之后 nvidia-smi 仍显示占用三点二 GB,torch 里 allocated 已经归零;同一个进程再去加载第二个模型就报显存不足,只能重启进程。

第一反应是「另一个残留进程仍占着同一张卡」,验证下来不成立。

原因不止一个,得分开看。CUDA 上下文与算子库工作区由驱动持有,不受缓存释放影响;NCCL 通信缓冲和进程组还没有销毁;缓存分配器只会归还池内的空闲块。

第一件事是分别看分配量与保留量是否都已归零

python -c "import torch;print(torch.cuda.memory_allocated()/2**20, torch.cuda.memory_reserved()/2**20)"

随后列出占卡进程确认没有残留

nvidia-smi --query-compute-apps=pid,used_memory --format=csv

销毁进程组之后再释放一次缓存

python -c "import torch,torch.distributed as d;d.destroy_process_group() if d.is_initialized() else None;torch.cuda.empty_cache()"

剩下的就是确认驱动侧上下文占用的固定量

python -c "import torch;print(torch.cuda.memory_summary(abbreviated=True))"

改完先别撤,确认这几项。分配量与保留量都归零,nvidia-smi 剩余占用稳定在一个固定值,加载第二个模型时不再报显存不足。

补一句。empty_cache 只归还分配器池里的空闲块,上下文和通信缓冲的占用要靠销毁进程组或重启进程解决。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。

作者 9823189