手把手教你离线搞定CentOS服务器上的NVIDIA全家桶(驱动+CUDA+cuDNN+容器运行时)
手把手教你离线搞定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流程 :
-
创建黑名单配置文件:
cat > /etc/modprobe.d/blacklist-nouveau.conf <<EOF blacklist nouveau options nouveau modeset=0 EOF -
重建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
更多推荐
所有评论(0)