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

HPC裸金属-基于NCCL的单机/多机RDMA网络性能测试

最近更新时间2023.09.28 17:11:07

首次发布时间2023.09.05 16:00:26

本文介绍如何在虚拟环境或容器环境中,使用NCCL测试ebmhpcpni2l实例的RDMA网络性能。

背景信息

ebmhpcpni2l实例搭载NVIDIA A800显卡,同时支持800Gbps RDMA高速网络,大幅提升集群通信性能,提高大规模训练加速比。更多信息,请参见高性能计算GPU型ebmhpcpni2l

NCCL是NVIDIA的集合通信库,支持安装在单个节点或多个节点的大量GPU卡上,实现多个GPU的快速通信。

关键组件

本文所述操作需要安装的软件包介绍如下。

关键组件
说明

NVIDIA驱动

  • GPU驱动:用来驱动NVIDIA GPU卡的程序。

  • CUDA工具包:使GPU能够解决复杂计算问题的计算平台。

  • cuDNN库:NVIDIA CUDA(®) 深度神经网络库,用于实现高性能GPU加速。

OpenMPIOpenMPI是一个开源的 Message Passing Interface 实现,是一种高性能消息传递库,能够结合整个高性能计算社区的专业知识、技术和资源,建立现有的最佳MPI库。OpenMPI在系统和软件供应商、应用开发者和计算机科学研究人员中有广泛应用。
NCCLNCCL(Nvidia Collective Communication Library)是NVIDIA的集合通信库,支持安装在单个节点或多个节点的大量GPU卡上,实现多个GPU的快速通信。
NCCL TestsNCCL Tests是一个测试工具集,可以用来评估NCCL的运行性能和正确性。
OFEDMLNX OFED(OpenFabrics Enterprise Distribution)是一组开源软件驱动、核心内核代码、中间件和支持InfiniBand Fabric的用户级接口程序,用于监视InfiniBand网络的运行情况,包括监视传输带宽和监视Fabric内部的拥塞情况。

前提条件

您已购买两台ebmhpcpni2l实例,并勾选“后台自动安装GPU驱动”,即可使实例在启动时自动安装NVIDIA驱动。具体配置如下表所示,购买实例请参见购买高性能计算GPU型实例

实例规格实例数量镜像类型驱动安装/版本是否绑定公网IP

ecs.ebmhpcpni2l.32xlarge

2

Ubuntu 20.04

创建实例时勾选“后台自动安装GPU驱动”:系统将自动安装GPU驱动、CUDA和cuDNN库(驱动版本见下图)以及Faric manager安装包。

说明

实例创建完成后您只需启动NVIDIA-Fabric Manager即可。

是,如未绑定,请参见绑定公网IP

方式一:在虚拟环境中测试网络性能

步骤一:搭建Pytorch虚拟环境

搭建Pytorch虚拟环境,具体操作请参见GPU-部署Pytorch应用

步骤二:搭建NCCL环境

  1. 执行以下命令,查看CUDA驱动版本。
    /usr/local/cuda/bin/nvcc -V
    回显如下,表示已安装CUDA,版本为11.4。
    alt

  2. 依次执行以下命令,安装适用于CUDA 11的NCCL。
    如需安装适用于其它CUDA的NCCL,请参考NIDIA-NCCL官网

    wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2004/x86_64/cuda-keyring_1.0-1_all.deb
    sudo dpkg -i cuda-keyring_1.0-1_all.deb
    sudo apt update
    sudo  apt install libnccl2=2.8.4-1+cuda11.2 libnccl-dev=2.8.4-1+cuda11.2
    
  3. 执行以下命令,检查NCCL是否安装成功。

    updatedb
    ldconfig -v | grep "libnccl.so" | tail -n1 | sed -r 's/^.*\.so\.//'
    

    回显如2.8.4,表示安装成功。

  4. 配置NCCL环境变量。

    1. 执行vim /etc/profile命令,打开配置文件。

    2. i,进入编辑模式。

    3. 在文件末尾添加如下参数。各参数相关介绍请参见关键环境变量说明

      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_DEBUG=INFO
      
    4. Esc退出编辑模式,输入:wq并按下Enter键,保存并退出文件。

    5. 执行source /etc/profile命令,使配置更新生效。

  5. 执行以下命令,加载nv_peer_mem服务使能GPU Direct RDMA。

    apt-get install nvidia-modprobe
    modprobe nvidia_peermem
    

步骤三:安装OpenMPI

  1. 依次执行以下命令,安装OpenMPI。

    cd ~
    wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.4.tar.bz2
    tar xf openmpi-4.1.4.tar.bz2
    cd openmpi-4.1.4
    ./configure --prefix=/usr/local/openmpi 2>&1 | tee config.out
    make -j 80 all 2>&1 | tee make.out
    make install 2>&1 | tee install.out
    sed -i '1i\export PATH=/usr/local/openmpi/bin:$PATH' ~/.bashrc
    source ~/.bashrc
    
  2. 检查是否正常安装。
    mpiexec --version
    回显如下,表示已正常安装。

