NCCL环境搭建
所有文档
menu

GPU云服务器

NCCL环境搭建

产品详情自助选购

概览

NCCL是NVIDIA面向GPU提供的集合通信库,能实现Collective通信和点对点通信,是在大规模AI训练中必备的组件。结合云上的弹性高性能计算集群EHC GPU实例,可极大加速训练速度。本文将介绍如何准备在实例中测试NCCL所需要的必备环境。

需求场景

  • 大规模人工智能训练
  • 高性能计算HPC

配置步骤

环境准备

  1. 安装GPU运行必备环境,包括GPU驱动等,可参考支持自动安装GPU环境的创建GPU实例或者手动安装GPU驱动
  2. 安装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
  1. 使能GPU Direct RDMA需要加载nv_peer_mem服务,NVIDIA在驱动版本470已预装了该组件,可直接按以下步骤加载相应模块。
modprobe nvidia_peermem
# 可通过 lsmod|grep nvidia 检查

加载完后,可直接跳转至环境变量设置步骤。

  1. 如果您使用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
  1. 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
  1. 拉取并编译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
  1. 验证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 
## 输出一大串版本号则正常
  1. 拉取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库
  1. 拉取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
  1. 建立实例之间的的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
  1. 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

相关产品

GPU云服务器

上一篇
使用RAPIDS加速数据科学任务
下一篇
基于Nvidia Clara Parabricks的基因测序加速