容器化nccl-test与参数详解

2,777 阅读3分钟

一、build

推荐基于NGC的cuda镜像构建。注意这里采用的cuda版本最好与物理机驱动版本相差不要太大,否则可能存在nccl版本问题。(目前还没找到一个完整的nccl版本与driver版本的详细对应关系)

Dockerfile

FROM nvcr.io/nvidia/cuda:12.1.0-cudnn8-devel-ubuntu22.04"
ENV DEBIAN_FRONTEND=noninteractive

ARG CONDA_VERSION

WORKDIR /workspace

# 安装openmpi ssh等
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt install -y openmpi-bin libopenmpi-dev ssh openssh-server net-tools vim git iputils-ping nfs-common

# 编译nccl
RUN git clone https://github.com/NVIDIA/nccl-tests.git && \
    cd nccl-tests && \
    make MPI=1 MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi

构建镜像

docker build -t [IMAGE_NAME]  -f Dockerfile .

二、配置免密通信

下面的操作是每台物理机上都需要执行。假设有两个节点10.1.1.1,10.1.1.2

2.1 启动容器

采用宿主机网络启动容器。

docker run --rm -d --name nccl-test --ipc=host --network=host --shm-size=20g --privileged=true  [IMAGE_NAME] 

2.2 配置ssh免密通信

  • 生成公钥私钥
ssh-keygen -t rsa
  • 配置authorized_keys

    把每台物理机上的公钥id_rsa.pub写到文件/root/.ssh/authorized_keys中。每台机器上的authorized_keys文件都要有两台机器上的公钥。

  • 修改sshconfig,避免交互认证。

echo "    StrictHostKeyChecking no" >> /etc/ssh/ssh_config 
  • 启动ssh
mkdir -p /var/run/sshd && /usr/sbin/sshd -p 20024

可以通过ssh root@ip -p 20024验证是否配置免密通信成功。

三、跑nccl-test

随便找一台物理机进去容器执行下面的命令,注意ip换成真实ip。

docker exec -it 【containerID】bash
mpirun --allow-run-as-root  --bind-to none -np 2 -H 10.1.1.1,10.1.1.2 -mca plm_rsh_args "-p 20024" -x LD_LIBRARY_PATH -x NCCL_IB_HCA=mlx5_0,mlx5_1,mlx5_2,mlx5_3,mlx5_6,mlx5_7,mlx5_8,mlx5_9 -x NCCL_DEBUG=INFO -x NCCL_IB_GID_INDEX=3 -x NCCL_IB_TC=106 -x NCCL_IB_QPS_PER_CONNECTION=4 -x NCCL_ALGO=RING -x NCCL_SOCKET_IFNAME=eth0 /workspace/nccl-tests/build/all_reduce_perf -b 1M -e 2G -w 2 -n 10 -f 2 -g 8

mpirun参数:

  • np:启动的进程数量,如果host没有配置slots参数,每台机器上启动的数量等于np除以节点数,如果np小于节点数量,则只有前np个节点会参与测试。注意,如果后面all_reduce_perf没有配置-g参数,那么这里进程数就对应参与测试的GPU卡数。

all_reduce_perf参数:

  • -b: 测试数据的最小尺寸,从该尺寸开始测试;
  • -e: 测试数据的最大尺寸,当传输数据大于等于该尺寸时结束测试;
  • -f: 数据每次增长系数,如b=1M,f=2,那么会按照1M 2M 4M 8M递增,直到最大值。
  • -w: warmup的数量
  • -n: 每次测试迭代的次数
  • -g: GPU数量,该参数如果不配置,参与测试的GPU数量取决mpi的np参数。

测试结果: image.png 主要看algbw和busbw。

algbw是算法带宽,就是传输数量除以时间得到的,以最后一行数据为例:2147483648/1000/1000/361.570=5.94

busbw是总线位宽,该值是nccl tests引入的概念,用于反应实际物理带宽信息。

busbw=algbw*2(n-1)/n,n是GPU的个数。 图中是3机24卡测试结果,11.38=2*(23/24)*5.94

对应的ib网卡监控:11.38*8基本符合网卡监控数值。

image.png