AI概念与词典

CUDA 兼容性怎么查?驱动、Toolkit、PyTorch 与容器诊断指南

分清GPU、驱动、Toolkit、Runtime、PyTorch构建与容器映射,使用四十项检查、只读审查器和回滚路径诊断CUDA兼容问题。

cuda stack gates
本页目录
  1. 先纠正最常见误区:nvidia-smi 不是 Toolkit 版本
  2. 一分钟采集:先生成事实,不要先重装
  3. 四十项兼容性与迁移检查
  4. 二十个常见现场症状怎么分层处理
  5. 按部署形态执行:从开发机到集群的运维剧本
  6. 个人开发机的最小方案
  7. 团队共享工作站的最小方案
  8. Kubernetes GPU 节点的最小方案
  9. 离线或受限网络环境
  10. 从源码编译框架
  11. 使用第三方 CUDA 扩展
  12. 做性能基准的公平口径
  13. 做稳定性测试的口径
  14. 供应链与来源核验
  15. 版本台账如何长期维护
  16. 什么时候应停止排错并回滚
  17. 独立任务资产:只读兼容性证据审查器
  18. 怎样从错误回到可验证状态
  19. 怎样决定“升级驱动”还是“更换框架包”
  20. 怎样给“不完全兼容但可运行”写结论
  21. 哪些证据能证明什么
  22. 站内下一步

直接答案:CUDA 兼容性不能用一个“CUDA 版本”判断。必须同时确认 GPU 架构、宿主驱动、应用实际加载的用户态库、框架二进制的构建标签、容器映射、自定义扩展和真实工作负载。最可靠的顺序是先识别任务,再采集分层证据,运行最小框架与编译探针,最后用代表性算子和回滚演练放行。

本文于 2026-09-27 复核 NVIDIA CUDA Compatibility、CUDA 13.4 Release Notes、Linux Installation Guide、Container Toolkit 与 PyTorch 官方安装入口。文中的命令是证据采集示例,不会替你修改驱动;任何版本表都应在实施当天回到官方页面复核。

CUDA 兼容性从 GPU、驱动、用户态库、Runtime、框架到算子的六层证据
兰塞 AI 原创分层图:同一台机器可以同时出现多个“CUDA 版本”,它们回答的问题不同。

先纠正最常见误区:nvidia-smi 不是 Toolkit 版本

nvidia-smi 顶部显示的 CUDA Version 表示当前驱动可支持的 CUDA 驱动 API 上限;nvcc --version 显示当前 PATH 找到的 Toolkit 编译器;torch.version.cuda 表示 PyTorch 二进制构建时绑定的 CUDA 运行时家族。三个值可以不同,差异本身不等于故障。

NVIDIA 官方兼容文档区分向后兼容、小版本兼容和 forward compatibility。CUDA 11 之后,同一大版本族可在满足最低驱动的前提下使用小版本兼容,但新功能、PTX 与目标架构仍有限制。CUDA 13.4 的 Linux 安装文档还明确将 Toolkit 与驱动独立安装和版本化。因此,先问“应用实际用了哪一层”,再判断需要升级什么。

对应的一手入口是 CUDA Compatibility、Minor Version Compatibility、CUDA Toolkit Release Notes、Linux Installation Guide、NVIDIA Container Toolkit与 PyTorch Start Locally。它们分别提供厂商支持范围,但不替目标主机完成安装和业务验收。

NVIDIA CUDA Compatibility 官方文档展示驱动与 CUDA 运行时兼容路径
来源:NVIDIA CUDA Compatibility 官方文档,截取兼容路径必要区域,访问日期 2026-09-27。官方展示不等于本站在你的 GPU 上实测。

一分钟采集:先生成事实,不要先重装

nvidia-smi
which nvcc || where nvcc
nvcc --version
python -c "import json, torch; print(json.dumps({'torch':torch.__version__,'built_cuda':torch.version.cuda,'available':torch.cuda.is_available(),'devices':torch.cuda.device_count()}, ensure_ascii=False))"
python -m pip freeze

容器环境还要保存镜像摘要、宿主驱动和容器内动态库路径。采集结果只用于定位;只有目标算子、模型和负载在正确性、性能与恢复门槛上通过,才构成上线证据。

CUDA 故障从设备、驱动、进程环境、框架到最小任务的诊断路径
兰塞 AI 原创诊断图:先缩小故障层,再决定是否需要版本变更。

四十项兼容性与迁移检查

下面每一项都对应独立故障面。执行时填写证据位置、负责人、结论和复查日期;不能用另一项通过替代。

