跳转到内容

NVIDIA 驱动与 CUDA

在 EL(Enterprise Linux)系统上运行 AI 工作负载,首先需要正确安装 NVIDIA GPU 驱动和 CUDA 工具包。本文涵盖驱动安装、CUDA 配置、nvidia-smi 使用以及 NVIDIA Container Toolkit 的部署。

Terminal window
lspci | grep -i nvidia

输出示例:

3b:00.0 3D controller: NVIDIA Corporation A100 80GB PCIe (rev a1)

如果没有输出,说明系统未检测到 NVIDIA GPU,请检查硬件连接或 BIOS 设置。

Terminal window
lspci -v -s $(lspci | grep -i nvidia | head -1 | awk '{print $1}')

有两种主要方式安装驱动:通过 NVIDIA 官方仓库(推荐)或通过 ELRepo。

确保系统已更新,并安装必要的依赖:

Terminal window
sudo dnf update -y
sudo dnf install -y kernel-devel kernel-headers gcc make dkms

禁用 nouveau 开源驱动(如果已加载):

Terminal window
# 检查 nouveau 是否加载
lsmod | grep nouveau
# 如果有输出,需要禁用它
sudo tee /etc/modprobe.d/blacklist-nouveau.conf > /dev/null <<'EOF'
blacklist nouveau
options nouveau modeset=0
EOF
# 重建 initramfs
sudo dracut --force
# 重启系统
sudo reboot

方式一:NVIDIA 官方仓库(推荐)

Section titled “方式一:NVIDIA 官方仓库(推荐)”

这是最推荐的方式,能获得最新的驱动版本。根据 EL 版本选择对应仓库。

添加 NVIDIA CUDA 仓库并安装驱动(EL 9)
# 添加 NVIDIA CUDA 仓库(包含驱动和 CUDA)
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel9/x86_64/cuda-rhel9.repo
# 清理缓存
sudo dnf clean all
# 安装最新驱动(DKMS 模块)
sudo dnf module install -y nvidia-driver:latest-dkms
添加 NVIDIA CUDA 仓库并安装驱动(EL 10)
# 添加 NVIDIA CUDA 仓库(rhel10)
sudo dnf config-manager --add-repo https://developer.download.nvidia.com/compute/cuda/repos/rhel10/x86_64/cuda-rhel10.repo
# 清理缓存
sudo dnf clean all
# EL 10 的 NVIDIA 仓库不提供 module 流,直接安装开源内核模块驱动
sudo dnf install -y nvidia-open

如果你更倾向于安装特定版本的驱动:

查看并安装指定版本的驱动
# 查看可用版本
sudo dnf list available nvidia-driver --showduplicates
# 安装指定版本(把 <版本号> 换成上一步列出的版本)
sudo dnf install -y nvidia-driver-<版本号>

安装完成后重启系统:

Terminal window
sudo reboot

ELRepo 是 Enterprise Linux 社区维护的驱动仓库:

通过 ELRepo 安装 NVIDIA 驱动(EL 9)
# 安装 ELRepo 仓库
sudo dnf install -y https://www.elrepo.org/elrepo-release-9.el9.elrepo.noarch.rpm
# 安装 NVIDIA 驱动(kmod 版本,随内核更新自动重编译)
sudo dnf install -y kmod-nvidia
# 或安装 DKMS 版本
sudo dnf install -y nvidia-x11-drv
通过 ELRepo 安装 NVIDIA 驱动(EL 10)
# 安装 ELRepo 仓库
sudo dnf install -y https://www.elrepo.org/elrepo-release-10.el10.elrepo.noarch.rpm
# 安装 NVIDIA 驱动(kmod 版本)
sudo dnf install -y kmod-nvidia
# 或安装 DKMS 版本
sudo dnf install -y nvidia-x11-drv

重启系统:

Terminal window
sudo reboot
Terminal window
nvidia-smi

成功输出示例:

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.126.16 Driver Version: 580.126.16 CUDA Version: 13.3 |
|-----------------------------------------+------------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
|=========================================+========================+======================|
| 0 NVIDIA A100 80GB PCIe Off | 00000000:3B:00.0 Off | 0 |
| N/A 32C P0 43W / 300W | 0MiB / 81920MiB | 0% Default |
+-----------------------------------------+------------------------+----------------------+

nvidia-smi 是 NVIDIA 系统管理工具,用于监控和管理 GPU。

Terminal window
# 基本信息
nvidia-smi
# 持续监控(每秒刷新)
watch -n 1 nvidia-smi
# 查看详细 GPU 信息
nvidia-smi -q
# 仅查看 GPU 利用率和显存
nvidia-smi --query-gpu=index,name,utilization.gpu,memory.used,memory.total --format=csv
# 查看运行在 GPU 上的进程
nvidia-smi pmon -i 0
# 设置持久模式(减少首次调用延迟)
sudo nvidia-smi -pm 1
# 设置 GPU 功耗限制
sudo nvidia-smi -pl 250
# 查看 GPU 温度
nvidia-smi --query-gpu=temperature.gpu --format=csv,noheader

