一、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参数。
测试结果:
主要看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基本符合网卡监控数值。