手把手教你离线搞定CentOS服务器上的NVIDIA全家桶(驱动+CUDA+cuDNN+容器运行时)

在企业内网或保密环境中部署AI开发平台时,最大的挑战莫过于如何在没有互联网连接的情况下,完成从底层驱动到容器环境的完整GPU堆栈搭建。本文将分享一套经过实战验证的离线部署方案,涵盖从硬件识别到容器编排的全流程。

1. 离线环境准备与硬件检查

在开始安装前,必须确保服务器硬件与目标软件版本完全兼容。我曾在一个金融风控项目中,因为忽略了内核版本匹配问题,导致整个部署流程被迫重来三次。

首先通过以下命令确认GPU设备已被系统识别:

lspci | grep -i nvidia

典型输出应包含类似 NVIDIA Corporation GP104 [GeForce RTX 1080] 的硬件信息。若未显示,可能需要检查PCIe插槽连接或BIOS设置。

离线安装必备组件包

  • kernel-devel-$(uname -r)
  • gcc-4.8.5(最低要求)
  • make-3.82
  • dkms(动态内核模块支持)

这些依赖包的离线获取建议使用以下方法:

# 在有网络的环境中准备
mkdir -p /var/cache/yum/x86_64/7/base/packages
yum install --downloadonly --downloaddir=/var/cache/yum/x86_64/7/base/packages kernel-devel gcc make dkms

注意:内核开发包版本必须与 uname -r 完全一致,否则驱动编译会失败。建议在离线前通过 yum update 统一版本。

2. NVIDIA驱动离线安装实战

驱动安装是整套环境的基础,也是最容易出错的环节。根据我的经验,90%的安装失败都与nouveau驱动冲突或内核版本不匹配有关。

完整禁用nouveau流程

  1. 创建黑名单配置文件:
    cat > /etc/modprobe.d/blacklist-nouveau.conf <<EOF
    blacklist nouveau
    options nouveau modeset=0
    EOF
    
  2. 重建initramfs:
    mv /boot/initramfs-$(uname -r).img /boot/initramfs-$(uname -r).img.bak
    dracut -v /boot/initramfs-$(uname -r).img $(uname -r)
    

驱动安装推荐使用runfile方式,相比rpm包具有更好的兼容性。以下是关键安装参数:

./NVIDIA-Linux-x86_64-535.104.05.run \
  --silent \
  --no-questions \
  --disable-nouveau \
  --kernel-source-path=/usr/src/kernels/$(uname -r) \
  --no-opengl-files

常见错误处理方案:

错误现象 解决方案 根本原因
Unable to load kernel module 检查kernel-devel版本 内核头文件缺失
Nouveau still in use 确认initramfs已重建 驱动冲突
32-bit compatibility库缺失 离线安装glibc.i686 架构依赖问题

验证驱动是否正常工作:

nvidia-smi -q | grep "Driver Version"

3. CUDA Toolkit离线部署策略

CUDA版本选择需要平衡框架需求和驱动兼容性。以PyTorch 2.0为例,推荐使用CUDA 11.7而非最新版,可获得最佳兼容性。

离线安装包组件选择

./cuda_11.7.1_515.65.01_linux.run \
  --toolkit --silent --override \
  --toolkitpath=/usr/local/cuda-11.7 \
  --samplespath=/root/NVIDIA_CUDA_samples

环境变量配置建议采用模块化方式:

cat > /etc/profile.d/cuda.sh <<EOF
export CUDA_HOME=/usr/local/cuda-11.7
export PATH=\${CUDA_HOME}/bin:\${PATH}
export LD_LIBRARY_PATH=\${CUDA_HOME}/lib64:\${LD_LIBRARY_PATH}
EOF

关键验证步骤:

# 检查编译器
nvcc --version | grep "release 11.7"

# 测试设备查询
/usr/local/cuda-11.7/extras/demo_suite/deviceQuery | grep "Result = PASS"

4. cuDNN库的离线集成方法

cuDNN的版本必须与CUDA严格匹配。以CUDA 11.7为例,应选择cuDNN 8.5.x系列而非最新版。

安全验证压缩包完整性

sha256sum cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz | grep a7e0e1d9d6c9e5e5f4a9c9e9d1e9e9d1

库文件部署最佳实践:

tar -xvf cudnn-linux-x86_64-8.5.0.96_cuda11-archive.tar.xz
cd cudnn-linux-x86_64-8.5.0.96_cuda11-archive
cp -P include/cudnn*.h /usr/local/cuda-11.7/include
cp -P lib/libcudnn* /usr/local/cuda-11.7/lib64
chmod a+r /usr/local/cuda-11.7/include/cudnn*.h /usr/local/cuda-11.7/lib64/libcudnn*

验证安装:

cat /usr/local/cuda-11.7/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

5. 容器运行时离线配置指南

离线环境下的容器支持需要特别注意依赖链的完整性。推荐使用nvidia-container-toolkit 1.11.0+版本,其对离线场景的支持最为完善。

离线RPM包依赖树

nvidia-docker2-2.13.0
├── nvidia-container-toolkit-1.13.0
│   ├── libnvidia-container-tools-1.13.0
│   └── libnvidia-container1-1.13.0
└── nvidia-container-runtime-3.13.0

安装顺序至关重要:

rpm -ivh libnvidia-container*.rpm
rpm -ivh nvidia-container-toolkit*.rpm
rpm -ivh nvidia-container-runtime*.rpm
rpm -ivh nvidia-docker2*.rpm

Daemon配置模板:

{
  "default-runtime": "nvidia",
  "runtimes": {
    "nvidia": {
      "path": "/usr/bin/nvidia-container-runtime",
      "args": []
    }
  },
  "exec-opts": ["native.cgroupdriver=systemd"]
}

最终验证:

docker run --rm -it --gpus all nvidia/cuda:11.7.1-base-ubuntu20.04 nvidia-smi

6. 离线环境下的维护技巧

长期维护离线环境需要建立本地仓库。建议使用createrepo工具构建本地yum源:

mkdir -p /opt/local-repo/Packages
createrepo /opt/local-repo
cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local Repository
baseurl=file:///opt/local-repo
enabled=1
gpgcheck=0
EOF

版本兼容性矩阵参考:

组件 推荐版本 兼容范围
驱动 515.65.01 ≥510.47.03
CUDA 11.7.1 11.0-11.8
cuDNN 8.5.0 8.3.0-8.6.0
容器工具 1.13.0 1.11.0+

应急恢复方案:

# 驱动回滚
nvidia-uninstall
# CUDA清理
/usr/local/cuda-11.7/bin/uninstall_cuda_11.7.pl

更多推荐