在服务器上建议启用 nvidia-persistenced,避免每次 GPU 调用的初始化延迟:

Terminal window
sudo systemctl enable --now nvidia-persistenced

CUDA 工具包包含编译器(nvcc)、库和开发工具,是编译 GPU 加速程序所必需的。

如果你在安装驱动时已经添加了 NVIDIA CUDA 仓库,可以直接安装:

安装 CUDA 工具包
# 安装最新 CUDA 工具包
sudo dnf install -y cuda-toolkit
# 或安装特定版本(先查看仓库提供哪些版本)
sudo dnf list available 'cuda-toolkit-*'
sudo dnf install -y cuda-toolkit-<版本号>
Terminal window
# 添加 CUDA 到 PATH
cat >> ~/.bashrc <<'EOF'
# CUDA
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
EOF
source ~/.bashrc
Terminal window
nvcc --version

输出示例:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2024 NVIDIA Corporation
Built on ...
Cuda compilation tools, release 13.3, V13.3.xxx
Terminal window
# 安装 CUDA 示例(可选)
sudo dnf install -y cuda-samples-12-6
# 编译 deviceQuery 示例
cd /usr/local/cuda/samples/1_Utilities/deviceQuery 2>/dev/null || \
echo "示例可能位于其他位置,请检查 /usr/local/cuda/extras/"
# 或手动编写测试程序
cat > /tmp/cuda_test.cu <<'EOF'
#include <stdio.h>
__global__ void hello() {
printf("Hello from GPU thread %d\n", threadIdx.x);
}
int main() {
hello<<<1, 5>>>();
cudaDeviceSynchronize();
return 0;
}
EOF
nvcc /tmp/cuda_test.cu -o /tmp/cuda_test && /tmp/cuda_test

部分深度学习框架需要 cuDNN 库:

Terminal window
# 通过 NVIDIA 仓库安装
sudo dnf install -y cudnn9-cuda-12

NVIDIA Container Toolkit 让 Docker 和 Podman 容器能够访问宿主机的 GPU,是在容器中运行 AI 应用的关键组件。

Terminal window
# 添加 NVIDIA Container Toolkit 仓库
curl -s -L https://nvidia.github.io/libnvidia-container/stable/rpm/nvidia-container-toolkit.repo | \
sudo tee /etc/yum.repos.d/nvidia-container-toolkit.repo
# 安装
sudo dnf install -y nvidia-container-toolkit
Terminal window
# 配置 Docker 运行时
sudo nvidia-ctk runtime configure --runtime=docker
# 重启 Docker
sudo systemctl restart docker
# 验证 GPU 在容器中可用
sudo docker run --rm --gpus all nvidia/cuda:13.3.1-base-ubi9 nvidia-smi
Terminal window
# 配置 Podman(CDI 方式)
sudo nvidia-ctk cdi generate --output=/etc/cdi/nvidia.yaml
# 验证 CDI 设备
nvidia-ctk cdi list
# 运行 GPU 容器
podman run --rm --device nvidia.com/gpu=all nvidia/cuda:13.3.1-base-ubi9 nvidia-smi

docker-compose.yml 中声明 GPU 资源:

services:
ai-app:
image: your-ai-image:latest
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: all # 或指定数量如 1
capabilities: [gpu]
Terminal window
# 通过 NVIDIA 仓库更新
sudo dnf update -y nvidia-driver cuda-toolkit
# 更新后重启
sudo reboot

如果新驱动有问题,可以回滚到之前的版本:

回滚到指定版本
# 查看已安装的版本
rpm -qa | grep nvidia-driver
# 降级到指定版本(把 <版本号> 换成要回滚到的版本)
sudo dnf downgrade nvidia-driver-<版本号>
sudo reboot
Terminal window
# 检查驱动模块是否加载
lsmod | grep nvidia
# 如果没有加载,尝试手动加载
sudo modprobe nvidia
# 检查内核日志
sudo dmesg | grep -i nvidia
# 最常见原因是 Secure Boot 阻止了未签名的内核模块
# 在 BIOS 中禁用 Secure Boot,或对模块进行签名

如果使用 DKMS 安装方式,内核更新后驱动应自动重编译。如果失败:

Terminal window
# 检查 DKMS 状态
dkms status
# 手动重新编译
sudo dkms autoinstall
# 重启
sudo reboot
Terminal window
# 查看所有 GPU
nvidia-smi -L
# 通过环境变量指定可见的 GPU
export CUDA_VISIBLE_DEVICES=0 # 仅使用 GPU 0
export CUDA_VISIBLE_DEVICES=0,1 # 使用 GPU 0 和 1
export CUDA_VISIBLE_DEVICES="" # 禁用所有 GPU
Terminal window
# nvidia-smi 右上角显示的是驱动支持的最高 CUDA 版本
nvidia-smi
# 实际安装的 CUDA 版本
nvcc --version