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

雨婷酱_2123

雨婷酱_2123

2026-06-16

340人浏览

原创

根本原因是windows下cuda上下文未销毁、python子进程残留及pytorch缓存机制叠加;需通过tasklist和nvidia-smi定位并taskkill强制终止隐性gpu进程,配合cudadevicereset、环境变量配置及批处理封装实现自动清理与预防。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

grok在windows下显存无法释放:解决python进程退出后显存残留

你在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流未同步结束)

python-parallelization
python-parallelization

将顺序 Python 代码转换为并行/并发实现,用于在需要并行化 Python 代码、提升性能时使用。

下载

找到目标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 的核心概念和高级技巧!

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4364

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1689

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25577

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3107

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2423

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Grok官方手册
Grok官方手册

共0课时 | 0人学习

Conan 2 安装指南
Conan 2 安装指南

共0课时 | 0人学习