环境准备:Linux服务器配置、CUDA与PyTorch安装、Docker环境搭建、NVIDIA驱动验证

说实话,RLHF 框架部署这件事,环境准备占了 60% 的坑。我见过太多人卡在驱动不兼容、CUDA 版本对不上、Docker 起不来这些地方。说白了,磨刀不误砍柴工,这一章咱们就把地基打扎实。

本章核心目标:在一台裸机 Linux 服务器上,从零搭建一套可运行 RLHF 框架的完整环境。包括 NVIDIA 驱动、CUDA 工具包、PyTorch、Docker 以及容器内 GPU 透传。

1. Linux 服务器基础配置

我个人习惯用 Ubuntu 20.04 LTS 或 22.04 LTS。为什么?因为生态最全,遇到问题 Stack Overflow 上基本都有答案。CentOS 当然也行,但很多深度学习库对 Ubuntu 的支持更友好。

拿到服务器后,第一件事不是装驱动,而是检查系统版本和内核:

# 查看系统版本
cat /etc/os-release

# 查看内核版本
uname -r

# 查看 CPU 架构(x86_64 还是 aarch64)
lscpu | grep Architecture

嗯,这里要注意:如果你用的是 ARM 架构的服务器(比如某些云上的 Graviton 实例),后面 CUDA 和 PyTorch 的安装方式会不一样。咱们这门课默认 x86_64 架构。

接下来,更新系统并安装基础工具:

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential gcc g++ make cmake
sudo apt install -y git curl wget vim net-tools

我的小习惯:装完系统后,我会顺手把 SSH 的 KeepAlive 打开,防止长时间训练时终端断连。在 /etc/ssh/sshd_config 里加上 ClientAliveInterval 60ClientAliveCountMax 3

2. NVIDIA 驱动安装与验证

驱动这步,我曾经踩过一个坑:直接在官网下载最新驱动,结果和系统内核不兼容,黑屏了。后来我学乖了,用 Ubuntu 官方源或者 NVIDIA 的 apt 仓库来装。

先看看服务器上有没有显卡:

lspci | grep -i nvidia

如果啥都没输出,先检查一下显卡是不是被 BIOS 禁用了,或者物理上没插好。别笑,我真遇到过客户说「驱动装不上」,结果显卡没通电。

确认有显卡后,推荐用 ubuntu-drivers 工具自动安装:

# 查看推荐驱动版本
ubuntu-drivers devices

# 自动安装推荐驱动
sudo ubuntu-drivers autoinstall

# 或者手动指定版本(比如 535)
sudo apt install -y nvidia-driver-535

装完后重启,然后验证:

nvidia-smi

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

+-----------------------------------------------------------------------------+
| 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     Off | 00000000:00:04.0 Off |                    0 |
|   0%   35C    P0    45W / 300W|      0MiB / 81920MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

注意:nvidia-smi 显示的 CUDA Version 是驱动支持的最高 CUDA 版本,不是你实际安装的 CUDA 工具包版本。这两个概念容易混淆,我刚开始也搞混过。

3. CUDA 与 cuDNN 安装

驱动装好了,接下来装 CUDA 工具包。RLHF 训练通常需要 CUDA 11.8 或 12.x,具体看你用的框架要求。我个人习惯用 runfile 方式安装,因为可以指定安装路径,方便多版本共存。

从 NVIDIA 官网下载对应版本:

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,因为我们已经装过了。只选 CUDA Toolkit 和 CUDA Samples。

装完后配置环境变量:

# 在 ~/.bashrc 或 ~/.zshrc 中添加
export PATH=/usr/local/cuda-12.2/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH

验证 CUDA 是否装好:

nvcc --version

然后装 cuDNN。这个需要去 NVIDIA 开发者网站注册下载,或者用 apt 方式:

# 添加 NVIDIA 的 apt 仓库
sudo apt install -y cudnn-cuda-12

避坑指南:我曾经因为 cuDNN 版本和 CUDA 不匹配,导致训练时 loss 死活不降。后来发现是 cuDNN 的卷积算法出了 bug。所以,一定要对照 NVIDIA cuDNN 兼容性表 来选版本。