检查项 为什么重要、怎样判断 最低证据
1. 业务任务与验收边界 先写清楚要运行的是现成 PyTorch wheel、自编译 CUDA 扩展、C++ 应用、容器化推理还是多机训练。不同任务依赖的层次不同:只运行预编译 wheel 往往不需要宿主机完整 Toolkit,而编译自定义扩展通常需要编译器、头文件和与框架匹配的开发环境。把任务写成输入、命令、期望输出、允许误差和失败条件,后续每条版本结论才有对象。 版本/命令输出/负责人/结论
2. GPU 型号与计算能力 记录完整 GPU 型号、显存、计算能力和数量,不用“RTX 显卡”或“数据中心卡”代替。预编译包可能没有包含旧架构代码,新架构也可能需要更新的编译器或库。若错误只出现在一类 GPU,应比较内核目标、算子支持和架构特性,而不是立刻重装全部软件。采购前还应核对目标框架对该 GPU 与操作系统的支持范围。 版本/命令输出/负责人/结论
3. 宿主驱动的真实版本 用系统包管理器和 nvidia-smi 交叉确认驱动包与实际加载的内核模块,重启前后二者可能不同。nvidia-smi 顶部的 CUDA Version 表示该驱动可支持到的 CUDA 驱动 API 上限,不是当前 Python 环境安装的 Toolkit,也不是 PyTorch wheel 的构建版本。诊断记录应保存驱动版本、内核版本、启动时间和命令输出。 版本/命令输出/负责人/结论
4. Toolkit 与 Runtime 分层 CUDA Toolkit 包含 nvcc、头文件、调试工具和开发库;应用运行时可能由 wheel、Conda 包、容器镜像或系统目录提供。不要因为 /usr/local/cuda 存在就断言进程使用它。应从目标进程查询框架构建版本、动态库解析路径和实际加载文件,再判断是否存在混装。编译时依赖和运行时依赖要分别记录。 版本/命令输出/负责人/结论
5. 框架二进制的构建标签 PyTorch、TensorFlow、JAX 等框架通常发布针对特定 CUDA 运行时构建的二进制包。选择安装命令时以官方选择器和发行说明为准,并保存包名、版本、索引来源与哈希。框架显示的 CUDA 版本说明它的构建依赖,不等于本机 nvcc 版本;torch.cuda.is_available 返回真也只证明基本初始化成功,不证明所有算子、扩展和负载都兼容。 版本/命令输出/负责人/结论
6. 计算能力与编译目标 自编译代码要明确生成哪些 SASS 架构和是否保留 PTX。只为开发机架构编译的扩展换到其他 GPU 可能出现 no kernel image 或重新 JIT。为过多架构生成代码会增加构建时间与体积。应根据实际部署 GPU 生成明确目标,保存构建日志,并在每类 GPU 上运行代表性算子与边界输入。 版本/命令输出/负责人/结论
7. 向后兼容的准确含义 较新的 NVIDIA 驱动通常能运行针对较旧 CUDA Toolkit 构建的应用,这是常见的向后兼容路径。但它不意味着任意旧框架能支持新 GPU,也不保证第三方扩展、cuDNN、NCCL 或编译器组合有效。结论必须落到具体应用二进制、最低驱动、目标架构和依赖库,不能把“新驱动兼容旧 CUDA”扩展成所有组合通用。 版本/命令输出/负责人/结论
8. 小版本兼容的三个限制 CUDA 11 之后同一大版本族可在满足最低驱动时使用小版本兼容,但官方明确提示功能受限、依赖 PTX 的应用可能失败,并要求使用合适的目标架构参数。遇到 cudaErrorCallRequiresNewerDriver 时,不应通过隐藏错误继续运行;要识别应用是否调用新驱动能力、是否包含 PTX JIT,再决定升级驱动或调整构建。 版本/命令输出/负责人/结论
9. Forward Compatibility 不是默认捷径 跨大版本在较旧基础驱动上运行较新用户态组件,可能需要 NVIDIA 指定的 cuda-compat 包,并受 GPU、操作系统和驱动分支矩阵约束。这是数据中心升级策略的一部分,不是把任意 libcuda 文件复制进环境。使用前要核对官方矩阵、安装来源与库路径,验证设备查询和真实工作负载,并保留删除兼容包后的回滚步骤。 版本/命令输出/负责人/结论
10. 驱动与 Toolkit 独立安装 CUDA 13.4 文档已明确 Toolkit 与 Linux 驱动独立安装和版本化,cuda-toolkit 元包不再代替驱动部署。运维剧本应把驱动变更、Toolkit 变更和框架环境变更拆成不同审批项。只需要运行容器或预编译框架时,宿主机可能只需兼容驱动与容器运行时;需要本地编译时再配置相应 Toolkit。 版本/命令输出/负责人/结论
11. 安装方式不能混用 RPM/DEB、runfile、Conda、pip wheel 和容器镜像各自管理不同文件。官方 Linux 安装指南给出安装方式冲突矩阵;混用常导致旧库残留、符号链接指向意外版本或包管理器无法追踪。选择一种主要系统级方式,开发环境再使用隔离包。切换方式前按官方流程卸载冲突项,并保存包清单。 版本/命令输出/负责人/结论
12. 环境变量与符号链接 PATH、LD_LIBRARY_PATH、CUDA_HOME 和 /usr/local/cuda 符号链接可能让编译器与运行时指向不同版本。不要把全局追加多个 CUDA lib64 目录作为修复。对目标 shell、服务、容器和 Jupyter 内核分别打印变量与解析路径,确认哪一层注入。生产服务应使用显式、最小路径,并由部署配置生成而非个人 profile。 版本/命令输出/负责人/结论
13. 动态库加载证据 同名 libcudart、libcublas、libcudnn 或 libnccl 可能来自系统、wheel、Conda 或容器。使用 ldd、进程映射或框架调试信息确认真实加载位置,再把路径与包所有者写入回执。仅查看目录中文件名不能证明进程使用它。修复时优先消除重复来源,不要用复制、重命名或软链接把版本冲突暂时遮住。 版本/命令输出/负责人/结论
14. 容器只打包用户态 GPU 容器通常共享宿主机内核驱动,并通过 NVIDIA Container Toolkit 把设备和必要驱动库映射进容器。镜像内 nvidia-smi 可运行,只证明基础映射成功。还要验证 Docker/Containerd 配置、GPU 请求、设备可见性、框架初始化、目标算子和资源限制。不要在镜像中安装一套内核驱动与宿主竞争。 版本/命令输出/负责人/结论
15. 容器镜像标签与摘要 latest、devel、runtime 和 base 解决的问题不同,可变标签不能作为可复现版本。部署应记录镜像仓库、完整标签、不可变摘要、基础 CUDA 版本、框架版本和构建日期。升级前用同一工作负载比较旧摘要与新摘要,并检查镜像发行说明。运行镜像不需要编译器时优先更小的 runtime 变体,减少供应链与攻击面。 版本/命令输出/负责人/结论
16. WSL 与 Windows 边界 WSL2 的 GPU 支持依赖 Windows 主机驱动与 WSL 用户态环境,不应在 WSL 中重复安装 Linux 内核显示驱动。Windows 原生、WSL 和 Linux 容器的支持矩阵、路径与命令不同。记录问题时明确所在层、发行版、内核、主机驱动与框架安装来源;不要把某个平台的修复命令直接复制到另一个平台。 版本/命令输出/负责人/结论
17. 设备可见性与编号 CUDA_VISIBLE_DEVICES 会重排进程可见的逻辑编号,容器编排和作业调度器也可能注入过滤。报错写 GPU 0 不一定是机箱中的第一张卡。回执应同时记录物理 UUID、PCI 地址、逻辑编号和进程变量。多卡任务还要确认每个进程绑定、拓扑与通信接口,避免把调度错误当成驱动问题。 版本/命令输出/负责人/结论
18. MIG 与资源切分 启用 MIG 后,应用看到的是 GPU 实例而不是完整设备,显存、计算资源和监控指标的含义发生变化。先确认目标框架、通信库和工作负载是否支持当前 MIG 配置,再记录实例 UUID、配置与分配规则。切换 MIG 模式可能影响其他租户,应纳入维护窗口和回滚,不可在共享环境中为排错随意修改。 版本/命令输出/负责人/结论
19. cuDNN、cuBLAS 与 NCCL CUDA Runtime 可初始化不代表上层库组合正确。深度学习框架还依赖 cuDNN、cuBLAS、NCCL 等组件,它们有独立版本和兼容说明。卷积失败、矩阵乘法性能回退或分布式 hang 应分别收集库版本、算法选择、拓扑和日志。不要把所有错误都归因于 CUDA,也不要用单卡测试放行多卡训练。 版本/命令输出/负责人/结论
20. 自定义扩展的 ABI torch.utils.cpp_extension、CUDAExtension 或第三方 wheel 可能绑定编译器、PyTorch ABI、CUDA 架构和 C++ 标准库。框架升级后即使基础算子可用,旧扩展也可能导入失败或静默错误。应保存源码提交、编译命令、编译器版本、框架版本、架构目标和 wheel 哈希,并在干净环境重新构建,避免沿用未知缓存。 版本/命令输出/负责人/结论
21. JIT 与缓存 PTX JIT、Triton、torch.compile 和自定义扩展会产生缓存。缓存命中能改变首轮时延,旧缓存也可能掩盖构建问题。测试需分别记录冷启动和热启动,固定缓存目录并验证清空后的行为。多用户主机要防止缓存权限、磁盘配额和不同环境互相污染;升级后不得仅凭已有缓存运行成功就放行。 版本/命令输出/负责人/结论
22. 编译器与主机工具链 nvcc 需要受支持的主机编译器和系统头文件,开发库不完整时运行时可能正常但扩展编译失败。核对当前 Toolkit 安装指南的操作系统与编译器矩阵,记录 gcc/clang、glibc、CMake、Python 和构建系统版本。不要长期依赖 --allow-unsupported-compiler 绕过检查;若必须试验,要标注未受支持并单独隔离。 版本/命令输出/负责人/结论
23. 包管理器与虚拟环境 pip、Conda 和系统包同时提供 CUDA 相关库时,解析顺序容易变化。为每个应用保留锁文件、包来源和安装命令,使用干净环境复现。pip show 或 conda list 只说明包管理记录,还需确认动态库实际加载。修复成功后重新创建环境验证,避免把当前机器的偶然残留当作可部署方案。 版本/命令输出/负责人/结论
24. nvidia-smi 的证明边界 nvidia-smi 能证明管理工具与驱动通信,并显示设备、驱动、利用率和进程等信息;它不能证明 nvcc 已安装、框架选择了正确 wheel、目标算子正确或训练稳定。诊断流程应把它放在设备与驱动层,而不是作为最终验收。截图若缺少命令、时间和主机标识,也不足以形成可追踪回执。 版本/命令输出/负责人/结论
25. nvcc --version 的证明边界 nvcc --version 只说明当前 PATH 解析到的编译器版本,不说明驱动上限、Python 框架构建版本或应用运行时版本。没有编译任务时,机器甚至可以不安装 nvcc。需要编译扩展时,应同时保存 which nvcc、CUDA_HOME、编译日志、生成架构和加载结果,避免不同 shell 或 CI runner 使用不同工具链。 版本/命令输出/负责人/结论
26. 框架最小探针 最小探针应输出框架版本、构建 CUDA 版本、is_available、设备数、设备名称、设备能力,并在目标设备上创建张量完成一个同步算子。它比单独查看版本更接近真实路径,但仍不覆盖模型、混合精度、自定义扩展或多卡通信。探针输出要保存为 JSON,失败时保留原始异常,不要只截取最后一行。 版本/命令输出/负责人/结论
27. 最小编译探针 涉及 nvcc 或扩展时,准备一个固定的小型编译任务,记录编译命令、目标架构、链接库、产物哈希和运行输出。它用于区分开发工具链错误与框架运行时错误。探针应在干净构建目录执行,并检查警告;只要旧二进制还能运行,不代表当前源码能用当前工具链重建。 版本/命令输出/负责人/结论
28. 代表性算子探针 基础张量加法通过后,再选择业务真正依赖的卷积、注意力、稀疏算子、量化、自定义 op 或数据类型。使用固定输入和参考结果比较,不把无异常当成正确。覆盖典型、最小、最大和非对齐形状,报告容差、峰值显存和执行时间,但不在没有重复和同步的情况下声称性能提升。 版本/命令输出/负责人/结论
29. 混合精度与数值 FP32、TF32、FP16、BF16 和 FP8 对 GPU 架构、库版本与算子支持有不同要求。兼容测试必须写明 dtype、累加精度、自动混合精度配置与容差。结果出现 NaN 或漂移时先对照 FP32 基线、输入范围和损失缩放,再检查硬件支持与库算法;不要通过无限放宽容差掩盖错误。 版本/命令输出/负责人/结论
30. 显存不足不是单一版本错 OOM 可能来自模型状态、激活、KV 缓存、临时工作区、碎片、数据批次或并发。记录错误前后的已分配、保留和设备总显存,保存输入长度、batch、dtype 与进程列表。版本升级改变内核或工作区策略时,需要用相同负载比较。仅因为另一个版本不 OOM 不能证明它整体更兼容。 版本/命令输出/负责人/结论
31. 多进程与 fork CUDA 上下文与 Python multiprocessing 的启动方式有关,父进程初始化后 fork 可能导致错误。数据加载器、Web 服务和任务队列要按框架文档选择 spawn/forkserver 等方式,并控制每个进程的设备初始化。问题只在并发出现时,保存进程拓扑、启动顺序、环境变量与最小复现,避免误判为随机驱动故障。 版本/命令输出/负责人/结论
32. NCCL 通信闭环 多卡验收至少覆盖同机集合通信、跨机网络接口、超时、拓扑和故障退出。保存 NCCL 版本与调试日志,确认每个 rank 的设备和网络绑定。单卡训练成功不能放行分布式;all_reduce 成功也不证明完整训练没有死锁。若调整环境变量绕过问题,要说明性能与容错影响并形成可回滚配置。 版本/命令输出/负责人/结论
33. 权限与设备文件 Linux 上 /dev/nvidia*、容器设备映射、cgroup、SELinux/AppArmor 和作业调度权限都会影响访问。不要为排错长期使用 privileged 或放宽所有设备权限。先以最小身份复现,记录拒绝位置,再只开放必要设备与能力。服务账号、交互用户和 CI runner 应分别验证,避免管理员测试通过而生产身份失败。 版本/命令输出/负责人/结论
34. Secure Boot 与内核模块 驱动安装完成但内核模块未加载,可能与 Secure Boot 签名、内核更新或 DKMS 构建失败有关。检查模块状态、内核日志和包构建记录,不要反复安装 Toolkit。处理签名或关闭 Secure Boot 属于系统安全变更,需要组织审批、维护窗口和回滚;文章不提供绕过安全控制的通用建议。 版本/命令输出/负责人/结论
35. 云主机镜像与驱动 云平台 GPU 实例可能通过官方镜像、扩展或托管驱动提供环境。自行覆盖驱动前先确认平台支持和生命周期,否则自动更新或宿主维护可能破坏组合。记录实例类型、镜像 ID、区域、驱动来源和平台文档。云实例型号相同也可能存在不同 GPU 或网络配置,基准结果不能无条件跨实例外推。 版本/命令输出/负责人/结论
36. 升级变量控制 一次同时更换驱动、Toolkit、框架、Python、基础镜像和模型,会让成功或失败都无法归因。优先建立旧环境基线,再每次改变一个层级;确需整体升级时,至少保存中间可启动点和差异清单。每一步都运行同一探针集并保留结果,看到回退能迅速定位而不是整套回滚。 版本/命令输出/负责人/结论
37. 灰度与回滚 生产升级应先在相同 GPU 类型的小范围节点或影子任务验证,明确错误率、吞吐、时延、显存与数值门槛。保留旧镜像摘要、旧驱动包或可恢复节点、旧环境锁文件与回切步骤。驱动回滚通常需要维护窗口和重启,不能把它当作即时开关;高风险任务先停止调度再切换。 版本/命令输出/负责人/结论
38. 安全补丁与稳定性 为了兼容而长期固定旧驱动会累积安全与缺陷风险;为了追新而跳过业务回归也不可取。版本策略应同时看官方支持期、安全公告、GPU 支持、框架发行节奏和维护窗口。例外版本需要负责人、到期日和补偿控制。监控到漏洞或版本变化只是发现证据,实际影响仍需按应用可达性核验。 版本/命令输出/负责人/结论
39. 错误信息分类 把错误按设备不可见、驱动初始化、库缺失、符号不匹配、架构不支持、编译失败、算子缺失、OOM、数值错误、通信超时分类。每类对应不同证据路径。保留完整堆栈和最早错误,不只复制最后一句。搜索相同报错时必须匹配操作系统、版本、安装方式和工作负载,不能照抄旧帖命令。 版本/命令输出/负责人/结论
40. 回执最小字段 一份可复现回执至少包括主机或镜像标识、日期、GPU UUID、驱动、Toolkit/编译器、框架与构建标签、关键库、Python、容器摘要、环境变量摘要、探针版本、输入、原始输出、结论和证明边界。敏感主机名、用户名和路径可脱敏,但版本与错误上下文不能被删到失去诊断价值。 版本/命令输出/负责人/结论
41. 无法现场验证时的写法 没有目标 GPU 或生产账号时,只能整理官方兼容规则、提供采集命令和判定模板,不能声称某组合已通过。把需要读者在目标环境填写的字段留空,并明确哪些结论必须以实施当天的发行说明和真实运行结果为准。本文配套工具只解析输入与生成检查结果,不连接主机、不修改驱动,也不证明业务负载通过。 版本/命令输出/负责人/结论

