CUDA 驱动和运行时兼容性

分层架构与核心概念

cuda rt

1. CUDA 运行时 API 层

技术定位

  1. 功能范围:为开发人员提供高层次的抽象接口,封装核心 GPU 操作(内存分配、流管理、内核启动等)
  2. 版本绑定:由构建时使用的 CUDA 工具包版本决定(例如,CUDA 12.0.1)

版本检测方法

# Python 环境检测(推荐优先方法)
pip list | grep cuda
conda list |grep cuda 
# 示例输出: cu121  # cu121 表示 CUDA 12.1 环境

# 系统级运行时库检测
find / -name "libcudart*"
# cudart 表示 CUDA 运行时
# 示例输出:
/usr/local/cuda-12.4/targets/x86_64-linux/lib/libcudart.so.12
/usr/local/cuda-12.4/targets/x86_64-linux/lib/libcudart.so.12.4.127
表示 CUDA 12.4

如果发现多个库版本,您应该检查您的程序使用了哪个版本,例如 PATH、LD_LIBRARY_PATH 或其他程序设置

env |grep PATH
# 示例输出:
LIBRARY_PATH=/usr/local/cuda/lib64/stubs
LD_LIBRARY_PATH=/usr/local/nvidia/lib:/usr/local/nvidia/lib64
PATH=/go/bin:/usr/local/go/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# 这意味着您的 CUDA 程序按照库路径顺序使用了第一个库

2. CUDA 驱动 API 层

技术定位

  1. 功能范围:直接与 GPU 硬件交互的低层接口,处理指令转换和硬件资源调度
  2. 版本绑定:由 NVIDIA 驱动版本决定,遵循 SemVer 规范

版本检测方法

nvidia-smi
# 示例输出:
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.144.03             驱动版本: 550.144.03     CUDA 版本: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  名称                 持续性-M | 总线-ID          显示.A | 易失性未校正 ECC |
| 风扇  温度   性能          功率:使用/容量 |           内存使用 | GPU-利用率  计算 M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA A30                     关闭 |   00000000:00:0B.0 关闭 |                    0 |
| N/A   31C    P0             28W /  165W |   10195MiB /  24576MiB |      0%      默认 |
|                                         |                        |             禁用 |
+-----------------------------------------+------------------------+----------------------+

版本兼容性矩阵与约束

物理 GPU 部署 - 核心兼容性原则

首先参考 NVIDIA 的官方声明,基础约束

  1. 驱动版本必须始终 ≥ 运行时版本
  2. NVIDIA 官方保证 向后兼容 1 个主版本(例如,CUDA 驱动 12.x 支持运行时 11.x)
  3. 跨两个主版本的兼容性(例如,驱动 12.x 与运行时 10.x)既不被官方支持,也不推荐

当您部署 CUDA 程序时,请遵守基础约束

正式规则

+ 强制:驱动版本 ≥ 运行时版本
+ 推荐:驱动主版本 - 运行时主版本 ≤ 1
- 被阻止:驱动版本 < 运行时版本 → 可能触发 CUDA_ERROR_UNKNOWN(999)
- 不稳定:驱动主版本 - 运行时主版本 > 1 → 应用程序可能故障

虚拟化场景增强(HAMI/GPU-Manager)

当使用像 GPU-Manager 或 HAMI 的虚拟 GPU 解决方案时,除了上述基础约束外,您还必须遵守 附加约束

版本要求

1. 虚拟 GPU 解决方案基线版本 ≥ 运行时版本
2. 运行时主版本 = 驱动主版本 = 基线主版本

GPU-Manager 特别说明: 我们实现了部分跨 1 主版本兼容性(例如,基线 12.4 支持 vLLM 11.8)。然而,这需要每个应用程序的钩子调整,必须逐个分析。

部署最佳实践

推荐策略

• 在新的 GPU 集群规划中为驱动和运行时采用较新的 CUDA 版本(例如,CUDA 12.x)

传统系统的替代解决方案

1. 物理 GPU 调度或 GPU-Manager 整卡分配

整卡调度提供原生兼容性,相当于物理 GPU 访问 当您将 tencent.com/vcuda-core 设置为 100 的正整数时,GPU-Manager 可以使用整卡模式,例如 100、200、300

resources:
  limits:
    tencent.com/vcuda-core: "100"

2. 节点标记策略

根据支持的驱动 CUDA 版本对节点进行标记:

node_labels:
  cuda-major-version: "12"
  cuda-minor-version: "4"

这意味着您的节点是 CUDA 12.4

在部署中配置调度亲和性: 您可以根据程序的 CUDA 运行时需求设置 cuda-major-version 和 cuda-minor-version

apiVersion: apps/v1
kind: Deployment
metadata:
  name: cuda-app
spec:
  template:
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: cuda-major-version
                operator: In
                values: ["12"]
              - key: cuda-minor-version
                operator: Gt
                values: ["2"]

3. 运行时版本升级

传统的 CUDA 运行时可能存在安全漏洞(CVEs),并缺乏对新 GPU 功能的支持。应优先升级到 CUDA 12.x。

NVIDIA 建议同时升级 upgrade both

故障排除手册

常见错误代码

错误代码描述推荐的操作
CUDA_ERROR_INVALID_IMAGE驱动-运行时不兼容使驱动版本与容器 CUDA 版本对齐
CUDA_ERROR_ILLEGAL_ADDRESS虚拟内存违规(常见于版本不匹配)验证运行时与基线约束
CUDA_ERROR_UNSUPPORTED_PTX_VERSIONPTX 指令集不匹配使用显式 -arch=sm_xx 重新编译