Skip to content

NCCL 性能测试与优化指南

摘要: NCCL (NVIDIA Collective Communications Library) 是分布式深度学习训练的通信基石。本文档详细介绍了如何编译部署 nccl-tests,进行单机与多机性能基准测试,并提供了 BIOS/OS 级的高级调优策略。

1. 基础环境要求

在开始之前,请确保集群满足以下条件:

  • 硬件: NVIDIA A800/H800 等高性能 GPU,Mellanox IB 网卡。
  • 软件: CentOS 7/Rocky 8,NVIDIA Driver 535+,CUDA 12.x。
  • 状态检查:
    • GPU: nvidia-smi 无异常占用。
    • IB: ibstat 显示所有端口 State: Active
    • 网络: 节点间 SSH 免密互信。

2. 核心软件编译

推荐从源码编译以获得对当前硬件架构的最佳支持。

2.1 准备环境

bash
# 临时工作目录
export WORK_DIR=/tmp/nccl_build
mkdir -p $WORK_DIR
cd $WORK_DIR

2.2 安装 OpenMPI

bash
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.bz2
tar xf openmpi-4.1.5.tar.bz2
cd openmpi-4.1.5

# 编译安装 (支持 CUDA)
./configure --prefix=$WORK_DIR/openmpi --with-cuda
make -j$(nproc)
make install

# 设置环境变量
export PATH=$WORK_DIR/openmpi/bin:$PATH
export LD_LIBRARY_PATH=$WORK_DIR/openmpi/lib:$LD_LIBRARY_PATH

2.3 编译 nccl-tests

假设系统已安装 NCCL(通常随驱动或 CUDA Toolkit 安装),如果需要特定版本请自行编译 NCCL 源码。这里直接编译测试工具:

bash
cd $WORK_DIR
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests

# 编译 (指定 MPI 和 CUDA 路径)
make MPI=1 \
     MPI_HOME=$WORK_DIR/openmpi \
     CUDA_HOME=/usr/local/cuda \
     -j$(nproc)

编译完成后,可执行文件位于 ./build/ 目录下。

3. 性能测试实践

常用工具为 all_reduce_perf,它模拟了分布式训练中最常见的 AllReduce 操作。

3.1 单机测试 (Intra-Node)

测试单台服务器内部 8 卡之间的 NVLink 带宽。

bash
# -b: 最小字节, -e: 最大字节, -f: 倍增因子, -g: GPU 数量
./build/all_reduce_perf -b 8 -e 128M -f 2 -g 8
  • 预期: A800 NVLink 理论双向带宽 600GB/s,实测 BusBW 应接近 550-580GB/s。

3.2 多机测试 (Inter-Node)

测试跨节点 IB 网络性能。

1. 创建 hostfile

text
# 格式: IP slots=GPU数
192.168.1.1 slots=8
192.168.1.2 slots=8

2. 执行测试

bash
mpirun --allow-run-as-root \
    --hostfile hostfile \
    -np 16 \
    -x LD_LIBRARY_PATH \
    -x NCCL_DEBUG=INFO \
    -x NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3 \
    ./build/all_reduce_perf -b 8 -e 8G -f 2 -g 1 -w 10 -n 100
  • 参数:
    • -np 16: 总 GPU 数 (2 节点 x 8 卡)。
    • -x NCCL_IB_HCA: 显式指定使用的 IB 网卡,避免走到以太网。

4. 结果分析与基准

关注输出中的 busbw 列。

指标说明计算公式 (AllReduce)
algbw算法带宽应用层感知到的数据吞吐量
busbw总线带宽衡量硬件利用率的核心指标

$$ \text{BusBW} = \text{AlgBW} \times \frac{2(n-1)}{n} $$

合格标准

  • 单机 (NVLink): > 90% 理论带宽。
  • 多机 (IB): > 80% 理论带宽 (受限于交换机跳数和 PCIe 损耗)。

5. 高级调优

5.1 系统级优化

  1. GDR (GPUDirect RDMA): 确保加载 nvidia_peermem 模块,使 IB 网卡能直接读写显存。
    bash
    modprobe nvidia_peermem
  2. PCIe 配置: 关闭 ACS (Access Control Services) 以启用 P2P 通信。
    bash
    # 检查 ACS 状态 (脚本自动化关闭)
    ./disable_acs.sh
  3. IOMMU: 推荐开启 IOMMU (intel_iommu=on) 但不使用透传 (iommu=pt),或根据具体主板 BIOS 建议调整。

5.2 NCCL 环境变量

变量推荐值/说明
NCCL_DEBUGINFO (调试), WARN (生产)
NCCL_IB_HCAmlx5_0:1,mlx5_3:1 (指定 IB 卡)
NCCL_IB_GID_INDEX3 (RoCEv2 常用)
NCCL_SOCKET_IFNAMEeth0 (指定 OOB 通信网口)
NCCL_ALGORINGTREE (强制特定算法)

5.3 常见故障

  • NCCL Hang (卡死):
    • 检查防火墙是否阻断了随机端口。
    • 设置 NCCL_P2P_DISABLE=1 排除 NVLink 问题。
    • 设置 NCCL_IB_DISABLE=1 排除 IB 问题。
  • 性能极低:
    • 检查是否误用了 TCP (NCCL_DEBUG=INFO 没看到 IB 建立连接)。
    • 检查 PCIe 槽位是否降速 (x16 -> x8)。

AI-HPC Organization