二十个常见现场症状怎么分层处理

以下不是“复制即修复”的命令清单,而是从症状回到证据层的排查顺序。每个结论都要在目标环境复现。

症状 判断与下一步
1. nvidia-smi 正常,但 torch.cuda.is_available() 为 False 先确认当前 Python 与 pip/Conda 指向同一环境,再查看框架是否为 CPU 构建、动态库是否被错误路径覆盖、设备是否被 CUDA_VISIBLE_DEVICES 隐藏。保存 torch 版本、构建标签、设备数和完整异常。不要因为 nvidia-smi 正常就重装驱动,也不要从不明镜像下载同名 DLL/SO。修复后在新进程运行张量创建与同步算子。
2. nvcc 找不到,但 PyTorch GPU 可用 这通常不是矛盾:预编译 PyTorch wheel 可以携带所需用户态运行库,而 nvcc 属于开发 Toolkit。若只运行预编译模型,可记录“无本地编译需求”;若要编译扩展,再按官方安装指南部署匹配开发工具链。不要为了看到 nvcc 而给生产节点增加不需要的编译器和全局库。
3. nvcc 很新,但框架显示旧 CUDA 两个命令回答不同层级。框架构建标签来自已安装二进制,nvcc 来自当前 PATH。先判断任务是否需要编译扩展;只运行框架时,以官方 wheel、最低驱动和实际算子为准。需要编译时,核对框架支持的扩展工具链与 C++ ABI,在隔离环境生成 wheel,并用目标 GPU 做加载和结果测试。
4. 容器内看不到 GPU 先从宿主机验证驱动,再检查 NVIDIA Container Toolkit、运行时配置、启动参数、设备请求和 cgroup。记录容器引擎版本与镜像摘要。不要在容器里安装内核驱动试图修复映射,也不要永久使用 privileged。基础设备映射通过后,继续跑框架探针和代表性任务。
5. ImportError 或 undefined symbol 这类问题通常指向二进制或动态库 ABI 不匹配。保存完整符号名、导入包、ldd/依赖解析和包来源,检查系统、Conda、wheel 与自定义路径是否重复提供同名库。先在干净环境重建,再决定升级或降级。复制某个网上的 .so 到环境中会破坏包所有权和回滚。
6. no kernel image is available 优先核对 GPU 计算能力与二进制包含的架构目标。旧 wheel 可能没有新 GPU 的 SASS/PTX,自编译扩展也可能只包含开发机架构。保存设备能力、构建日志与目标列表;从受支持源码或官方新版本重建。不要通过删除错误检查继续执行,因为该内核根本没有可运行代码。
7. cudaErrorCallRequiresNewerDriver 应用调用了当前驱动不支持的功能,可能是较新 Runtime、PTX 或新特性触发。对照当前 CUDA Compatibility 与 Release Notes,确认最低驱动和小版本兼容限制。选项通常是升级驱动、使用受支持的较旧构建,或移除依赖新能力的路径;每种选择都要跑同一回归集。
8. CUDA driver version is insufficient 先记录应用实际 Runtime 与驱动,不要只看 Toolkit 目录。对照官方最低驱动表判断是否低于支持线。若是托管云或共享集群,驱动升级可能需要平台方处理;不要私自覆盖。临时切换旧框架也要确认安全、GPU 架构和模型依赖,不以“能启动”作为长期例外。
9. 训练数小时后才 OOM 采集每阶段显存、输入长度、batch、梯度累积、缓存与并发,区分稳定峰值、碎片和泄漏。固定任务重放,比较旧新环境的分配曲线。版本变更可能改变算子工作区,但也可能是数据分布或未释放引用。回退版本前先确认相同输入,避免把随机大样本误判为兼容回退。
10. 升级后速度下降但结果正确 把冷启动、JIT、autotune 和稳态执行分开计时,固定形状与同步方式,保存中位数和高分位。再用 profiler 判断变化来自内核、数据、CPU、通信还是调度。单一微基准回退不等于端到端退化,端到端改善也不能掩盖关键任务尾延迟越线。
11. 只在某一种 dtype 失败 核对 GPU 对该 dtype 的硬件支持、框架与库实现、自动混合精度和累加策略。用 FP32 参考、构造边界值和较严格诊断模式定位。记录错误是“不支持”、数值漂移还是性能异常。不能简单把输入转换为另一 dtype 而不评估精度、显存和业务效果。
12. 只在某些形状失败 保存最小失败形状、步幅、连续性、batch 与 dtype,检查对齐、越界、工作区和内核选择。用构造样本围绕边界增减维度,形成可重复测试。若只能通过固定 padding 绕过,要记录额外成本和语义影响,并继续跟踪上游修复,而不是把 workaround 当成兼容证明。
13. 单卡正常,多卡 hang 启用有界 NCCL 调试日志,记录 rank、设备 UUID、网络接口、拓扑和超时;先跑最小集合通信,再跑训练。检查进程是否绑定重复 GPU、端口与防火墙是否一致、某 rank 是否更早报错。不要只提高超时,因为真实根因可能是死锁、掉卡或网络不可达。
14. Jupyter 正常,系统服务失败 Notebook 内核和 systemd、容器或任务服务可能使用不同用户、PATH、虚拟环境、工作目录和设备权限。分别采集 which python、包列表、环境变量与动态库路径。把服务配置改为显式解释器和最小变量,在服务身份下运行探针;不要依赖交互 shell profile 隐式修复。
15. 重启后驱动或库又变了 检查内核更新、DKMS、云平台扩展、自动包更新、容器拉取策略和可变标签。版本漂移需要从供应链控制解决:锁定包源与镜像摘要、定义维护窗口、重启后自动运行探针。仅在当前会话修改环境变量不能形成可持续修复。
16. 服务器能跑,CI 编译失败 比较 CI runner 的操作系统、编译器、Toolkit、头文件、架构目标和缓存。CI 可能没有 GPU,但仍可构建包含明确目标的 wheel;运行验证必须在受控 GPU runner 完成。分离 build 与 test 产物,记录哈希,避免 CI 临时联网下载未锁定依赖。
17. 开发机能跑,生产旧 GPU 失败 开发机新 GPU 可能支持更高计算能力和新指令,生产二进制也可能缺少旧架构代码。建立部署 GPU 清单,用每类硬件执行探针。若决定停止支持旧 GPU,要把迁移、容量与回滚写入发布计划;不能让首次生产流量成为兼容性测试。
18. 官方表看似兼容,业务仍崩溃 官方表通常覆盖驱动与 Runtime 的支持关系,不包含你的所有框架、扩展、模型和负载。将故障缩小到具体库或算子,保留最小复现,并核对该组件的独立发行说明。官方兼容是必要条件之一,不是业务充分条件。
19. 临时设置 LD_LIBRARY_PATH 后恢复 这说明库解析路径可能是根因,但临时变量也可能把系统带入另一组未受控库。用 ldd 和进程映射确认具体变化,将修复落实到包与服务配置,删除重复来源,再在干净会话复测。不要把长串全局路径写进所有用户 profile。
20. 准备正式放量 冻结镜像摘要、驱动分支、框架锁文件和探针版本;在同型节点完成正确性、性能、显存、多卡与失败恢复。明确停止阈值、负责人、观测窗口和旧节点保留时间。发布后继续按版本标签监控,而不是在成功启动后删除回滚资源。

