CUDA not found 排查:从 nvidia-smi 到 PyTorch 驱动链路
症状
运行推理脚本时报类似错误:
RuntimeError: CUDA error: no kernel image is available for execution on the device
CUDA kernel errors might be asynchronously reported at some other API call
CUDA not available
排查流程(按顺序)
第一步:nvidia-smi
nvidia-smi
正常输出:显卡型号、驱动版本、CUDA Version 右上角显示。
如果这条命令都跑不通:
- NVIDIA 驱动没装
- NVIDIA 驱动损坏(Windows 设备管理器里看一下)
- 系统不认 GPU(虚拟化 / WSL2 配置问题)
第二步:PyTorch 能不能看到 CUDA
import torch
print(f"PyTorch: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"CUDA version (PyTorch): {torch.version.cuda}")
正常输出:True 和一个 CUDA 版本号(如 11.7)。
如果输出 False:
第三步:PyTorch 版本和驱动版本匹配吗
关键:PyTorch 编译时的 CUDA 版本(torch.version.cuda)必须 ≤ nvidia-smi 右上角的 CUDA Version。
驱动版本和支持的 CUDA 版本:
| NVIDIA 驱动版本 | 支持的最高 CUDA |
|---|---|
| ≥ 525.60.13 | CUDA 12.0 |
| ≥ 520.56.10 | CUDA 11.8 |
| ≥ 515.43.04 | CUDA 11.7 |
| ≥ 510.47.03 | CUDA 11.6 |
| ≥ 495.29.05 | CUDA 11.5 |
检查你的 PyTorch 是用哪个 CUDA 版本装的:
pip show torch | grep -i "cu"
# 或看 pip list 里 torch 的版本号:torch==1.12.1+cu117 表示编译时用的 CUDA 11.7
不匹配示例:驱动只支持到 CUDA 11.6,但 PyTorch 是 cu117 版本 → PyTorch 看不到 CUDA。
修复:重新装匹配的 PyTorch:
# 例:驱动只支持 CUDA 11.6
pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116
第四步:其他常见原因
原因一:CUDA Toolkit 没装?
不需要单独装 CUDA Toolkit! PyTorch pip 包自带 CUDA runtime。只要驱动版本匹配就行。
很多旧教程说"装完驱动还要装 CUDA Toolkit"——这是老经验,现代 PyTorch 不需要。
原因二:conda 环境没激活
conda activate codeformer
python -c "import torch; print(torch.cuda.is_available())"
有时你在系统 Python 里装了 PyTorch(有 CUDA),但 conda 环境里没装(没有 CUDA)。每次跑推理前确认 conda activate codeformer。
原因三:WSL2 特殊情况
在 WSL2 里跑需要额外配置:
- Windows 驱动必须支持 WSL2(所有现代驱动都支持)
- WSL2 里不用装 CUDA Toolkit
nvidia-smi在 WSL2 里能跑出结果就基本 OK- PyTorch 装 CUDA 版本即可
原因四:多显卡机器
如果有多张显卡,可以指定:
CUDA_VISIBLE_DEVICES=0 python inference_codeformer.py ...
或在 Python 里:
torch.cuda.set_device(0)
快速修复清单
| 症状 | 最可能原因 | 修复 |
|---|---|---|
nvidia-smi 无输出 | 驱动没装 / 坏了 | 重装 NVIDIA 驱动 |
torch.cuda.is_available()=False | PyTorch CUDA 版本和驱动不匹配 | 重装匹配版本的 PyTorch |
| CUDA 版本号低 | 驱动过时 | 升级 NVIDIA 驱动 |
| 之前能跑现在不能 | 驱动被系统更新冲掉了 | 重装驱动 + 重连 PyTorch |
验证脚本
修好后跑一下确认:
import torch
import torch.nn as nn
# 创建一个简单的 CUDA tensor
x = torch.randn(100, 100, device='cuda')
y = x @ x # GPU 上做矩阵乘法
print("CUDA OK!矩阵乘法成功,结果 shape:", y.shape)
如果不报错误,CUDA 链路就通了。