配置 CUDA 和 cuDNN 是深度学习环境搭建中最基础也最容易踩坑的一环。很多新手容易陷入“直接下载.run 文件”或者“盲目复制粘贴教程”的误区,导致驱动版本不匹配、库路径冲突等问题。
作为在 Linux 环境下摸爬滚打多年的开发者,我推荐一套最稳妥、最易于维护的方案:使用 NVIDIA 官方提供的 Repository(仓库)进行安装。这种方法能自动处理依赖关系,且后续升级方便。
以下分别针对 Ubuntu 和 CentOS/RHEL 两大主流发行版给出详细步骤。核心原则是:先确认硬件支持,再装驱动,最后装 Toolkit 和 cuDNN。
第一步:前置检查(所有系统通用)
在安装任何东西之前,请务必执行以下操作,否则后续大概率报错:
- 确认显卡型号及计算能力
确保你的 GPU 支持 CUDA。可以在 NVIDIA 官网查看 CUDA GPUs 列表。 - 卸载旧版本(如果有)
# 如果是通过 .run 安装的,可能需要手动清理 sudo /usr/bin/nvidia-uninstall # 如果是通过 apt/yum 安装的,通常不需要特别清理,直接覆盖即可 - 禁用 Secure Boot(安全启动)
这是最关键的一点! 大多数情况下,NVIDIA 专有驱动无法在启用 Secure Boot 的内核模块签名下加载。请进入 BIOS/UEFI 设置,将 Secure Boot 改为Disabled。 - 内核头文件(Kernel Headers)
编译驱动或某些工具需要内核头文件。- Ubuntu:
sudo apt install linux-headers-$(uname -r) - CentOS:
sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)
- Ubuntu:
第二步:Ubuntu 系统配置流程
Ubuntu 对 NVIDIA 的支持最为友好,推荐使用 apt + nvidia-driver 组合。
1. 安装显卡驱动
不要直接用 apt install nvidia-cuda-toolkit,这会安装一个过时的、不包含完整驱动的元包。正确做法是:
# 更新源
sudo apt update
# 安装推荐的专有驱动(通常会自动包含最新驱动)
sudo ubuntu-drivers autoinstall
# 或者指定版本安装(例如 535 版本)
# sudo apt install nvidia-driver-535
# 重启系统
sudo reboot
重启后,运行 nvidia-smi。如果能看到输出,说明驱动安装成功。
2. 添加 NVIDIA CUDA Repository
为了获取最新的 CUDA Toolkit,我们需要添加官方的 APT 源。以 CUDA 12.2 为例(请根据需求选择版本,目前主流是 11.8 或 12.x):
# 添加密钥
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb
sudo dpkg -i cuda-keyring_1.0-1_all.deb
# 更新源
sudo apt update
注意:如果你的 Ubuntu 版本不是 22.04,请将 URL 中的 ubuntu2204 替换为对应的版本号,如 ubuntu2004。
3. 安装 CUDA Toolkit
# 安装 CUDA Toolkit 和相关的开发库
sudo apt install cuda-toolkit-12-2
# 安装 cuDNN(现在通常作为独立包或通过 toolkit 依赖安装)
# 对于较新版本,cuDNN 可能包含在 cuda-toolkit 中,或者需要单独安装
sudo apt install libcudnn9-cuda-12 # 示例包名,具体取决于版本
4. 配置环境变量
编辑 ~/.bashrc 或 /etc/profile,添加以下内容:
export PATH=/usr/local/cuda-12.2/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
使配置生效:
source ~/.bashrc
验证:
nvcc --version
第三步:CentOS/RHEL 系统配置流程
CentOS 7/8 或 RHEL 由于默认内核较老,且软件源限制较多,建议直接使用 NVIDIA 提供的 .rpm 安装包或 .run 文件。这里推荐使用 .run 文件方式,兼容性最好。
1. 安装显卡驱动
CentOS 通常没有预装 NVIDIA 驱动。你需要从 NVIDIA 官网下载对应版本的 Driver Runfile。
# 赋予执行权限
chmod +x NVIDIA-Linux-x86_64-<version>.run
# 安装驱动(注意:这会阻止 X Server 启动,适合服务器环境)
sudo ./NVIDIA-Linux-x86_64-<version>.run --silent --driver
# 验证
nvidia-smi
2. 安装 CUDA Toolkit
同样建议使用 .run 文件,因为它自带了必要的库文件,避免与系统自带的 GCC 版本冲突。
# 下载 CUDA Toolkit Runfile (例如 CUDA 11.8)
# 访问 https://developer.nvidia.com/cuda-downloads 选择 Linux -> x86_64 -> CentOS -> 7 (或 8) -> runfile(local)
sudo sh cuda_<version>_linux.run
安装过程中的关键选项:
- 当提示是否安装 Driver 时:选 No(因为我们已经装好了)。
- 当提示是否安装 CUDA Toolkit 时:选 Yes。
- 其他组件按需选择,一般保持默认即可。
3. 配置环境变量
同样编辑 ~/.bashrc:
export PATH=/usr/local/cuda/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
生效并验证:
source ~/.bashrc
nvcc --version
第四步:安装 cuDNN
重要概念澄清:
在新版本的 CUDA Toolkit(特别是 12.x)中,NVIDIA 已经将 cuDNN 的核心部分集成到了 Toolkit 的安装过程中,或者通过包管理器自动关联。但对于深度学习框架(PyTorch/TensorFlow),我们通常需要的是头文件和库文件,以便编译自定义算子或确保框架能调用到高性能的卷积算法。
方法一:通过包管理器(Ubuntu 推荐)
如果在 Ubuntu 上安装了完整的 CUDA Toolkit,cuDNN 通常已经就绪。你可以检查:
ls /usr/include/cudnn*.h
ls /usr/lib/x86_64-linux-gnu/libcudnn.so*
如果没有,可以单独安装:
sudo apt install libcudnn9-cuda-12 # 版本号需与 CUDA 匹配
方法二:手动解压(CentOS 或特定版本推荐)
如果上述方法找不到,或者你需要特定版本的 cuDNN:
- 去 NVIDIA 开发者网站下载 cuDNN Library for Linux(注意是 Library,不是 Developer Bundle)。
- 解压 tar 文件:
tar -xzvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz - 拷贝文件到 CUDA 目录:
# 假设你的 CUDA 安装在 /usr/local/cuda sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*
验证 cuDNN 是否可用
编写一个简单的 C++ 程序测试,或者更简单地,在 Python 中验证:
import torch
print(torch.backends.cudnn.is_available()) # True 表示可用
print(torch.version.cuda) # 显示当前 PyTorch 使用的 CUDA 版本
常见问题与避坑指南
-
GCC 版本过高导致编译失败
CUDA Toolkit 对 GCC 版本有严格要求。例如,CUDA 11.8 最高只支持 GCC 11。如果你使用的是最新的 Ubuntu 24.04 或 CentOS Stream 9,默认的 GCC 可能太高。- 解决: 安装兼容的 GCC 版本,并在编译时指定:
CC=gcc-11 CXX=g++-11 nvcc ...
- 解决: 安装兼容的 GCC 版本,并在编译时指定:
-
nvidia-smi显示驱动版本,但nvcc --version报错
这通常是环境变量未生效,或者/usr/local/cuda软链接指向了错误的版本。- 解决: 检查
ls -l /usr/local/cuda,确保它指向正确的目录。重新source ~/.bashrc。
- 解决: 检查
-
多版本共存
如果你同时安装了 CUDA 11.8 和 12.2,nvcc会默认调用其中一个。你可以通过修改/usr/local/cuda的软链接来切换默认版本,或者在代码中显式指定路径。 -
容器化部署(Docker)
在生产环境中,强烈建议使用 NVIDIA Container Toolkit。# 在宿主机安装 containerd/docker 后 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.repo | sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo sudo yum install nvidia-container-toolkit sudo systemctl restart docker # 运行容器时加上 --gpus all docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi
总结
- Ubuntu 用户:优先使用
apt安装nvidia-driver和cuda-toolkit,省心省力。 - CentOS/RHEL 用户:优先使用
.run文件安装,注意驱动和 Toolkit 的版本匹配。 - 核心原则:驱动必须能跑通
nvidia-smi;Toolkit 必须能通过nvcc编译简单程序;cuDNN 必须能被深度学习框架识别。
按照这个流程走,99% 的环境问题都能避免。如果遇到具体的报错,提供 nvidia-smi 的输出和错误日志,才能精准定位。
云技术博客