按部署形态执行:从开发机到集群的运维剧本

个人开发机的最小方案

个人开发机也要避免把所有层混在全局环境。先用官方框架安装选择器创建独立虚拟环境,确认预编译包能完成目标任务;只有编译自定义扩展时才增加 Toolkit。把项目依赖锁文件、安装命令和最小探针放进项目,但不提交机器凭据或巨大二进制。显卡驱动通过操作系统支持的方式维护,更新前保留当前驱动、框架和探针结果。若多个项目需要不同 CUDA 运行库,优先用各自环境或容器隔离,不要持续改系统级符号链接。

团队共享工作站的最小方案

共享工作站需要把宿主驱动视为公共基础设施,由明确负责人维护;项目各自使用容器或隔离环境管理框架与用户态依赖。设备分配使用调度或明确的 CUDA_VISIBLE_DEVICES,而不是口头约定。每次驱动维护前列出受影响项目与最低要求,在一台或一个时段完成 canary。公共缓存、模型目录和 JIT 目录设置配额与权限,防止一个用户的旧产物污染他人。维护完成后由不同项目运行自己的代表性探针。

Kubernetes GPU 节点的最小方案

集群中要分开管理节点镜像、驱动或 Operator、Container Toolkit、设备插件、工作负载镜像和调度标签。节点 Ready 不等于 GPU 工作负载可用;部署一个只读探针 DaemonSet 或受控 Job,输出设备 UUID、驱动、框架和算子结果。节点池升级先新建小池,使用污点与标签引导 canary,确认监控、日志、MIG 和多卡任务后再迁移。旧节点池在观察期保留,回滚通过重新调度完成,避免在线降级驱动。

