这类问题我又碰上了一次。二十四 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 只归还分配器池里的空闲块,上下文和通信缓冲的占用要靠销毁进程组或重启进程解决。如果同一现象隔几天又出现,说明根因没找到,别当偶发处理。
