游乐游手机版
首页/AI热点日报/热点详情

Grok在Windows下显存无法释放:Python进程退出后残留解决

类型:热点整理2026-07-18
在 Windows 系统上运行 Grok 等大模型的推理或微调任务后,明明 Python 脚本和 Jupyter 内核都已经关闭,但用 nvidia-smi 查看却发现显存依然被牢牢占用。下次启动时,就会直接报出 “CUDA out of memory” 错误。别急着怀疑自己的代码写错了,根本原因其

在 Windows 系统上运行 Grok 等大模型的推理或微调任务后,明明 Python 脚本和 Jupyter 内核都已经关闭,但用 nvidia-smi 查看却发现显存依然被牢牢占用。下次启动时,就会直接报出 “CUDA out of memory” 错误。别急着怀疑自己的代码写错了,根本原因其实只有三个:Windows 环境下 CUDA 上下文未能彻底销毁、Python 子进程偷偷残留,以及 PyTorch 缓存机制 “帮忙” 锁死。三者叠加,显存就像被焊死了一样。

Grok在Windows下显存无法释放:解决Python进程退出后显存残留

先确认一个关键问题:残留的显存到底是不是由 Python 进程引起的?打开命令提示符(记得以管理员身份运行),传统做法是用 fuser,但 Windows 原生不支持,直接改用 tasklist

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 反查进程详情,重点筛选与 Python、PyTorch、Grok 相关的进程:

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——
• 进程名是 pythonw.exepy.exe 但没有控制台窗口的(典型后台服务残留)
• Session Name 为 Services 的(以 Windows 服务模式启动的 PyTorch 进程)
• 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 上下文强制销毁——在 Windows 下比 empty_cache 更彻底:

import ctypes
try:
    cudart = ctypes.CDLL("cudart64_12.dll")
    cudart.cudaDeviceReset()
except OSError:
    pass

方法三:禁用 PyTorch 的 CUDA 上下文复用。这一步是关键,必须在启动 Python 之前,在 cmd 中设置环境变量,不能在代码中用 os.environ 赋值:

set PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128
set CUDA_LAUNCH_BLOCKING=1

设置完再启动 Python,这样能避免 Windows 下因异步内核未完成导致的显存 “假占用”。

永久解决:用批处理封装 Grok 启动流程

不想每次都手动执行这些步骤,那就写一个 bat 脚本,一键搞定。新建 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,每次都会自动杀残留、重置上下文、以阻塞方式启动,彻底告别手动干预。当然,如果你同时跑着其他需要 GPU 的程序,建议先把 bat 里的通杀逻辑改成按进程名筛选,避免误伤。

来源:https://www.php.cn/faq/2658648.html?uid=1221864

相关热点

继续查看同栏目近期热点。

延伸阅读

补充最近整理过的热点入口。