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
2ls -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 工具包,通过下载cudatoolkit和cudnn来实现,这两个包的版本需要按照官方对应关系来配置下载,否则也不能正常的使用 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
10import 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)])
参考文献
- [1] GPU驱动、CUDA 、cuDNN 和CUDA Toolkit之间的关系(深度学习小白必懂)
- [2] CUDA/cudnn/CUDA Toolkit/NVCC区别简介
- [3] Tensorflow GPU 支持
- [4] Interactions with the CUDA Driver API
- [5] CUDA/cudnn/CUDA Toolkit/NVCC区别简介