4、集群操作系统与驱动:Ubuntu Server 22.04 LTS安装与优化、NVIDIA驱动与CUDA Toolkit安装、Docker与NVIDIA Container Toolkit配置

这一章,我们聊聊AI算力集群的“地基”。说白了,就是操作系统、驱动和容器环境。我见过不少团队,模型调得再好,底层环境没搭对,跑起来各种玄学报错。嗯,咱们一步步来,把这块硬骨头啃下来。

核心逻辑:AI集群的软件栈,从下往上依次是:操作系统 → 硬件驱动 → CUDA运行时 → 容器引擎。每一层都依赖下层,任何一层出问题,上层都跑不起来。

AI算力集群软件栈 Ubuntu Server 22.04 LTS NVIDIA Driver + CUDA Toolkit Docker + NVIDIA Container Toolkit PyTorch / TensorFlow 等 第1层 第2层 第3层 第4层

4.1 Ubuntu Server 22.04 LTS 安装与优化

我个人习惯,AI集群首选 Ubuntu Server 22.04 LTS。为什么?生态好,驱动支持全,社区活跃。你想想看,遇到问题搜一下,十有八九能找到答案。

安装要点:

  • 分区方案:建议单独分一个 /data 分区给训练数据,避免系统盘被撑爆。我在项目中遇到过,有人把数据和系统混在一起,结果日志一多,系统直接挂了。
  • 文件系统:推荐 ext4 或 XFS。XFS 对大文件支持更好,适合存模型权重。
  • 网络配置:集群节点建议用静态IP,别用DHCP。否则节点重启后IP变了,整个集群都得重新发现。

小技巧:安装时勾选“Install OpenSSH server”,省得装完系统再手动配SSH。

系统优化:

# 关闭交换分区(AI训练吃内存,交换分区会拖死性能)
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

# 调整内核参数(提升网络和文件系统性能)
cat >> /etc/sysctl.conf <

注意:关闭交换分区后,如果内存不够,进程会被OOM Killer杀掉。确保你的物理内存足够大,或者配置好内存监控。

4.2 NVIDIA驱动与CUDA Toolkit安装

驱动安装,我踩过不少坑。最稳妥的方式是用NVIDIA官方提供的 runfile 安装,或者用Ubuntu的 apt 源。我个人推荐用 runfile,因为可控性更强。

安装步骤:

  1. 卸载旧驱动:
    sudo apt purge nvidia* -y
    sudo apt autoremove -y
  2. 安装依赖:
    sudo apt update
    sudo apt install build-essential dkms -y
  3. 禁用nouveau驱动:
    echo "blacklist nouveau" | sudo tee /etc/modprobe.d/blacklist-nvidia-nouveau.conf
    sudo update-initramfs -u
    # 重启后验证:lsmod | grep nouveau 应该无输出
  4. 安装NVIDIA驱动:
    chmod +x NVIDIA-Linux-x86_64-535.154.05.run
    sudo ./NVIDIA-Linux-x86_64-535.154.05.run
  5. 安装CUDA Toolkit:
    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

验证安装:

nvidia-smi  # 查看驱动和GPU状态
nvcc --version  # 查看CUDA版本

我曾经遇到过一个问题:驱动装好了,nvidia-smi 也能跑,但CUDA程序就是报错。后来发现是环境变量没配。记得把下面这行加到 ~/.bashrc 里:

export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

4.3 Docker与NVIDIA Container Toolkit配置

容器化是AI集群的标配。Docker 保证环境一致性,NVIDIA Container Toolkit 让容器能调用GPU。说白了,就是让每个训练任务跑在独立的“小盒子”里,互不干扰。

安装Docker:

# 使用官方脚本一键安装
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

# 将当前用户加入docker组(避免每次sudo)
sudo usermod -aG docker $USER
newgrp docker

安装NVIDIA Container Toolkit:

# 添加NVIDIA容器仓库
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

sudo apt update
sudo apt install nvidia-container-toolkit -y

# 重启Docker服务
sudo systemctl restart docker

验证GPU容器:

docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi

如果能看到GPU信息,说明配置成功。

Docker运行时配置优化:

# 配置Docker使用systemd cgroup驱动(与Kubernetes兼容)
cat > /etc/docker/daemon.json <

避坑指南:我曾经在集群里发现,不同节点的Docker版本不一致,导致镜像层缓存失效,每次拉镜像都重新下载。建议所有节点统一Docker版本,最好用 apt-mark hold docker-ce 锁定版本。

4.4 环境验证与常见问题

装完别急着跑训练,先做个全链路验证:

验证项 命令 预期结果
GPU驱动 nvidia-smi 显示GPU型号、驱动版本、显存使用
CUDA编译 nvcc --version 显示CUDA版本号
Docker运行 docker run hello-world 打印Hello from Docker!
GPU容器 docker run --rm --gpus all nvidia/cuda:12.2.0-base-ubuntu22.04 nvidia-smi 容器内能看到GPU

常见问题:

  • nvidia-smi 报错 "Failed to initialize NVML":驱动没装好,或者内核模块没加载。试试 sudo modprobe nvidia
  • Docker 容器内看不到GPU:检查 nvidia-container-toolkit 是否安装,Docker daemon 是否配置了默认runtime。
  • CUDA版本不匹配:驱动版本和CUDA Toolkit版本有对应关系。比如驱动535对应CUDA 12.x,别混搭。

我的经验:环境搭建最怕“玄学问题”。我建议每装完一层,就做一次验证。别等全装完再排查,否则定位问题会非常痛苦。


公众号:蓝海资料掘金营,微信deep3321

专注资料整理