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的。
我的建议:别用Desktop版。Server版没有图形界面,省资源,更稳定。你操作集群难道还接个显示器?都是SSH上去的。

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的版本打架。

具体步骤:

  1. 禁用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
  1. 下载驱动:去NVIDIA官网下载对应你显卡的驱动。比如A100或H100,下载最新的数据中心驱动。
  2. 安装:
sudo chmod +x NVIDIA-Linux-x86_64-*.run
sudo ./NVIDIA-Linux-x86_64-*.run --no-opengl-files

这里加 --no-opengl-files 是因为服务器不需要OpenGL,装了反而可能跟桌面环境冲突。

  1. 验证:
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 |
+-------------------------------+----------------------+----------------------+
重要:看到 "CUDA Version: 12.3" 了吗?这表示驱动支持的CUDA最高版本是12.3。但注意,这只是驱动支持的版本,不代表你已经安装了CUDA Toolkit。

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 就对了。

避坑指南:我曾经在同一台机器上装了多个CUDA版本,结果编译时链接错了库。建议用 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核心。
实战意义:做分布式训练时,尽量让通信频繁的GPU对(比如同一个节点内的GPU)走NVLink,跨节点的走IB或高速以太网。你想想看,如果两个GPU之间是SYS,你却让它们频繁通信,那性能肯定上不去。

下面这张图,帮你理清本章的知识脉络:

操作系统与驱动环境搭建流程 Ubuntu Server 22.04 LTS NVIDIA Driver 545.23.08 CUDA Toolkit 12.x nvidia-smi & nvidia-smi topo -m 基础层 驱动层 开发层 验证层

嗯,到这里,你的单机环境就搭好了。驱动、CUDA、验证工具,一个都不少。下一章,咱们开始搞网络,让多台机器能互相通信。记住,基础打牢了,后面才跑得快。

可可精品资料库