步骤四:安装NCCL Tests

  1. 依次执行以下命令,安装NCCL Tests。

    cd ~
    wget https://github.com/NVIDIA/nccl-tests/archive/refs/tags/v2.10.1.tar.gz
    tar -zxvf v2.10.1.tar.gz
    cd nccl-tests-2.10.1
    make -j40 MPI=1  MPI_HOME=/usr/local/openmpi CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/lib/x86_64-linux-gnu
    sed -i '1i\export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/lib/x86_64-linux-gnu:/usr/local/openmpi/lib:$LD_LIBRARY_PATH' ~/.bashrc
    source ~/.bashrc
    

步骤五:性能测试

单机性能测试

执行以下命令,测试单机性能。
./build/all_reduce_perf -b 256M -e 8G -f 2 -g 8 -n 100 -w 20

回显如下所示,本例中A800单机平均带宽为155GB/s。
alt

说明

执行该命令后若报错,说明NCCL Tests未正常安装,请执行步骤四重试。

多机性能测试

进行多机测试时,请确认两台ebmhpcpni2l实例已加入同一高性能计算集群。

您可以在高性能计算集群控制台,单击目标集群进入“实例列表”页签查看集群绑定的实例。

  1. 配置多机间免密登录。

    1. 在A实例(Sever端)中依次执行以下命令,创建密钥对并开启读写权限。

      ssh-keygen -t rsa -N "" -f ~/.ssh/id_rsa
      chmod 600 ~/.ssh/id_rsa
      
    2. 在B实例(Client端)中执行以下命令,用于将A实例的密钥对拷贝至B实例。

      scp ~/.ssh/id_rsa.pub root@192.XX.XX.205:~/.ssh/authorized_keys #root@后需替换为B实例的host IP地址
      
  2. 在A实例中执行以下命令,检查RDMA网卡是否可以正常使用。 
      ib_write_bw
    回显如下,表示可以正常使用。

  3. 在B实例中使用NCCL Tests评估集群性能。

    mpirun --oversubscribe --allow-run-as-root -mca plm_rsh_args "-p 22 -q -o StrictHostKeyChecking=no" -n 16 -N 8 -H 192.168.0.128:1,192.168.0.127:1 -bind-to socket -map-by slot -mca pml ob1 -mca btl ^openib -mca orte_base_help_aggregate 0 -mca btl_tcp_if_include eth0 -mca coll_hcoll_enable 0 -x NCCL_DEBUG=INFO  -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_IB_DISABLE=0 -x NCCL_NET_GDR_LEVEL=2 -x NCCL_IB_HCA=mlx5_1:1,mlx5_2:1,mlx5_3:1,mlx5_4:1 -x NCCL_IB_GID_INDEX=3 ~/nccl-tests-2.10.1/build/all_reduce_perf -b 256M -e 8G -f 2 -g 1 -c 1 -n 100
    

    alt

方式二:在容器环境中测试网络性能

步骤一:搭建容器环境

  1. 安装Docker,具体操作请参见安装Docker

  2. 在HPC实例上,依次执行以下命令,下载CUDA镜像,启动并进入容器。

    docker pull nvcr.io/nvidia/cuda:12.0.0-devel-ubuntu20.04
    nvidia-docker run --gpus all -it -v /run/nvidia-nvidia-docker run --gpus all --network host --ipc host --privileged -it <IMAGE ID> bash  #首次登录,请先运行容器,需要以host网络模式运行
    

    说明

    如果是非首次进入容器,请依次执行以下命令:
    其中,<container_id>需替换为执行docker ps后返回的容器ID。

    docker ps #查询对应容器
    docker exec -it <container_id> bash
    
  3. 在容器中,安装OFED驱动。

    1. 执行以下命令,安装对应容器的镜像版本的OFED驱动。
      如需下载其它系统环境对应的OFED,请访问NVIDIA官网

      wget https://image-bucket-beijing.tos-cn-beijing.volces.com/MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64.tgz 
      tar zxvf MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64.tgz
      cd MLNX_OFED_LINUX-5.4-1.0.3.0-ubuntu20.04-x86_64
      ./mlnxofedinstall --without-fw-update --vma --skip-distro-check --user-space-only --force
      
    2. 执行以下命令,检查OFED是否安装。
      ofed_info -s
      回显如下,表示已安装。
      alt

  4. 在容器中安装所需软件包,包括RDMA相关库、NCCL、OpenMPI、NCCL Tests等,具体操作请参见配置容器环境

步骤二:性能测试

单机性能测试

执行以下命令,测试单机性能。
./build/all_reduce_perf -b 256M -e 8G -f 2 -g 8 -n 100 -w 20
回显如下所示,本例中A800单机平均带宽为155GB/s。
alt

说明

执行该命令后若报错,说明NCCL Tests未正常安装,请参考步骤一的第4步在容器中重新安装NCCL Tests后重试。

多机性能测试

多机性能测试操作请参见多实例集合通信能力测试