努力
加油

如何在CentOS或Ubuntu系统上配置CUDA和cuDNN?

配置 CUDA 和 cuDNN 是深度学习环境搭建中最基础也最容易踩坑的一环。很多新手容易陷入“直接下载.run 文件”或者“盲目复制粘贴教程”的误区,导致驱动版本不匹配、库路径冲突等问题。

作为在 Linux 环境下摸爬滚打多年的开发者,我推荐一套最稳妥、最易于维护的方案:使用 NVIDIA 官方提供的 Repository(仓库)进行安装。这种方法能自动处理依赖关系,且后续升级方便。

以下分别针对 Ubuntu 和 CentOS/RHEL 两大主流发行版给出详细步骤。核心原则是:先确认硬件支持,再装驱动,最后装 Toolkit 和 cuDNN。


第一步:前置检查(所有系统通用)

在安装任何东西之前,请务必执行以下操作,否则后续大概率报错:

  1. 确认显卡型号及计算能力
    确保你的 GPU 支持 CUDA。可以在 NVIDIA 官网查看 CUDA GPUs 列表。
  2. 卸载旧版本(如果有)
    # 如果是通过 .run 安装的,可能需要手动清理
    sudo /usr/bin/nvidia-uninstall
    # 如果是通过 apt/yum 安装的,通常不需要特别清理,直接覆盖即可
  3. 禁用 Secure Boot(安全启动)
    这是最关键的一点! 大多数情况下,NVIDIA 专有驱动无法在启用 Secure Boot 的内核模块签名下加载。请进入 BIOS/UEFI 设置,将 Secure Boot 改为 Disabled。
  4. 内核头文件(Kernel Headers)
    编译驱动或某些工具需要内核头文件。

    • Ubuntu: sudo apt install linux-headers-$(uname -r)
    • CentOS: sudo yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r)

第二步: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:

  1. 去 NVIDIA 开发者网站下载 cuDNN Library for Linux(注意是 Library,不是 Developer Bundle)。
  2. 解压 tar 文件:
    tar -xzvf cudnn-linux-x86_64-8.x.x.x_cudaX.Y-archive.tar.xz
  3. 拷贝文件到 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 版本

常见问题与避坑指南

  1. GCC 版本过高导致编译失败
    CUDA Toolkit 对 GCC 版本有严格要求。例如,CUDA 11.8 最高只支持 GCC 11。如果你使用的是最新的 Ubuntu 24.04 或 CentOS Stream 9,默认的 GCC 可能太高。

    • 解决: 安装兼容的 GCC 版本,并在编译时指定:
      CC=gcc-11 CXX=g++-11 nvcc ...
  2. nvidia-smi 显示驱动版本,但 nvcc --version 报错
    这通常是环境变量未生效,或者 /usr/local/cuda 软链接指向了错误的版本。

    • 解决: 检查 ls -l /usr/local/cuda,确保它指向正确的目录。重新 source ~/.bashrc。
  3. 多版本共存
    如果你同时安装了 CUDA 11.8 和 12.2,nvcc 会默认调用其中一个。你可以通过修改 /usr/local/cuda 的软链接来切换默认版本,或者在代码中显式指定路径。

  4. 容器化部署(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 的输出和错误日志,才能精准定位。