原帖看到 nvidia-smi 显示 CUDA 10.1、Conda 运行库 10.2,又收到 driver too old:
AssertionError: The NVIDIA driver on your system is too old
先把数字归到正确层级
原题驱动 430、Conda 的 CUDA 10.2 运行库与内部输出 10010/10020,指向不同层。这里真正需要核对的是“当前驱动是否支持 torch 所用 CUDA 构建”,不是让所有显示都变成相同的字符串。私有 _C 接口的编码也不适合作为长期诊断 API。
这些数字描述不同层次,不能要求它们完全相等。nvidia-smi 的 CUDA 字段反映驱动支持能力;torch.version.cuda 表示当前 torch 构建使用的 CUDA 版本;nvcc 则是本机编译工具链。
先检查发生错误的环境:
import sys
import torch
print("josh050608")
print("python:", sys.executable)
print("torch/CUDA:", torch.__version__, torch.version.cuda)
print("available:", torch.cuda.is_available())
在相同机器的终端运行 nvidia-smi,记录驱动完整版本和 GPU 型号。若是在容器中,还要与宿主机驱动核对;不要只看容器里安装的 cudatoolkit。原帖提到的 10010、10020 是历史内部接口输出,不建议继续依赖私有 _C 接口判断安装。
若驱动不满足该 CUDA 构建的要求,可在硬件与系统支持范围内升级驱动并重启,或选取官方历史安装页中与现有驱动兼容的 torch/CUDA 组合。先核对 NVIDIA 对相应 CUDA 版本的兼容要求,不要把所有 CUDA 版本都按一个最低驱动号处理。
更新 Conda 里的运行库不会自动更新系统 NVIDIA 驱动;安装 nvcc 也不是这条报错的直接修复。新旧包混用时,优先在独立环境验证组合。
修复后重启 Python,再检查可用性并真正创建一个 CUDA 张量、执行一次小矩阵乘法。只看到 nvidia-smi 能列出 GPU,还不能证明当前 torch 已经能够运行。
一张表避免反复重装错层
| 信息 | 从哪里看 | 用来判断什么 |
|---|---|---|
| 驱动版本、GPU 型号 | 宿主机 nvidia-smi | 驱动是否满足该构建和硬件要求 |
| torch 的 CUDA 构建 | torch.version.cuda |
当前包用了哪条运行库系列 |
| 本地工具链 | nvcc --version |
自编译扩展是否有适配的编译器 |
| CUDA 可用性 | torch.cuda.is_available() |
当前进程是否能使用 CUDA |
若需要升级驱动,按系统支持方式处理并重启,再打开新的 Python 进程;旧进程不应拿来验证已更换的驱动。若不能升级驱动,则按官方历史安装组合选择能兼容现有环境的构建,同时检查 GPU 架构支持,不能只比较 CUDA 版本大小。
下面是环境修复后的实际计算检查,需要 CUDA 可用。它与版本打印分开,避免把“能读取元数据”当成“能执行算子”:
import torch
if not torch.cuda.is_available():
raise RuntimeError("CUDA 仍不可用,先保留驱动与构建信息")
x = torch.tensor([[1., 2.], [3., 4.]], device="cuda")
y = x @ x
torch.cuda.synchronize()
assert torch.allclose(y.cpu(), torch.tensor([[7., 10.], [15., 22.]]))
print("CUDA computation:", y.device, torch.cuda.get_device_name(0))
容器用户应在宿主机与容器内分别记录设备可见性。容器里的 Toolkit 或 Conda 运行库不会更新宿主机驱动;在 Notebook 安装另一套运行库也不会改变这件事。原题的历史驱动关系应按相应 CUDA 发行资料核对,不能用当前版本的最低要求倒推全部旧版本。
参考:原始求助帖;技术依据:PyTorch CUDA 语义(2.5)、NVIDIA CUDA 版本兼容性、PyTorch 历史安装组合。