3、操作系统与驱动环境:Ubuntu Server 22.04 LTS安装、NVIDIA驱动安装与验证、CUDA Toolkit 12.x安装、nvidia-smi与nvidia-smi topo -m解读
好,咱们正式开始动手了。这一章,说白了就是给集群打地基。地基不稳,后面全白搭。我见过太多人在驱动和CUDA版本上翻车,一折腾就是半天。咱们今天就把这事一次搞定。
3.1 操作系统选型:为什么是Ubuntu Server 22.04 LTS?
你可能要问,为什么非得是22.04?CentOS不行吗?Ubuntu Desktop不行吗?
我个人习惯,生产环境首选Ubuntu Server LTS。原因有三:
- 硬件兼容性最好:NVIDIA的驱动和CUDA,官方对Ubuntu的支持最积极。你想想看,新卡出来,第一个适配的Linux发行版往往就是Ubuntu。
- 内核版本适中:22.04的内核是5.15 LTS,对NCCL和IB(InfiniBand)的兼容性经过大量验证。太新的内核有时反而会引入奇怪的bug。
- 生态成熟:遇到问题,Google一下,十有八九的答案都是基于Ubuntu的。
3.2 Ubuntu Server 22.04 LTS 安装要点
安装过程其实不复杂,但有几个坑我得提前给你指出来。
磁盘分区:我建议用LVM(逻辑卷管理)。为什么?因为训练数据会越来越大,LVM可以动态扩展分区,不用重装系统。我在项目中遇到过数据盘写满的尴尬,还好用了LVM,加块硬盘就解决了。
网络配置:服务器通常有多网口。安装时,把管理口和业务口(比如IB或高速以太网)分开配置。管理口用DHCP或者固定IP都行,但业务口建议用静态IP,方便后续集群互联。
SSH服务:安装时记得勾选OpenSSH server。这是你远程操作的唯一通道。
sudo apt update && sudo apt upgrade -y。我曾经因为没更新,装驱动时遇到了内核头文件不匹配的问题,折腾了好久。
3.3 NVIDIA驱动安装与验证
驱动安装,我推荐用官方.run文件,而不是apt源里的版本。为什么?因为apt源里的驱动版本往往滞后,而且有时会跟CUDA Toolkit的版本打架。
具体步骤:
- 禁用nouveau驱动:这是开源的NVIDIA驱动,必须禁用,否则会冲突。
sudo bash -c "echo blacklist nouveau > /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo bash -c "echo options nouveau modeset=0 >> /etc/modprobe.d/blacklist-nvidia-nouveau.conf"
sudo update-initramfs -u
sudo reboot
- 下载驱动:去NVIDIA官网下载对应你显卡的驱动。比如A100或H100,下载最新的数据中心驱动。
- 安装:
sudo chmod +x NVIDIA-Linux-x86_64-*.run
sudo ./NVIDIA-Linux-x86_64-*.run --no-opengl-files
这里加 --no-opengl-files 是因为服务器不需要OpenGL,装了反而可能跟桌面环境冲突。
- 验证:
nvidia-smi
如果看到类似下面的输出,恭喜你,驱动装好了。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.08 Driver Version: 545.23.08 CUDA Version: 12.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 ... On | 00000000:00:04.0 Off | 0 |
| N/A 32°C P0 N/A / 400W| 0MiB / 81920MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
3.4 CUDA Toolkit 12.x 安装
驱动装好了,接下来装CUDA Toolkit。这个才是我们写代码、编译程序真正需要的。
我推荐用runfile安装,这样你可以完全控制安装路径。deb包安装会把东西散到系统各处,不好管理。
wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda_12.3.0_545.23.08_linux.run
sudo sh cuda_12.3.0_545.23.08_linux.run
安装时,不要勾选Driver,因为我们之前已经装过了。只选CUDA Toolkit和CUDA Samples。
安装完成后,配置环境变量:
echo 'export PATH=/usr/local/cuda-12.3/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.3/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
验证:
nvcc --version
看到类似 Cuda compilation tools, release 12.3, V12.3.107 就对了。
update-alternatives 管理多版本,或者干脆只装一个版本。
3.5 nvidia-smi 与 nvidia-smi topo -m 解读
这两个命令,是你诊断GPU集群的瑞士军刀。
nvidia-smi
这个命令显示GPU的实时状态。重点看这几个字段:
- GPU-Util:GPU利用率。训练时如果这个值低于90%,说明有瓶颈,可能是数据加载跟不上。
- Memory-Usage:显存使用。如果接近上限,说明模型太大,需要调整batch size或者用梯度检查点。
- Temp:温度。超过85°C就要注意散热了,否则会降频。
nvidia-smi topo -m
这个命令输出GPU之间的拓扑结构。说白了,就是告诉你GPU之间怎么连接的,是走NVLink还是走PCIe。
输出示例:
GPU0 GPU1 GPU2 GPU3 CPU Affinity NUMA Affinity
GPU0 X NV2 NV2 SYS 0-31 N/A
GPU1 NV2 X SYS NV2 0-31 N/A
GPU2 NV2 SYS X NV2 32-63 N/A
GPU3 SYS NV2 NV2 X 32-63 N/A
解读:
- NV2:表示通过NVLink连接,带宽高,延迟低。GPU0和GPU1之间是NV2,说明它们在一个NVSwitch域内。
- SYS:表示通过PCIe连接,带宽相对较低。GPU0和GPU3之间是SYS,说明它们不在同一个PCIe交换机下。
- CPU Affinity:表示GPU绑定到哪个CPU核心。GPU0和GPU1绑定到0-31核心,GPU2和GPU3绑定到32-63核心。
下面这张图,帮你理清本章的知识脉络:
嗯,到这里,你的单机环境就搭好了。驱动、CUDA、验证工具,一个都不少。下一章,咱们开始搞网络,让多台机器能互相通信。记住,基础打牢了,后面才跑得快。