离线或受限网络环境

离线环境要提前收集官方包、仓库元数据、镜像、校验值和许可证,而不是复制一台联网机器的整个环境。建立内部镜像和包仓库,记录来源、版本、哈希与批准时间。驱动、Toolkit、框架 wheel 和扩展分别归档,安装脚本只引用内部固定地址。验证时断开外网,确认不会隐式下载编译器、模型或内核。更新流程同样需要漏洞评估、canary 和回滚,不能因离线而永远冻结未知风险版本。

从源码编译框架

源码编译把问题扩大到编译器、构建选项、子模块、架构目标、依赖库和补丁。只有官方二进制不能满足架构、功能或调试需求时才值得承担。冻结源码提交与子模块,保存完整配置、环境和构建日志,产物进入内部仓库并生成 SBOM 或等价依赖清单。构建成功后先跑上游测试,再运行项目探针与基准。不得把一台开发机目录直接复制为生产发布物,也不能省略安全更新路径。

使用第三方 CUDA 扩展

FlashAttention、xFormers、自定义量化或其他扩展常有独立支持矩阵。安装前核对项目官方发行说明、框架版本、Python、编译器、GPU 架构和许可证;优先使用可信来源的版本化 wheel。运行时记录是否实际启用了扩展以及回退实现,因为某些库导入失败后会静默降级。验收既要比较输出与参考实现,也要验证扩展关闭时系统仍能工作或明确失败,避免异常时返回未经关注的慢路径。

