NCCL环境搭建
更新时间:2023-07-26
概览
NCCL是NVIDIA面向GPU提供的集合通信库,能实现Collective通信和点对点通信,是在大规模AI训练中必备的组件。结合云上的弹性高性能计算集群EHC GPU实例,可极大加速训练速度。本文将介绍如何准备在实例中测试NCCL所需要的必备环境。
需求场景
- 大规模人工智能训练
- 高性能计算HPC
配置步骤
环境准备
- 安装GPU运行必备环境,包括GPU驱动等,可参考支持自动安装GPU环境的创建GPU实例或者手动安装GPU驱动。
- 安装OFED驱动。百度智能云提供的GPU镜像已包含OFED驱动,无需手动安装。如您使用其他镜像,则可以访问OFED下载链接下载系统环境对应的OFED版本,建议您下载LTS 5.4-3.1.0版本。 如您使用CentOS 7u8或者CentOS 8u4,则需要额外下载依赖包
CentOS 7u8:
yum install createrepo
yum install elfutils-libelf-devel python-devel redhat-rpm-config rpm-build libtool
CentOS 8u4:
yum install createrepo
yum install kernel-rpm-macros python36 elfutils-libelf-devel python36-devel gdb-headless rpm-build libtool gcc
解压驱动安装包后,在安装目录执行以下命令。
./mlnxofedinstall --without-fw-update --add-kernel-support --skip-distro-check
- 使能GPU Direct RDMA需要加载nv_peer_mem服务,NVIDIA在驱动版本470已预装了该组件,可直接按以下步骤加载相应模块。
modprobe nvidia_peermem
# 可通过 lsmod|grep nvidia 检查
加载完后,可直接跳转至环境变量设置步骤。
- 如果您使用470以下的版本,则需要手动下载并安装相应模块,下载及编译安装方法如下。
git clone https://github.com/Mellanox/nv_peer_memory.git
# 编译并安装 nv_peer_mem.ko
cd nv_peer_memory && make
cp nv_peer_mem.ko /lib/modules/$(uname -r)/kernel/drivers/video
depmod -a
modprobe nv_peer_mem
# 可通过 lsmod|grep nv_peer_mem 检查
service nv_peer_mem start
- ACSCtl 检查方法。
lspci -vvv|grep ACSCtl:|grep SrvValid+
如果没有输出,则表示配置正常。如果有输出,则执行以下指令。
for pdev in `lspci -vvv|grep -E "^[a-f]|^[0-9]|ACSCtl"|grep ACSCtl -B1|grep -E "^[a-
f]|^[0-9]"|awk '{print $1}'`
do
setpci -s $pdev ECAP_ACS+06.w=0000
done
执行完后可再执行检查方法验证。
环境变量设置
环境变量 | 解释 | 设置 |
---|---|---|
NCCL_SOCKET_IFNAME | 指定用于通信的IP接口 | 设置成主机的host TCP/IP网卡,可通过ip a查找,默认是bond0 |
NCCL_IB_GID_INDEX | 设置RDMA通信优先级 | 通过show_gids确认对应的IB网卡gid index |
NCCL_IB_DISABLE | 是否关闭IB通信 | 设置成1来启用TCP通信,一般需要设置成0或者默认不动 |
NCCL_IB_HCA | 环境中的IB网卡 | 例如export NCCL_IB_HCA=mlx5_2,mlx5_3,mlx5_4,mlx5_5,可以通过ibstat查看IB网卡名 |
NCCL_DEBUG | 从NCCL显示的调试信息 | 可设置为export NCCL_DEBUG=INFO |
NCCL测试
cd /home
mkdir nccl-tool && cd nccl-tool
mkdir dependency
- 拉取并编译openmpi。
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.3.tar.gz
tar -xzf openmpi-4.1.3.tar.gz && rm -rf openmpi-4.1.3.tar.gz && cd openmpi-4.1.3 ./configure --prefix=/home/nccl-tool/dependency/openmpi
make -j && make install
如果上述报错/usr/bin/ld -lnuma,则采取以下指令。
apt-get install numa
ln -s /usr/lib/x86_64-linux-gnu/libnuma.so.1 /usr/lib/x86_64-linux-gnu/libnuma.so
- 验证openmpi。
export PATH=/home/nccl-tool/dependency/openmpi/bin:$PATH
export LD_LIBRARY_PATH=/home/nccl- tool/dependency/openmpi/lib:$LD_LIBRARY_PATH
ompi_info
## 输出一大串版本号则正常
- 拉取2.12版本的nccl库。
cd /home/nccl-tool
git clone -b v2.12.12-1 https://github.com/NVIDIA/nccl.git
cd nccl
make -j src.lib PREFIX=/home/nccl-tool/dependency/nccl
make install PREFIX=/home/nccl-tool/dependency/nccl
# 通过 ls /home/nccl-tool/dependency/nccl/lib 查看libnccl.so库
- 拉取nccl-tests测试脚本。
cd /home/nccl-tool
git clone https://github.com/NVIDIA/nccl-tests.git
cd nccl-tests
make -j MPI=1 MPI_HOME=/home/nccl-tool/dependency/openmpi CUDA_HOME=/usr/local/cuda NCCL_HOME=/home/nccl-tool/dependency/nccl BUILDDIR=/home/nccl-tool/bin
# 分发工具包到其它实例上,下列的xxxx使用其他实例内网ip替换
scp -r /home/nccl-tool/bin root@${xxxx}:/home/nccl-tool
scp -r /home/nccl-tool/dependency root@${xxxx}:/home/nccl-tool
- 建立实例之间的的ssh互信。
ssh-keygen
ssh-copy-id -i ~/.ssh/id_rsa.pub ${ip2}
# 新建文件hostfile用于 mpirun 识别多机,将需要互联的实例VPC IP分行写入 hostfile 文件中
vim hostfile
# 测试mpi,输出2台实例的hostname
mpirun --prefix /home/nccl-tool/dependency/openmpi -np 2 --allow-run-as-root -- hostfile hostfile hostname
- NCCL all_reduce测试。
NCCL_HOME=/home/nccl-tool/dependency/nccl
CUDA_HOME=/usr/local/cuda
MPI_HOME=/home/nccl-tool/dependency/openmpi
export LD_LIBRARY_PATH=${NCCL_HOME}/lib:${CUDA_HOME}/lib64:${MPI_HOME}/lib:${LD_LIBRA
RY_PATH}
mpirun --allow-run-as-root \
--prefix /home/nccl-tool/dependency/openmpi \
-np 2 \
--hostfile ./hostfile \
-x NCCL_DEBUG=INFO \
-x NCCL_SOCKET_IFNAME=bond0 \
-x LD_LIBRARY_PATH \
-x PATH \
-x NCCL_IB_GID_INDEX=0 \
/home/nccl-tool/bin/all_reduce_perf -b 1024 -e 1G -f 2 -g 1 -t 8 -c 0 -n 20
得到回显结果如下。
# out-of-place in-place
# size count type redop time algbw busbw error time algbw busbw error
# (B) (elements) (us) (GB/s) (GB/s) (us) (GB/s) (GB/s)
1024 256 float sum 44.40 0.02 0.04 N/A 43.90 0.02 0.04 N/A
2048 512 float sum 45.19 0.05 0.08 N/A 45.04 0.05 0.09 N/A
4096 1024 float sum 44.93 0.09 0.17 N/A 45.27 0.09 0.17 N/A
8192 2048 float sum 47.20 0.17 0.33 N/A 46.98 0.17 0.33 N/A
16384 4096 float sum 65.53 0.25 0.47 N/A 54.88 0.30 0.56 N/A
32768 8192 float sum 364.6 0.09 0.17 N/A 117.5 0.28 0.52 N/A
65536 16384 float sum 146.0 0.45 0.84 N/A 165.2 0.40 0.74 N/A
131072 32768 float sum 155.2 0.84 1.58 N/A 183.7 0.71 1.34 N/A
262144 65536 float sum 150.3 1.74 3.27 N/A 148.7 1.76 3.31 N/A
524288 131072 float sum 172.0 3.05 5.72 N/A 183.8 2.85 5.35 N/A
1048576 262144 float sum 204.6 5.13 9.61 N/A 203.5 5.15 9.66 N/A
2097152 524288 float sum 271.8 7.72 14.47 N/A 272.0 7.71 14.46 N/A
4194304 1048576 float sum 283.8 14.78 27.72 N/A 284.2 14.76 27.67 N/A
8388608 2097152 float sum 317.0 26.47 49.62 N/A 306.3 27.39 51.35 N/A
16777216 4194304 float sum 456.7 36.73 68.87 N/A 598.6 28.03 52.55 N/A
33554432 8388608 float sum 788.1 42.58 79.84 N/A 798.7 42.01 78.77 N/A
67108864 16777216 float sum 1232.4 54.45 102.10 N/A 1228.3 54.64 102.44 N/A
134217728 33554432 float sum 2270.0 59.13 110.86 N/A 2547.1 52.69 98.80 N/A
268435456 67108864 float sum 4609.7 58.23 109.19 N/A 4645.1 57.79 108.36 N/A
536870912 134217728 float sum 8093.6 66.33 124.37 N/A 7971.2 67.35 126.28 N/A
1073741824 268435456 float sum 15227 70.51 132.21 N/A 14959 71.78 134.59 N/A
# Out of bounds values : 0 OK
# Avg bus bandwidth : 39.4978