本文介绍如何使用NCCL集合通信库测试多台高性能计算GPU实例组成的集群的性能。
火山引擎高性能计算GPU(简称HPC GPU)实例为云端机器学习 (ML) 训练和高性能计算 (HPC) 应用程序提供了最高性能,研究人员、数据科学家和开发人员可以在几分钟内部署多节点ML训练工作负载或紧密耦合的分布式HPC应用程序。
为了更加准确、全面的评估多台实例组成的集群的性能,我们推荐采用NCCL(NVIDIA Collective Communications Library)集合通信库测试,可在实例内和实例间实现多个GPU的快速集合。如何配置NCCL?
本文基于火山引擎创建两台高性能计算GPU型机器,请根据实际需要选择计算规格。
火山引擎高性能计算GPU型实例
高性能计算GPU型实例实例在GPU型规格和基础私有网络VPC的基础上,加入RDMA网络,可大幅提升内网网络性能,提高大规模集群加速比,适用于高性能计算、人工智能、机器学习等业务场景。更多介绍请参见:高性能计算GPU型规格介绍。
OpenMPI
OpenMPI是一个开源的 Message Passing Interface 实现,是一种高性能消息传递库,能够结合整个高性能计算社区的专业知识、技术和资源,建立现有的最佳MPI库。OpenMPI在系统和软件供应商、应用开发者和计算机科学研究人员中有广泛应用。
NCCL
NCCL(Nvidia Collective multi-GPU Communication Library,读作 "Nickel")是一个提供GPU间通信基元的库,它具有拓扑感知能力,可以轻松集成到应用程序中。NCCL做了很多优化,以在PCIe、Nvlink、InfiniBand上实现较高的通信速度。NCCL支持安装在单个节点或多个节点上的大量GPU卡上,并可用于单进程或多进程(如MPI)应用。
NCCL Tests
NCCL Tests是一个测试工具集,可以用来评估NCCL的运行性能和正确性。
环境变量 | 解释 | hpcg1ve规格设置 | hpcpni2规格设置 | ebmhpcpni2/ebmhpchfpni2规格设置 |
---|---|---|---|---|
NCCL_IB_HCA | 环境中的RDMA网卡 | 推荐配置为: | 推荐配置为:NCCL_IB_HCA=mlx5_1:1,mlx5_2:1,mlx5_3:1,mlx5_4:1 | |
NCCL_SOCKET_IFNAME | 指定用于通信的IP接口 | 设置成主机的host网卡,可通过ip a查找,推荐配置为:NCCL_SOCKET_IFNAME=eth1 | ||
NCCL_IB_GID_INDEX | 设置RDMA通信优先级 | 执行show_gids确认对应的RoCE网卡gid index,推荐配置为:NCCL_IB_GID_INDEX=3 | ||
NCCL_IB_DISABLE | 是否关闭RDMA通信 | 设置成1来启用TCP通信(非RDMA),推荐配置为: | ||
NCCL_DEBUG | NCCL日志级别 | 推荐设置为: | ||
NCCL_IB_TIMEOUT | 网络断点重连超时时间 | 推荐设置为: | ||
NCCL_IB_RETRY_CNT | 网络断点重连重试次数 | 推荐设置为: | ||
NCCL_DEBUG_FILE | 日志输出文件 | 配置样例为: |
针对hpcg1ve规格:
NCCL_IB_HCA=mlx5_1:1 NCCL_IB_DISABLE=0 NCCL_SOCKET_IFNAME=eth1 NCCL_IB_GID_INDEX=3 NCCL_IB_TIMEOUT=23 NCCL_IB_RETRY_CNT=7
针对hpcpni2规格:
NCCL_IB_HCA=mlx5_1:1,mlx5_2:1,mlx5_3:1,mlx5_4:1 NCCL_IB_DISABLE=0 NCCL_SOCKET_IFNAME=eth0 NCCL_IB_GID_INDEX=3 NCCL_NET_GDR_LEVEL=1 NCCL_IB_TIMEOUT=23 NCCL_IB_RETRY_CNT=7
针对ebmhpcpni2/ebmhpchfpni2规格:
NCCL_IB_HCA=mlx5_1:1,mlx5_2:1,mlx5_3:1,mlx5_4:1 NCCL_IB_DISABLE=0 NCCL_SOCKET_IFNAME=eth0 NCCL_IB_GID_INDEX=3 NCCL_NET_GDR_LEVEL=2 NCCL_IB_TIMEOUT=23 NCCL_IB_RETRY_CNT=7
本实践以CentOS 7.8操作系统为例,选用组件版本如下:
请参考创建高性能GPU实例,构建高性能计算集群并创建两台HPC GPU实例。
请登录各节点,完成本节操作。
检查NVIDIA驱动
执行nvidia-smi
命令,查看GPU驱动版本和匹配的CUDA版本。
安装CUDA驱动,请依次执行以下命令。
wget https://developer.download.nvidia.cn/compute/cuda/11.4.4/local_installers/cuda_11.4.4_470.82.01_linux.run sh cuda_11.4.4_470.82.01_linux.run /usr/local/cuda/bin/nvcc -V #查看CUDA版本,可正确查看,表示CUDA已安装成功。
安装NCCL,请依次执行以下命令。
yum install yum-utils sudo yum-config-manager --add-repo http://developer.download.nvidia.com/compute/cuda/repos/rhel7/x86_64/cuda-rhel7.repo sudo yum install libnccl-2.11.4-1+cuda11.0 libnccl-devel-2.11.4-1+cuda11.0 libnccl-static-2.11.4-1+cuda11.0 #使用新版本NCCL。
安装OpenMPI,请依次执行以下命令。
yum group install "Development Tools" wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.1.tar.gz tar -xvzf openmpi-4.1.1.tar.gz cd openmpi-4.1.1/ ./configure --prefix=/usr/local/openmpi make -j 80 make install -j 80 export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:/usr/local/nccl_2.11.4-1+cuda11.0_x86_64/lib:/usr/local/openmpi/lib:$LD_LIBRARY_PATH export PATH=/usr/local/openmpi/bin:/usr/local/cuda-11.0/bin:$PATH ldconfig
将配置导入环境变量配置文件 /root/.bashrc
。
# .bashrc # User specific aliases and functions alias rm='rm -i' alias cp='cp -i' alias mv='mv -i' # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi export LD_LIBRARY_PATH=/usr/local/cuda-11.0/lib64:/usr/local/nccl_2.11.4-1+cuda11.0_x86_64/lib:/usr/local/openmpi/lib:$LD_LIBRARY_PATH export PATH=/usr/local/openmpi/bin:/usr/local/cuda-11.0/bin:$PATH
source .bashrc #加载环境变量
安装NCCL Tests,请依次执行以下命令。
wget https://github.com/NVIDIA/nccl-tests/archive/refs/tags/v2.10.1.tar.gz make -j40 MPI=1 MPI_HOME=/usr/local/openmpi CUDA_HOME=/usr/local/cuda-11.0 NCCL_HOME=/usr/local/nccl_2.11.4-1+cuda11.0_x86_64
修改本地sshd配置。
Disable strictHostKeyChecking and enable ForwardAgent on the leader node. Open ~/.ssh/config using your preferred text editor and add the following. Host * ForwardAgent yes Host * StrictHostKeyChecking no
创建密钥对,并拷贝至其他HPC GPU节点。
ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa scp ~/.ssh/id_rsa.pub root@192.XX.XX.205:~/.ssh/authorized_keys #root@后需替换为其他节点IP地址。
在节点A执行以下命令,查询mlx5_1网卡的IP地址。
执行ibdev2netdev
命令,查看节点网卡与mlx5_1网卡的对应关系。
执行ifconfig
命令,查询mlx5_1网卡对应的节点网卡的IP地址:
执行以下命令。
ib_write_bw -a -b -d mlx5_1 -x 3 --report_gbits
在节点B执行以下命令,IP地址(198.XX.XX.XX)需替换为节点A的mlx5_1网卡IP。
ib_write_bw -a -b -F 198.XX.XX.XX -d mlx5_1 --report_gbits -x 3
回显如下,查看节点间带宽和时延。
执行以下命令。
mpirun -x NCCL_IB_HCA=mlx5_1:1 -x NCCL_IB_DISABLE=0 -x NCCL_SOCKET_IFNAME=eth1 -x NCCL_IB_GID_INDEX=3 -x NCCL_IB_TIMEOUT=23 -x NCCL_IB_RETRY_CNT=7 -hostfile hostfile -n 16 -N 8 --allow-run-as-root --mca btl tcp,self --mca btl_tcp_if_exclude lo,mlx5_0 ./build/all_reduce_perf -b 8 -e 1G -f 2 -g 1 -c 1 -n 100
回显如下,查看集群性能。