做性能基准的公平口径

比较版本时固定输入分布、batch、并发、精度、随机性、预热、同步和测量次数。冷启动包含 JIT、模型加载和缓存建立;稳态执行则排除这些一次性成本,两者分别报告。GPU 时间不能用普通墙钟包围异步调用后直接读取,需按框架方法同步。报告中位数和高分位而非最好一次,并同时保存正确性、峰值显存、功耗或成本边界。微基准的提升只有在端到端任务也改善时才形成发布价值。

做稳定性测试的口径

稳定性不是循环同一短算子几次。按真实任务构造持续时间、并发、输入长度和数据类型,监控温度、功耗、时钟、显存、错误、掉卡与恢复。测试中主动覆盖进程重启、节点重启、容器重建和依赖服务短暂不可用。出现 Xid、ECC 或硬件告警时保留系统日志和设备 UUID,交由硬件或平台流程处理。通过稳定性测试只能证明该时间窗和负载,不代表未来永不失败。

供应链与来源核验

驱动、Toolkit、容器和 Python 包只从官方或组织批准的仓库获取,校验签名或哈希,并记录镜像摘要。搜索结果、论坛附件和网盘中的同名 DLL/SO 不可作为修复来源。依赖扫描发现漏洞后,结合实际可达性、供应商公告和补丁兼容性决定处置,不把扫描计数直接写成已被攻击。内部构建产物也要能追溯源码、构建环境与批准人,撤销时可以定位所有部署位置。

