这个错误表明 CUDA 设备(GPU)无法执行当前的 PyTorch 操作,通常是因为 PyTorch 版本与 CUDA 驱动不兼容,或者 GPU 计算能力不被支持。以下是详细的解决方法:
1. 检查 CUDA 和 PyTorch 兼容性
(1) 确认 CUDA 驱动版本
在终端运行:
nvidia-smi # 查看 CUDA 驱动版本(右上角显示的版本)
输出示例:
这里 CUDA Version: 12.4
表示 驱动支持的 CUDA 最高版本(但不一定是实际安装的 CUDA Toolkit 版本)。
(2) 检查 PyTorch 的 CUDA 支持
在 Python 中运行:
import torch
print(f"PyTorch 版本: {torch.__version__}")
print(f"CUDA 是否可用: {torch.cuda.is_available()}")
print(f"CUDA 版本: {torch.version.cuda}")
print(f"GPU 设备: {torch.cuda.get_device_name(0)}")
输出示例:
PyTorch 版本: 2.0.1+cu117
CUDA 是否可用: True
CUDA 版本: 11.7
GPU 设备: NVIDIA GeForce RTX 3090
- 如果
CUDA 是否可用: False
,说明 PyTorch 没有正确识别 GPU。 - 如果
CUDA 版本
与nvidia-smi
显示的版本不一致,可能导致兼容性问题。
2. 解决方法
(1) 确保 PyTorch 与 CUDA 版本匹配
PyTorch 官方提供了不同 CUDA 版本的安装命令:
👉 PyTorch 安装指南
CUDA 版本 | PyTorch 安装命令 |
---|---|
CUDA 11.7 | pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117 |
CUDA 11.8 | pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 |
CUDA 12.1 | pip install torch torchvision torchaudio |
建议:
-
如果
nvidia-smi
显示CUDA 11.7
,但 PyTorch 安装的是cu118
,则需重新安装匹配的版本:pip uninstall torch torchvision torchaudio pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
(2) 检查 GPU 计算能力
某些 GPU(如较新的 RTX 40 系列)需要 PyTorch 2.0+ 才能支持。运行:
import torch
print(f"GPU 计算能力: {torch.cuda.get_device_capability(0)}")
-
如果输出
(8, 6)
(如 RTX 3060)或(9, 0)
(如 RTX 4090),需确保 PyTorch ≥ 2.0。 -
如果 PyTorch 版本太旧(如 1.x),升级:
pip install --upgrade torch torchvision torchaudio
(3) 临时解决方案:强制使用 CPU
如果问题仍未解决,可以临时用 CPU 运行:
device = torch.device("cpu") # 强制使用 CPU
real_batch = next(iter(dataloader)).to(device) # 数据移到 CPU
3. 验证修复
重新运行代码:
import torch
import torchvision.utils as vutils
import matplotlib.pyplot as plt
import numpy as np
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
real_batch = next(iter(dataloader)).to(device) # 确保数据在 GPU 上
plt.figure(figsize=(8, 8))
plt.axis("off")
plt.title("Training Images")
plt.imshow(
np.transpose(
vutils.make_grid(real_batch[0][:24], padding=2, normalize=True).cpu(),
(1, 2, 0)
)
)
plt.show()
如果仍然报错,尝试:
CUDA_LAUNCH_BLOCKING=1 python your_script.py # 强制同步 CUDA 错误报告
总结
问题 | 解决方案 |
---|---|
CUDA error: no kernel image | PyTorch 与 CUDA 版本不匹配 |
PyTorch 无法识别 GPU | 重新安装匹配版本的 PyTorch |
GPU 计算能力太新 | 升级 PyTorch 到 2.0+ |
临时绕过问题 | 使用 device="cpu" |
如果仍有问题,请提供:
nvidia-smi
输出torch.__version__
和torch.version.cuda
- 你的 GPU 型号(如 RTX 3090)
my结果:PyTorch 版本: 1.9.1+cu102 CUDA 是否可用: True CUDA 版本: 10.2 GPU 设备: NVIDIA GeForce RTX 4090
环境存在 PyTorch 1.9.1 + CUDA 10.2 与 RTX 4090(计算能力 8.9)不兼容 的问题。RTX 4090 需要 PyTorch 2.0+ 和 CUDA 11.8/12.x 才能支持。以下是解决方案:
1. 卸载旧版 PyTorch
pip uninstall torch torchvision torchaudio -y
2. 安装 PyTorch 2.0+(适配 RTX 4090)
选择以下任一命令安装(推荐 CUDA 11.8 或 12.1):
# CUDA 11.8(稳定推荐)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1(最新)
pip install torch torchvision torchaudio
3. 验证安装
import torch
print(f"PyTorch 版本: {torch.__version__}") # 应 ≥ 2.0.0
print(f"CUDA 可用: {torch.cuda.is_available()}") # 应为 True
print(f"GPU 设备: {torch.cuda.get_device_name(0)}") # 应正确显示 RTX 4090
4. 关键检查点
项目 | 要求 |
---|---|
PyTorch 版本 | ≥ 2.0.0 |
CUDA 版本 | 11.8 或 12.1 |
GPU 计算能力 | RTX 4090 需 8.9(PyTorch 2.0+ 已支持) |
5. 如果问题仍未解决
(1) 检查 NVIDIA 驱动
nvidia-smi # 确保驱动版本 ≥ 525.60.13(CUDA 12.x 需要)
-
如果驱动太旧,升级:
sudo apt-get install nvidia-driver-535 # Ubuntu
(2) 强制使用 CUDA 11.8
如果 CUDA 12.1 有问题,改用 11.8:
pip install torch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 --index-url https://download.pytorch.org/whl/cu118
(3) 临时回退到 CPU
device = torch.device("cpu") # 强制使用 CPU(仅调试用)
6. 最终代码修正
确保数据在 GPU 上:
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
real_batch = next(iter(dataloader)).to(device) # 数据移至 GPU
# 绘图代码(确保已 import matplotlib)
plt.figure(figsize=(8, 8))
plt.imshow(np.transpose(
torchvision.utils.make_grid(real_batch[0][:24],
padding=2,
normalize=True
).cpu(), (1, 2, 0)))
plt.axis("off")
plt.show()
总结
- 根本原因:RTX 4090 需要 PyTorch 2.0+ 和 CUDA ≥ 11.8。
- 解决方案:升级 PyTorch 和 CUDA 版本。
- 验证:运行
torch.cuda.is_available()
确认 GPU 可用。
升级后问题应解决!如果仍有报错,请提供 nvidia-smi
和 torch.__version__
的完整输出。