根本原因是windows下cuda上下文未销毁、python子进程残留及pytorch缓存机制叠加;需通过tasklist和nvidia-smi定位并taskkill强制终止隐性gpu进程,配合cudadevicereset、环境变量配置及批处理封装实现自动清理与预防。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

你在Windows上运行Grok类大模型推理或微调后,关闭Python脚本或Jupyter内核,发现nvidia-smi仍显示GPU显存被占用,导致下次启动直接报“CUDA out of memory”,根本原因不是代码写错,而是Windows系统下CUDA上下文未被彻底销毁、Python子进程残留、以及PyTorch缓存机制三者叠加所致。
确认残留显存是否真由Python进程引起
打开命令提示符(管理员权限),执行:
fuser -v /dev/nvidia0 2>nul || echo "fuser不可用,改用tasklist"
由于Windows原生不支持fuser,直接运行:
tasklist /fi "imagename eq python.exe" /fo list | findstr "PID"
若输出为空,说明主Python进程已退出;但nvidia-smi仍有显存占用——这说明是子进程、CUDA驱动残留或PyTorch后台线程在作祟,【此时绝不能直接重启电脑,要先定位PID】。
手动查找并终止隐性GPU持有进程
第一步:列出所有使用GPU的进程ID
nvidia-smi --query-compute-apps=pid,used_memory --format=csv,noheader,nounits
第二步:对每个PID,用tasklist反查进程详情
for /f "tokens=1" %i in ('nvidia-smi --query-compute-apps=pid --format=csv,noheader,nounits') do @tasklist /fi "pid eq %i" /fo csv | findstr /i "python torch grok"
第三步:重点识别三类危险PID:
• PID对应进程名含“pythonw.exe”或“py.exe”但无控制台窗口(典型后台服务残留)
• PID的Session Name为“Services”(Windows服务模式启动的PyTorch进程)
• PID的Mem Usage列显示非零但命令行为空(CUDA流未同步结束)
找到目标PID后,强制终止:
taskkill /f /t /pid 【此处替换为实际PID】
预防下次启动时显存再次卡死
方法一:在Grok加载前插入显存预清空指令
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 显式锁定单卡
import torch
torch.cuda.empty_cache() # 必须在import模型前执行
方法二:启用Windows专用的CUDA上下文强制销毁
import ctypes
try:
cudart = ctypes.CDLL("cudart64_12.dll")
cudart.cudaDeviceReset() # Windows下比empty_cache更彻底
except OSError:
pass # DLL未找到则跳过
方法三:禁用PyTorch的CUDA上下文复用(关键!)
在启动Python前,设置环境变量:
set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
set CUDA_LAUNCH_BLOCKING=1
这一步能避免Windows下因异步内核未完成导致的显存“假占用”,【必须在cmd中set后再启动python,不能在代码里os.environ赋值】。
永久解决:用批处理封装Grok启动流程
新建run_grok.bat,内容如下:
@echo off
set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
set CUDA_LAUNCH_BLOCKING=1
set CUDA_VISIBLE_DEVICES=0
echo 清理残留GPU进程...
for /f "tokens=1" %%i in ('nvidia-smi --query-compute-apps=pid --format=csv,noheader,nounits 2^>nul') do taskkill /f /t /pid %%i 2>nul
timeout /t 1 /nobreak >nul
python grok_inference.py %*
pause
以后双击此bat启动Grok,每次都会自动杀残留+重置上下文+阻塞式启动,无需手动干预。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