版本台账如何长期维护

把每个工作负载的 GPU 类型、驱动分支、镜像摘要、框架构建、关键扩展、负责人、探针与最后验证时间放入结构化台账。监控官方发行说明只产生候选变更,不能自动覆盖生产。每次变更关联工单、差异、测试、canary、放量与回滚回执;例外项有到期日。台账应从部署系统自动读取可验证字段,人工填写业务边界,避免只靠容易过期的文档。季度复核无人负责、长期未升级和已经退役的组合。

什么时候应停止排错并回滚

如果出现不可解释的数值错误、数据损坏、跨任务普遍回退、频繁驱动重置、无法控制的多卡 hang 或关键安全补丁冲突,应按预先阈值停止扩量。先保护数据和任务队列,再切回已验证节点或镜像;不要在生产峰值继续随机尝试包版本。回滚后仍保存失败环境的镜像、日志和最小复现供离线分析。只有根因、修复和回归都形成证据,才重新进入 canary,而不是因为暂时没再报错就直接全量。

独立任务资产:只读兼容性证据审查器

配套 review-cuda-stack.py 读取一份 JSON 证据文件,检查 GPU、驱动、框架、容器、探针和回滚字段是否齐全,并输出 insufficient_evidence 或 eligible_for_bounded_canary。它不会连接服务器、安装软件、比较最新官方矩阵,也不能证明生产兼容;结论必须与当前官方文档和真实测试共同使用。

