环境准备:GPU驱动与CUDA安装、PyTorch分布式环境配置、NCCL通信库安装与验证

做多卡训练,环境准备是第一步,也是最容易翻车的一步。

我见过太多同学,代码写得漂漂亮亮,结果一跑分布式就报错——要么驱动版本不对,要么NCCL没装好。说白了,底层环境没搭稳,上层再好的代码也跑不起来。

这一章,我们就来把环境彻底搞定。

1. GPU驱动与CUDA安装

先讲驱动。GPU驱动是操作系统和显卡之间的桥梁。没有它,系统根本认不出你的显卡。

核心原则:驱动版本 ≥ CUDA版本要求的最低驱动版本

我个人习惯用 nvidia-smi 来检查驱动状态。装好后,终端输入:

nvidia-smi

如果能看到显卡列表、驱动版本、CUDA版本,说明驱动装好了。

举个例子,我有一台机器输出是这样的:

+-----------------------------------------------------------------------------+
| NVIDIA-SMI 535.129.03   Driver Version: 535.129.03   CUDA Version: 12.2     |
+-----------------------------------------------------------------------------+

这里要注意:nvidia-smi 显示的 CUDA Version 是驱动支持的最高CUDA版本,不是你实际安装的CUDA Toolkit版本。这两个概念容易混淆。

避坑指南

我曾经遇到过一台机器,驱动版本是470,却想装CUDA 11.8。结果编译时各种报错。查了半天才发现,CUDA 11.8要求驱动版本≥520。嗯,驱动太老,带不动新CUDA。

接下来装CUDA Toolkit。我建议去NVIDIA官网下载runfile安装,别用deb包。为什么?runfile可以自定义安装路径,方便多版本共存。

安装步骤大致如下:

  1. 下载对应系统的runfile
  2. 执行 sudo sh cuda_xxx_linux.run
  3. 取消勾选Driver(驱动已装好,别重复装)
  4. 选择安装路径,比如 /usr/local/cuda-11.8

装完后配置环境变量:

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

验证CUDA是否装好:

nvcc --version

看到版本号输出,就对了。

小技巧

我习惯在 ~/.bashrc 里写一个函数,方便切换CUDA版本。比如 cuda11() 切到11.8,cuda12() 切到12.1。做实验时来回切,省事。

2. PyTorch分布式环境配置

PyTorch的分布式训练,核心依赖 torch.distributed 包。装PyTorch时,要选对CUDA版本。

我个人推荐用conda装,依赖管理省心:

conda create -n torch_dist python=3.10
conda activate torch_dist
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

装完后验证:

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

输出 True 和显卡数量,就说明PyTorch能认到GPU了。

接下来测试分布式环境是否正常。我一般写个简单脚本:

import torch
import torch.distributed as dist

dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', world_size=2, rank=0)
print(f"Rank {dist.get_rank()} initialized")
dist.destroy_process_group()

用 torchrun 启动:

torchrun --nproc_per_node=2 test_dist.py

如果看到两个rank都打印了初始化成功,说明分布式环境没问题。

注意

init_method 里的端口要确保没被占用。我遇到过端口冲突导致初始化卡死的情况。建议用 23456 这种高位端口,避开常用端口。

3. NCCL通信库安装与验证

NCCL是NVIDIA的集体通信库。多卡训练时,梯度同步全靠它。说白了,NCCL就是分布式训练的「高速公路」。

PyTorch自带了NCCL,但版本可能不是最新的。我建议单独装NCCL,特别是用A100、H100这些新卡时。

安装NCCL有两种方式:

  • 方式一:用pip装 — pip install nvidia-nccl-cu11(对应CUDA 11.x)
  • 方式二:从源码编译 — 适合需要定制化优化的场景

我个人倾向用pip装,省时间。但要注意版本匹配:

CUDA版本 推荐NCCL版本
11.8 2.18.x 或 2.19.x
12.1 2.20.x 或 2.21.x

装完后验证NCCL是否正常工作。我写了个小测试:

import torch
import torch.distributed as dist

dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', world_size=2, rank=0)

# 创建一个张量,做all-reduce测试
tensor = torch.tensor([1.0, 2.0, 3.0]).cuda()
dist.all_reduce(tensor, op=dist.ReduceOp.SUM)
print(f"After all-reduce: {tensor}")

dist.destroy_process_group()

如果输出是 [2.0, 4.0, 6.0](两个rank各贡献一份),说明NCCL通信正常。

调试技巧

如果NCCL报错,先检查环境变量 NCCL_DEBUG=INFO。开启后,NCCL会打印详细的通信日志,能帮你定位是网络问题还是驱动问题。

我习惯在脚本开头加一句:os.environ['NCCL_DEBUG'] = 'INFO'

4. 整体环境验证

最后,把所有组件串起来跑一遍。我写了个综合验证脚本:

import torch
import torch.distributed as dist
import os

# 检查CUDA
assert torch.cuda.is_available(), "CUDA不可用"
print(f"GPU数量: {torch.cuda.device_count()}")

# 检查NCCL
dist.init_process_group(backend='nccl', init_method='tcp://127.0.0.1:23456', world_size=2, rank=0)
print(f"NCCL版本: {torch.cuda.nccl.version()}")
dist.destroy_process_group()

print("环境准备完成!")

跑通了,说明你的环境已经准备好迎接多卡训练了。

总结一下

环境准备就三件事:驱动和CUDA装对版本,PyTorch分布式配好,NCCL通信验证通过。每一步都有坑,但按流程走,稳得很。

多卡训练环境准备流程 GPU驱动安装 nvidia-smi 验证 CUDA Toolkit安装 nvcc --version 验证 PyTorch安装 torch.cuda验证 NCCL通信库安装 all-reduce 测试 分布式环境配置 torchrun 启动测试 综合验证 全链路测试通过 ✅ 环境准备完成,可以开始多卡训练 注意:驱动版本 ≥ CUDA版本要求的最低驱动版本

最后说一句

环境准备这事,一次配好,后面省心。我建议你把验证脚本保存下来,每次换机器或重装系统后,跑一遍就知道环境有没有问题。

想要更多资料,联系可可