3. 操作系统与驱动:Ubuntu Server 22.04 LTS安装、NVIDIA驱动安装与验证、CUDA Toolkit与cuDNN配置

这一章,我们聊聊AI基础设施最底层的“地基”。说白了,就是怎么把一台裸金属服务器,变成一台能跑大模型训练的机器。我见过太多团队,算法模型写得漂亮,结果底层环境配了一周,最后发现驱动版本不对,CUDA不兼容,白白浪费了宝贵的GPU资源。

嗯,咱们一步步来。从装系统开始,到驱动验证,再到CUDA和cuDNN的完整配置。每一步我都会把我在生产环境里踩过的坑,直接告诉你。

3.1 Ubuntu Server 22.04 LTS 安装要点

为什么选22.04 LTS?因为它是目前NVIDIA官方文档里支持最全、生态最成熟的长期支持版本。我个人习惯,生产环境绝不追新,稳定压倒一切。

我的建议: 安装时选择“Minimal”模式,不要装桌面环境。服务器上跑GUI纯属浪费资源,还多了一堆安全风险。

安装过程中,有几个关键点你一定要注意:

  • 磁盘分区: 建议用LVM逻辑卷管理。我遇到过磁盘空间不够,LVM可以动态扩展,救过我的命。
  • 网络配置: 务必设置静态IP。DHCP分配的IP一旦变化,你的SSH连接就断了,远程机房可没人帮你插显示器。
  • SSH服务: 安装时勾选OpenSSH server。这是你后续所有操作的入口。
  • 系统更新: 装完后先跑一遍 sudo apt update && sudo apt upgrade -y。别急着装驱动,先把系统补丁打全。

3.2 NVIDIA驱动安装与验证

驱动安装,是很多人翻车的重灾区。我曾经在一台新到的A100服务器上,因为驱动版本不对,折腾了整整一个下午。后来我总结出一套标准流程,再也没出过问题。

3.2.1 确认GPU型号

先看看你手里是什么卡:

lspci | grep -i nvidia

如果输出为空,先检查硬件是否插好,或者BIOS里是否禁用了独立显卡。嗯,这种情况我遇到过两次,都是新机器BIOS默认关闭了PCIe插槽。

3.2.2 卸载旧驱动(如果有)

如果你之前装过NVIDIA驱动,一定要先清理干净:

sudo apt purge nvidia-* -y
sudo apt autoremove -y

这一步不能省。残留的驱动文件会导致新驱动安装失败,或者装上了但模块加载冲突。

3.2.3 安装驱动

我推荐两种方式,你根据场景选:

方式 命令 适用场景
Ubuntu官方源 sudo apt install nvidia-driver-535 快速部署,兼容性好
NVIDIA官方runfile 从官网下载.run文件手动安装 需要特定版本或自定义参数

我个人习惯用Ubuntu官方源。简单、稳定,而且apt会帮你处理内核模块的依赖关系。你想想看,如果手动装.run文件,每次内核更新后都得重新编译模块,多麻烦。

注意: 安装驱动前,必须关闭图形界面。如果你装了桌面环境,先按 Ctrl+Alt+F2 切换到纯文本终端,然后 sudo systemctl stop gdm3 或 sudo systemctl stop lightdm。

3.2.4 验证驱动

装完重启,然后跑这个命令:

nvidia-smi

如果看到类似下面的输出,说明驱动装好了:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.86.05    Driver Version: 535.86.05    CUDA Version: 12.2     |
|-------------------------------+----------------------+----------------------+
| 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    On   | 00000000:00:04.0 Off |                    0 |
|  0%   35C    P0    56W / 300W |      0MiB / 81920MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

这里有个细节:CUDA Version: 12.2 表示当前驱动支持的最高CUDA版本,不是你实际安装的CUDA版本。很多人在这里搞混,以为驱动装完CUDA就自动好了——不是的,驱动和CUDA Toolkit是两回事。

3.3 CUDA Toolkit 与 cuDNN 配置

驱动装好了,GPU能认了,但你的深度学习框架(PyTorch、TensorFlow)还需要CUDA Toolkit和cuDNN才能调用GPU做计算。说白了,驱动是让系统认识GPU,CUDA是让程序能用GPU。

3.3.1 安装CUDA Toolkit

我建议用NVIDIA官方的runfile安装,这样你可以精确控制安装路径。用apt装也行,但版本选择没那么灵活。

wget https://developer.download.nvidia.com/compute/cuda/12.2.0/local_installers/cuda_12.2.0_535.54.03_linux.run
sudo sh cuda_12.2.0_535.54.03_linux.run

安装时注意:

  • 不要勾选“Driver”,因为我们已经装过了。
  • 选择安装路径,默认是 /usr/local/cuda-12.2。

装完后,配置环境变量:

echo 'export PATH=/usr/local/cuda-12.2/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

验证一下:

nvcc --version

如果看到CUDA版本号,说明安装成功。

3.3.2 安装cuDNN

cuDNN是NVIDIA针对深度神经网络的加速库。没有它,你的卷积、池化、LSTM等操作就跑不到GPU的极致性能。

安装步骤:

  1. 去NVIDIA官网下载cuDNN(需要注册账号)。选择与你的CUDA版本匹配的cuDNN版本。
  2. 解压并复制文件到CUDA目录:
tar -xzvf cudnn-linux-x86_64-8.9.4.25_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.2/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.2/lib64/
sudo chmod a+r /usr/local/cuda-12.2/include/cudnn*.h /usr/local/cuda-12.2/lib64/libcudnn*

验证cuDNN版本:

cat /usr/local/cuda-12.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
关键点: cuDNN的版本必须与CUDA版本严格对应。比如CUDA 12.2只能用cuDNN 8.9.x系列。版本不匹配,你的模型训练时会出现各种奇怪的错误,比如“cuDNN error: CUDNN_STATUS_NOT_INITIALIZED”。

3.4 知识体系总览

下面这张图,把整个环境搭建的流程和依赖关系梳理清楚了。你照着这个逻辑走,不会乱。

AI数据底座环境搭建流程 GPU硬件(A100/H100) Ubuntu Server 22.04 LTS NVIDIA Driver CUDA Toolkit 12.2 cuDNN 8.9.x PyTorch / TensorFlow ⚠️ 常见坑 • 驱动版本与CUDA不匹配 • cuDNN版本与CUDA不对应 • 环境变量未正确配置

3.5 验证全链路

所有东西都装完后,我习惯跑一个完整的验证脚本,确保整个链路是通的:

# 1. 验证驱动
nvidia-smi

# 2. 验证CUDA
nvcc --version

# 3. 验证cuDNN
cat /usr/local/cuda-12.2/include/cudnn_version.h | grep CUDNN_MAJOR -A 2

# 4. 用Python验证GPU可用性(需要先装PyTorch)
python3 -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"

如果最后一步输出 True 和你的GPU型号,恭喜你,环境搭建成功了。

我的经验: 每次装完环境,我都会把这个验证结果截图保存。以后排查问题时,可以快速确认是环境问题还是代码问题。省了很多扯皮的功夫。

嗯,这一章的内容就到这里。环境搭好了,下一层就是存储和网络了。不过那是后面的事,先把眼前的基础打牢。