多CUDA版本共存

Posted by xyx on 2025-11-20
Words 859 and Reading Time 3 Minutes
Viewed Times

CUDA 多版本共存

引言

什么是 CUDA: CUDA(Compute Unified Device Architecture)是 NVIDIA 推出的通用并行计算平台和编程模型,通过利用 GPU 的处理能力提升计算性能,支持C、C++、Python等多种语言编程。CUDA 有两个API:Runtime API、Driver API,分别位于软件栈的不同层级,共同支撑 GPU 并行计算的实现

  • Runtime API:是 NVIDIA 提供的用户态高层编程接口库,属于 CUDA Toolkit 的核心组件。它通过封装底层硬件细节,为开发者提供了管理 GPU 资源、启动并行任务、调度多任务执行等。nvcc 就属于 runtime API
  • Driver API: 是 NVIDIA 提供的内核态硬件驱动程序,负责直接与 GPU 硬件交互。nvidia-smi 就属于 driver API

为什么要多版本共存: 不同的深度学习框架(Tensorflow,PyTorch)和不同的版本依赖于特定版本的 CUDA 库。为了同时运行不同时期、不同框架的项目,必须管理多个版本以保证兼容性,为了达成此目的我们有不同的方式来实现 CUDA 的多版本共存

软链接方式

这是最传统的方式,通过修改软链接来切换版本

1
2
3
4
5
6
7
8
9
10
# 查看已安装的CUDA版本
ls -la /usr/local/cuda*

# 切换到CUDA 11.2
sudo rm -f /usr/local/cuda
sudo ln -s /usr/local/cuda-11.2 /usr/local/cuda

# 切换到CUDA 10.0
sudo rm -f /usr/local/cuda
sudo ln -s /usr/local/cuda-10.0 /usr/local/cuda

验证当前版本

1
2
ls -la /usr/local/cuda
nvcc -V

可能会出现两个版本不一致的情况,原因是

  • /usr/local/cuda 指向的是系统上安装的 cuda 工具包版本
  • nvcc -V 指向当前 shell 环境中实际使用的 cuda 编译器版本
  • ps: nvidia-smi 展现的是当前设备支持的 cuda 最高版本

可以通过配置环境变量的方式来统一 cuda 版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 临时修复
export PATH=/usr/local/cuda-11.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH

# 验证当前版本
nvcc -V


# 永久修复,编辑你的 ~/.bashrc
export PATH=/usr/local/cuda-11.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-11.2/lib64:$LD_LIBRARY_PATH
export CUDA_HOME=/usr/local/cuda-11.2

source ~/.bashrc

# 验证当前版本
nvcc -V

Conda 环境方式

在每个 conda 环境中安装特定版本的 cuda 工具包,通过下载cudatoolkitcudnn来实现,这两个包的版本需要按照官方对应关系来配置下载,否则也不能正常的使用 GPU

  • cudatoolkit: NVIDIA 提供的并行计算平台和编程模型的核心软件包
  • cudnn: 一个高度优化的库,专门用于加速深度神经网络训练和推理过程中的最常见运算,如卷积、池化、归一化等
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 激活虚拟环境
    conda activate env_name

    # 安装 CUDA 11.0 工具包
    conda install -c conda-forge cudatoolkit=11.0

    # 安装对应的 cuDNN
    conda install -c conda-forge cudnn=8.0.5

    # 验证安装
    conda list | grep -E "cudatoolkit|cudnn"

运行时版本验证,进入相应的 python 环境后,用 tensorflow 或者 torch 来输出运行时调用的 cuda 版本

1
2
3
4
5
6
7
8
9
10
import tensorflow as tf
tf.sysconfig.get_build_info()

# 打印出如下格式的输出
# OrderedDict([('cpu_compiler', '/usr/bin/gcc-5'),
#('cuda_compute_capabilities', ['sm_35', 'sm_50', 'sm_60', 'sm_70', 'sm_75','compute_80']),
#('cuda_version', '11.0'),
#('cudnn_version', '8'),
#('is_cuda_build', True),
#('is_rocm_build', False)])

参考文献