CUDA 驱动、框架、镜像、GPU 与 Toolkit 变更的验证矩阵
兰塞 AI 原创变更矩阵:多层同时改变时,必须增加中间证据点。

怎样从错误回到可验证状态

  1. 冻结当前环境信息和完整错误,不先删除包;
  2. 用设备、驱动、框架、编译、代表算子五组探针定位层级;
  3. 建立干净环境复现,排除个人路径和旧缓存;
  4. 只改变一个版本或配置,再跑同一探针;
  5. 在小范围真实负载中比较旧基线,保存正确性、时延、显存和失败样本;
  6. 确认旧镜像、节点或环境可以恢复后再扩大。

怎样决定“升级驱动”还是“更换框架包”

先看证据落在哪一层。如果驱动低于目标框架或 Runtime 的官方最低要求,并且应用确实需要该构建,驱动升级是候选动作;但要同时核对 GPU、操作系统、云平台和其他共享工作负载。若驱动已满足要求,而错误来自 CPU 构建、错误索引或不受支持的框架 wheel,应修正框架环境,不要触碰宿主驱动。若基础框架正常,只有第三方扩展失败,应优先重建或替换扩展。若问题来自新 GPU 缺少旧二进制架构,则需选择包含目标架构的新构建。任何动作前都保存旧版本与探针,动作后用同一输入复测,不能凭版本数字更大就判定修复。

怎样给“不完全兼容但可运行”写结论

不要写成“兼容”。应明确限定为:在某日期、某 GPU、某驱动、某镜像摘要和某组输入下,哪些探针与业务任务通过;哪些功能、形状、数据类型、多卡路径或长期稳定性尚未验证;是否依赖小版本兼容、forward compatibility、回退实现或临时路径;何时复查、谁负责以及触发回滚的条件。这样读者能区分厂商支持范围、本站观察和编辑判断。只要存在未覆盖的关键路径,状态就应保持受限 canary,而不是扩大到所有生产任务。

哪些证据能证明什么

证据 能证明 不能证明
nvidia-smi 管理工具能与驱动通信、设备可见 Toolkit、框架、所有算子兼容
torch.cuda.is_available() 当前进程基本初始化成功 模型、扩展、多卡和长期稳定
最小算子通过 该输入和环境的特定路径通过 所有形状、dtype、负载和性能
官方兼容表 厂商声明的支持范围 你的安装与业务已正确
真实负载回执 限定环境、版本和时间下的观察 其他硬件或未来版本必然相同

站内下一步

需要选择 NVIDIA NIM、vLLM 与 TGI 时,可看推理栈选择与迁移指南;需要估算长上下文显存,可看KV 缓存计算与压测;需要把环境变化纳入灰度和回滚,可看AI 模型上线验收清单;需要编写 GPU 内核,可看Triton 分块编程与基准验收。

核验边界:本文没有登录你的服务器、没有修改驱动、没有跑真实模型性能测试,也不承诺任何组合必然兼容。发布日之后的驱动、Toolkit、框架、GPU 和云平台支持变化必须重新核验。