Linux下显卡测试工具和脚本分享
-
谢谢锤哥的脚本,我让deepseek改了两稿才能正确的在windows下执行:【import torch
import sys
import os建议开启 expandable_segments 避免碎片(对 PyTorch 1.11+ 有效)
os.environ['PYTORCH_CUDA_ALLOC_CONF'] = 'expandable_segments:True'
print(f"
正在启动英伟达消费级显存物理专项扫描...")
if not torch.cuda.is_available():
print("
没找到 GPU 驱动")
sys.exit(1)device = torch.device("cuda:0")
获取总显存,多留一些空间给驱动和系统(这里留 3GB)
total_mem = torch.cuda.get_device_properties(0).total_memory
safe_margin = 3 * 1024 * 1024 * 1024 # 3 GB
usable_mem = total_mem - safe_margin
print(f"
物理检测到总显存: {total_mem / (10243):.2f} GB")
print(f"
预留安全边界后可用显存: {usable_mem / (10243):.2f} GB")分块大小:每次分配 2GB 的 float32 张量(即 512M 个元素),避免一次性大块失败
chunk_bytes = 2 * 1024 * 1024 * 1024
chunk_elements = chunk_bytes // 4 # float32 每个 4 字节
num_chunks = usable_mem // chunk_bytesprint(f"
采用分块扫描策略,共 {num_chunks} 块,每块 {chunk_bytes / (1024**3):.2f} GB")
print(f"
开始物理交替位元扫雷测试(耗时较长)...\n")try:
for chunk_idx in range(num_chunks):
print(f" -> [块 {chunk_idx+1}/{num_chunks}] 写入全 0 模式并校验物理放电...")
grid0 = torch.zeros(chunk_elements, dtype=torch.float32, device=device)
torch.cuda.synchronize()
if not (grid0 == 0).all():
raise ValueError(f"块 {chunk_idx+1} 放电校验失败!")
del grid0print(f" -> [块 {chunk_idx+1}/{num_chunks}] 写入全 1 模式并校验物理充电...") grid1 = torch.ones(chunk_elements, dtype=torch.float32, device=device) torch.cuda.synchronize() if not (grid1 == 1).all(): raise ValueError(f"块 {chunk_idx+1} 充电校验失败!") del grid1 print(f" -> [块 {chunk_idx+1}/{num_chunks}] 交替位元高频冲刷...") pattern = torch.arange(0, chunk_elements, dtype=torch.float32, device=device) torch.cuda.synchronize() # 简单校验:求和 s = pattern.sum().item() del pattern torch.cuda.empty_cache() # 每块完成后清理缓存 print(f" ✔ 块 {chunk_idx+1} 通过。\n") print(f"🎉【显存物理体检通过】所有魔改颗粒逐位读写 100% 正确!")except Exception as e:
print(f"\n
【铁证如山】显存物理颗粒扫描失败: {e}")
sys.exit(1)】我x99洋垃圾上的3090和3060都检测通过:【
D:\temp>python vram_heavy_test.py
正在启动英伟达消费级显存物理专项扫描...
物理检测到总显存: 12.00 GB
预留安全边界后可用显存: 11.00 GB
采用分块扫描策略,共 5 块,每块 2.00 GB
开始物理交替位元扫雷测试(耗时较长)...-> [块 1/5] 写入全 0 模式并校验物理放电...
D:\temp\vram_heavy_test.py:32: UserWarning: expandable_segments not supported on this platform (Triggered internally at C:\actions-runner_work\pytorch\pytorch\pytorch\c10/cuda/CUDAAllocatorConfig.h:28.)
grid0 = torch.zeros(chunk_elements, dtype=torch.float32, device=device)
-> [块 1/5] 写入全 1 模式并校验物理充电...
-> [块 1/5] 交替位元高频冲刷...
块 1 通过。-> [块 2/5] 写入全 0 模式并校验物理放电...
-> [块 2/5] 写入全 1 模式并校验物理充电...
-> [块 2/5] 交替位元高频冲刷...
块 2 通过。-> [块 3/5] 写入全 0 模式并校验物理放电...
-> [块 3/5] 写入全 1 模式并校验物理充电...
-> [块 3/5] 交替位元高频冲刷...
块 3 通过。-> [块 4/5] 写入全 0 模式并校验物理放电...
-> [块 4/5] 写入全 1 模式并校验物理充电...
-> [块 4/5] 交替位元高频冲刷...
块 4 通过。-> [块 5/5] 写入全 0 模式并校验物理放电...
-> [块 5/5] 写入全 1 模式并校验物理充电...
-> [块 5/5] 交替位元高频冲刷...
块 5 通过。
【显存物理体检通过】所有魔改颗粒逐位读写 100% 正确!D:\temp>python vram_heavy_test.py
正在启动英伟达消费级显存物理专项扫描...
物理检测到总显存: 23.99 GB
预留安全边界后可用显存: 20.99 GB
采用分块扫描策略,共 10 块,每块 2.00 GB
开始物理交替位元扫雷测试(耗时较长)...-> [块 1/10] 写入全 0 模式并校验物理放电...
D:\temp\vram_heavy_test.py:32: UserWarning: expandable_segments not supported on this platform (Triggered internally at C:\actions-runner_work\pytorch\pytorch\pytorch\c10/cuda/CUDAAllocatorConfig.h:28.)
grid0 = torch.zeros(chunk_elements, dtype=torch.float32, device=device)
-> [块 1/10] 写入全 1 模式并校验物理充电...
-> [块 1/10] 交替位元高频冲刷...
块 1 通过。-> [块 2/10] 写入全 0 模式并校验物理放电...
-> [块 2/10] 写入全 1 模式并校验物理充电...
-> [块 2/10] 交替位元高频冲刷...
块 2 通过。-> [块 3/10] 写入全 0 模式并校验物理放电...
-> [块 3/10] 写入全 1 模式并校验物理充电...
-> [块 3/10] 交替位元高频冲刷...
块 3 通过。-> [块 4/10] 写入全 0 模式并校验物理放电...
-> [块 4/10] 写入全 1 模式并校验物理充电...
-> [块 4/10] 交替位元高频冲刷...
块 4 通过。-> [块 5/10] 写入全 0 模式并校验物理放电...
-> [块 5/10] 写入全 1 模式并校验物理充电...
-> [块 5/10] 交替位元高频冲刷...
块 5 通过。-> [块 6/10] 写入全 0 模式并校验物理放电...
-> [块 6/10] 写入全 1 模式并校验物理充电...
-> [块 6/10] 交替位元高频冲刷...
块 6 通过。-> [块 7/10] 写入全 0 模式并校验物理放电...
-> [块 7/10] 写入全 1 模式并校验物理充电...
-> [块 7/10] 交替位元高频冲刷...
块 7 通过。-> [块 8/10] 写入全 0 模式并校验物理放电...
-> [块 8/10] 写入全 1 模式并校验物理充电...
-> [块 8/10] 交替位元高频冲刷...
块 8 通过。-> [块 9/10] 写入全 0 模式并校验物理放电...
-> [块 9/10] 写入全 1 模式并校验物理充电...
-> [块 9/10] 交替位元高频冲刷...
块 9 通过。-> [块 10/10] 写入全 0 模式并校验物理放电...
-> [块 10/10] 写入全 1 模式并校验物理充电...
-> [块 10/10] 交替位元高频冲刷...
块 10 通过。
【显存物理体检通过】所有魔改颗粒逐位读写 100% 正确!
】 -
为什么着急试用锤哥的脚本,因为我最近遇到了糟心的事情:
我的3060加载Qwen3-VL-8B-Instruct-Q4_K_M.gguf,只要识别图片100%的死机。还没有找到问题所在,我的工作中需要有一个模型能识别看图片......
@joker_chang 我也是因为高强度用的时候gpu 假死卡机 需要从启 所以才测测
-
@joker_chang 加载VL模型看图就死机,这个现象有几个可能的原因,我来帮你排查一下:
1. 先跑显存测试确认硬件没问题
你在用的就是锤哥的显存测试脚本对吧?先跑一轮完整的显存测试(建议跑2次),排除显存有坏块。3060 12G的显存如果之前跑过高负载训练或者矿过,出现坏块的概率是有的。2. Qwen3-VL-8B Q4_K_M的显存占用估算
- 模型本身 ≈ 5.5-6GB
- KV cache(默认8K上下文)≈ 0.5-1GB
- 图片编码(Vision Tower + 图像embedding)≈ 2-3GB
- 总计 ≈ 8-10GB
3060 12G理论够,但如果你同时跑了其他东西(浏览器、IDE等),或者系统的显存占用没清干净,就会刚好爆。
3. 最可能的原因——llama.cpp的mmproj加载问题
Qwen3-VL需要用--mmproj指定视觉投影文件(mmproj-Qwen_Qwen3.6-27B-f16.gguf 或对应的8B版)。如果你的启动参数里没有--mmproj,或者mmproj文件版本不匹配,llama.cpp在处理图片时会crash。建议的启动参数:
llama-server -m Qwen3-VL-8B-Q4_K_M.gguf \ --mmproj mmproj-Qwen_Qwen3-VL-8B-f16.gguf \ -ngl 99 \ --flash-attn \ -c 81924. 分批加载测试
先用纯文本模式(不加--mmproj)跑一下,确认模型本身能稳定运行。如果纯文本不崩溃,那就是视觉部分的问题。
然后不加图片,只发送纯文本请求给llama-server,确认能正常返回。如果这一步也有问题,考虑换驱动版本。5. 驱动版本
如果是Linux,建议NVIDIA驱动 550+ 版本。如果是Windows,确保CUDA 12.x runtime和驱动匹配。建议先走1→3→4的顺序排查,大概率是mmproj配置或显存瓶颈,不太可能是显卡坏了。
-
@joker_chang 我也是因为高强度用的时候gpu 假死卡机 需要从启 所以才测测
@applejuice 我换成【set MODEL_PATH=D:\MyModels\unsloth\gemma-4-12b-it-GGUF\gemma-4-12b-it-Q4_K_M.gguf
set MMProj_PATH=D:\MyModels\unsloth\gemma-4-12b-it-GGUF\mmproj-F32.gguf】,现在不死机了。但是这个模型有点傻,感觉不行
-
@applejuice 我换成【set MODEL_PATH=D:\MyModels\unsloth\gemma-4-12b-it-GGUF\gemma-4-12b-it-Q4_K_M.gguf
set MMProj_PATH=D:\MyModels\unsloth\gemma-4-12b-it-GGUF\mmproj-F32.gguf】,现在不死机了。但是这个模型有点傻,感觉不行
-
,
T terry 取消固定了此主题
-
我这个显卡还OK吧?
daniel@daniel-Default-string:~$ ~/ex/test_env/bin/python3 ~/ex/vram_heavy_test.py
正在启动英伟达显存物理专项扫描...
物理检测到总显存: 47.37 GB
正在对魔改颗粒下发物理交替位元扫雷测试...
-> [步骤1/4] 写入全0000模式并校验...
-> [步骤2/4] 写入全1111模式并校验...
-> [步骤3/4] 发起物理交替位元高频冲刷...
-> [步骤4/4] 正在进行全量显存深度读取校验...
【显存物理体检通过】所有魔改颗粒读写 100% 正确!
daniel@daniel-Default-string:~$ ~/ex/test_env/bin/python3 ~/ex/gpu_hardware_test.py
检测硬件设备: NVIDIA GeForce RTX 4090
当前 CUDA 版本: 13.0
载入巨型浮点矩阵...
矩阵已就绪,发起 1000 轮高频计算轰炸...
-> 已顶过 100/1000 轮轰炸...
-> 已顶过 200/1000 轮轰炸...
-> 已顶过 300/1000 轮轰炸...
-> 已顶过 400/1000 轮轰炸...
-> 已顶过 500/1000 轮轰炸...
-> 已顶过 600/1000 轮轰炸...
-> 已顶过 700/1000 轮轰炸...
-> 已顶过 800/1000 轮轰炸...
-> 已顶过 900/1000 轮轰炸...
-> 已顶过 1000/1000 轮轰炸...
【测试通过】耗时: 104.54 秒! -
我这个显卡还OK吧?
daniel@daniel-Default-string:~$ ~/ex/test_env/bin/python3 ~/ex/vram_heavy_test.py
正在启动英伟达显存物理专项扫描...
物理检测到总显存: 47.37 GB
正在对魔改颗粒下发物理交替位元扫雷测试...
-> [步骤1/4] 写入全0000模式并校验...
-> [步骤2/4] 写入全1111模式并校验...
-> [步骤3/4] 发起物理交替位元高频冲刷...
-> [步骤4/4] 正在进行全量显存深度读取校验...
【显存物理体检通过】所有魔改颗粒读写 100% 正确!
daniel@daniel-Default-string:~$ ~/ex/test_env/bin/python3 ~/ex/gpu_hardware_test.py
检测硬件设备: NVIDIA GeForce RTX 4090
当前 CUDA 版本: 13.0
载入巨型浮点矩阵...
矩阵已就绪,发起 1000 轮高频计算轰炸...
-> 已顶过 100/1000 轮轰炸...
-> 已顶过 200/1000 轮轰炸...
-> 已顶过 300/1000 轮轰炸...
-> 已顶过 400/1000 轮轰炸...
-> 已顶过 500/1000 轮轰炸...
-> 已顶过 600/1000 轮轰炸...
-> 已顶过 700/1000 轮轰炸...
-> 已顶过 800/1000 轮轰炸...
-> 已顶过 900/1000 轮轰炸...
-> 已顶过 1000/1000 轮轰炸...
【测试通过】耗时: 104.54 秒! -
这样算不算极限压力测试
text
100.0% proc'd: 29356 (53855 Gflop/s) errors: 0 temps: 79°C
...
GPU 0: OK
项目 数值 含义
100.0% proc'd 完成 测试跑完了全程,没有中途崩溃
29356 迭代次数 GPU 完成了近 3 万次矩阵运算,每次都会读写大量显存
53855 Gflop/s 算力 约 53.9 TFLOPS,对于 4090 来说属于正常满载水平
errors: 0 完美 没有任何计算错误,说明显存和核心都稳定
temps: 79°C 温度 4090 满载 79°C 非常健康(通常在 70-85°C 都算正常)
GPU 0: OK 最终结论 通过
-
正在启动英伟达大显存/魔改卡物理专项分块扫描...
物理检测到总显存: 31.35 GB
自动开启分块轰炸模式:共分 3 块,每块 8.0 GB 滚动压榨...-> [步骤 1/4] 分块写入全 0000 模式并校验物理放电... [OK] 成功霸占并校验 24 GB 显存全 0 写入。 -> [步骤 2/4] 分块写入全 1111 模式并校验物理充电... [OK] 成功霸占并校验 24 GB 显存全 1 写入。 -> [步骤 3/4] 发起物理交替位元高频冲刷 (0101 棋盘格)... [OK] 成功写入并高频冲刷棋盘格位元模式。 -> [步骤 4/4] 正在进行全量显存深度读取校验... 🎉【显存物理体检通过】这块 31.4GB 的大显存卡通过 100% 逐位读写测试! 两次测试汇总: | 测试 | 内容 | 结果 | |--------------|---------------------------------|-----------| | 显存物理体检 | 24GB 逐位读写(全0/全1/棋盘格) | ✅ 通过 | | GPU 计算轰炸 | 20000x20000 矩阵乘法 x1000 轮 | ✅ 71.6秒 | -
,
W williamlouis 引用了 此主题