You need to enable JavaScript to run this app.
导航

HPC-基于NCCL通信库的多机RDMA网络性能测试

最近更新时间2023.12.07 17:10:25

首次发布时间2022.03.17 18:02:01

本文介绍如何使用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

推荐配置为: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_IB_DISABLE=0

NCCL_DEBUG

NCCL日志级别

推荐设置为:
NCCL_DEBUG=INFO

NCCL_IB_TIMEOUT

网络断点重连超时时间

推荐设置为:
NCCL_IB_TIMEOUT=23

NCCL_IB_RETRY_CNT

网络断点重连重试次数

推荐设置为:
NCCL_IB_RETRY_CNT=7

NCCL_DEBUG_FILE

日志输出文件

配置样例为:
NCCL_DEBUG_FILE=nccl_log_%h_%p (%h为节点hostname,%p为进程pid)

不同规格的ECS配置参数推荐:

针对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驱动版本:470.129.06
  • CUDA版本:11.4
  • OpenMPI版本:4.1.3
  • NCCL版本:2.11.4-1

第一步:创建双节点hpcg1ve GPU实例

请参考创建高性能GPU实例,构建高性能计算集群并创建两台HPC GPU实例。

第二步:安装相关驱动和工具

请登录各节点,完成本节操作。

  1. 检查NVIDIA驱动

    执行nvidia-smi命令,查看GPU驱动版本和匹配的CUDA版本。
    alt

  2. 安装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已安装成功。
    
  3. 安装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。
    
  4. 安装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 
    
  5. 将配置导入环境变量配置文件 /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 #加载环境变量
    
  6. 安装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
    

第三步:配置节点间免密登陆

  1. 修改本地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
    
  2. 创建密钥对,并拷贝至其他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地址。
    

第四步:使用PerfTest测试节点间带宽和时延

  1. 在节点A执行以下命令,查询mlx5_1网卡的IP地址。

    1. 执行ibdev2netdev命令,查看节点网卡与mlx5_1网卡的对应关系。

      alt

    2. 执行ifconfig命令,查询mlx5_1网卡对应的节点网卡的IP地址:

      alt

    3. 执行以下命令。

      ib_write_bw -a -b -d mlx5_1 -x 3 --report_gbits

  2. 在节点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

    回显如下,查看节点间带宽和时延。

    alt

第五步:使用NCCL Tests测试工具评估集群性能

执行以下命令。

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

回显如下,查看集群性能。

alt