4. PyTorch 安装

PyTorch 安装其实是最简单的,但有个关键点:一定要装 CUDA 版本,而不是 CPU 版本。很多人直接 pip install torch,结果装了个 CPU only 的,跑 RLHF 慢到怀疑人生。

正确的做法是去 PyTorch 官网用生成器选好配置:

# CUDA 12.1 版本
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

验证 PyTorch 是否能调用 GPU:

python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.device_count()); print(torch.cuda.get_device_name(0))"

如果输出 True1NVIDIA A100 80GB 这样的信息,恭喜你,环境通了。

性能小贴士:RLHF 训练时,PyTorch 的编译优化很重要。我建议安装时加上 --extra-index-url 指定 cuDNN 的 wheel 包,或者直接用 torch.compile 开启 JIT 编译,能提升 20%-30% 的吞吐量。

5. Docker 环境搭建

Docker 是 RLHF 部署的标配。为什么?因为不同项目依赖的 CUDA 版本、Python 版本、库版本可能冲突。用 Docker 隔离,一台机器上可以跑多个环境,互不干扰。

安装 Docker:

# 卸载旧版本
sudo apt remove docker docker-engine docker.io containerd runc

# 安装依赖
sudo apt install -y ca-certificates curl gnupg lsb-release

# 添加 Docker 官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# 添加稳定版仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 安装 Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

验证 Docker 是否装好:

sudo docker run hello-world

接下来是关键:安装 NVIDIA Container Toolkit,让 Docker 容器能访问 GPU。

# 添加 NVIDIA 的 apt 仓库
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 -y nvidia-container-toolkit

# 重启 Docker 服务
sudo systemctl restart docker

验证容器内 GPU 可用:

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

如果看到和宿主机一样的 nvidia-smi 输出,说明 GPU 透传成功了。

注意:Docker 默认需要 root 权限。如果你不想每次都用 sudo,可以把当前用户加入 docker 组:sudo usermod -aG docker $USER。然后退出重新登录。

6. 整体环境验证

最后,我们来跑一个完整的验证脚本,确保所有组件都能协同工作:

# 创建一个测试脚本 test_env.py
import torch
import subprocess

# 1. 检查 CUDA
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"GPU count: {torch.cuda.device_count()}")
print(f"GPU name: {torch.cuda.get_device_name(0)}")

# 2. 检查 PyTorch 版本和 CUDA 版本
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA version: {torch.version.cuda}")

# 3. 跑一个简单的张量运算
x = torch.randn(1000, 1000).cuda()
y = torch.randn(1000, 1000).cuda()
z = torch.matmul(x, y)
print(f"Tensor operation successful: {z.shape}")

# 4. 检查 Docker 和 nvidia-docker
result = subprocess.run(['docker', 'run', '--rm', '--gpus', 'all', 'nvidia/cuda:12.2.0-base-ubuntu20.04', 'nvidia-smi'], 
                       capture_output=True, text=True)
print(f"Docker GPU test: {'PASS' if 'NVIDIA-SMI' in result.stdout else 'FAIL'}")

运行:python test_env.py

如果所有检查都通过,恭喜你,环境准备完毕!

我的经验:建议把上面的验证脚本保存为 check_env.sh,每次换机器或者重装系统后,先跑一遍这个脚本。能省下大量排查问题的时间。

7. 本章知识体系总览

下面这张图,是我自己梳理的环境准备全流程。你可以把它当作一张检查清单:

RLHF 环境准备全流程 ① Linux 服务器 ② NVIDIA 驱动 ③ CUDA + cuDNN ④ PyTorch ⑤ Docker + nvidia-docker nvidia-smi 验证 nvcc --version torch.cuda 验证 docker GPU 验证

这张图里,每一步都有对应的验证手段。我建议你每完成一步,就做一次验证。不要等到最后一起验证,否则出了问题很难定位。

好了,环境准备就到这里。记住:基础打牢了,后面 RLHF 的训练和部署才能顺风顺水。如果你在安装过程中遇到任何问题,欢迎在课程群里交流,我会尽量回复。


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