基于eRDMA增强型实例部署AI训练集群

基于eRDMA增强型实例部署AI训练集群,可以充分利用eRDMA提供的低延迟、高吞吐以及低CPU占用等特性,提升集群计算效率和响应速度,优化资源使用。文介绍如何在eRDMA增强型实例上部署AI训练集群,并测试其性能。

AI训练场景架构

目前AI分布式训练场景主要的架构如下图所示。主流AI框架底层通过多种不同的通信后端进行多机或多卡通信,例如:

  • MPI/Gloo后端多用于CPU的控制流通信。

  • NCCL是由NVIDIA开源的GPU多机多卡实现,旨在提供高效的大数据流通信。因此,它在性能优化方面具有得天独厚的优势,被广泛应用于主流AI框架中,并成为推荐的通信后端。

  • 在NCCL底层通信链接上,有多种不同的传输方式,例如单机内部多卡P2P通信以及多机上的传统socket通信(如VPC网络)和高性能的InfiniBand(IB)通信,其中eRDMA是一种基于RDMA的传输方式,具有极低的延迟,并且在性能上接近RDMA网络的优势。使用eRDMA不需要修改业务组网,且在NCCL后端的场景下可以无缝使用。

image

步骤一:创建eRDMA实例

具体操作,请参见在GPU实例上配置eRDMA

搭建本集群环境需要创建两台ECS实例,实例配置示例如下:

  • 规格:ecs.ebmgn7ex.32xlarge

  • 实例私网IP地址:

    • 实例A:172.20.20.145

    • 实例B:172.20.20.143

步骤二:搭建环境

您可以通过以下两种方式来搭建AI训练的环境。

方式1 通过ECS实例启动AI训练

  • 搭建GPU环境

    GPU云服务器提供GPU加速计算能力,实现GPU计算资源的即开即用和弹性伸缩。更多信息,请参见什么是GPU云服务器

    步骤一:创建eRDMA实例时,配置镜像时需按以下步骤配置:选择镜像

    1. 选择所需的操作系统及版本。支持的镜像及版本请参见使用限制

    2. 选中安装GPU驱动,然后再选择对应的CUDA版本、Driver版本和CUDNN版本。

  • 搭建NCCL环境

    NVIDIA集体通信库(NCCL)是英伟达基于NVIDIA-GPU的一套开源的集体通信库,实现了针对NVIDIA GPU性能优化的多GPU和多节点集体通信原语。NCCL提供了诸如all-gather、all-reduce、broadcast、reduce、reduce-scatter等实现,这些实现经过优化后可以通过PCIe和NVLink等高速互联,从而实现高带宽和低延迟。

    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 运行以下命令,安装git。

       yum install -y git
    3. 依次运行以下命令,编译nccl。

      cd /root
      git clone https://github.com/NVIDIA/nccl.git
      cd nccl/
      make -j src.build NVCC_GENCODE="-gencode=arch=compute_80,code=sm_80"
    4. 依次运行以下命令,编译nccl-test。

      cd /root
      git clone https://github.com/NVIDIA/nccl-tests.git
      cd nccl-tests/
      make -j MPI=1 NCCL_HOME=/root/nccl/build/
  • 搭建MPI环境

    MPI(Message Passing Interface)是支持多种编程语言的并行计算通信库,具有高性能、大规模性、可移植性、可扩展性等特点。

    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 运行以下命令,安装MPI环境。

      yum install -y libgfortran4 libgfortran
      wget https://aiacc.oss-accelerate.aliyuncs.com/build/openmpi-4.0.1-1.el7.x86_64.rpm
      rpm -i openmpi-4.0.1-1.el7.x86_64.rpm
  • 搭建AIACC环境

    神龙AI加速引擎AIACC是基于阿里云IaaS资源推出的AI加速引擎,用于优化基于AI主流计算框架搭建的模型,能显著提升训练和推理性能。其中AIACC的aiacc-nccl-plugin组件可以提供eRDMA无感使用的易用性能力以及通信性能优化能力。更多信息,请参见什么是神龙AI加速引擎AIACC

    说明

    aiacc-nccl-plugin组件已经默认集成在eRDMA驱动中,如果已安装eRDMA驱动,就可以直接使用,无需再重复安装aiacc-nccl-plugin。

    AIACC环境支持的版本及操作系统如下:

    • nccl2.8.x~2.16.x的所有版本

    • CentOS 7.x/8.x、Alibaba Cloud Linux、Ubuntu 18/20等多种操作系统

    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 运行以下命令,安装AIACC环境。

      • 方式一:通过rpm包安装

        wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/nccl-plugin/rpm/aiacc-nccl-plugin-1.1.0.rpm
        rpm -i aiacc-nccl-plugin-1.1.0.rpm
      • 方式二:通过deb包安装

        wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/nccl-plugin/deb/aiacc-nccl-plugin-1.1.0.deb
        dpkg -i aiacc-nccl-plugin-1.1.0.deb
  • 部署AI环境

    1. 远程连接ECS实例。

      具体操作,请参见通过密码或密钥认证登录Linux实例

    2. 运行以下命令,创建Python环境。

      wget https://ali-perseus-build-dep.oss-cn-huhehaote.aliyuncs.com/Miniconda3-latest-Linux-x86_64.sh
      bash Miniconda3-latest-Linux-x86_64.sh
      source /root/miniconda3/etc/profile.d/conda.sh
      conda create -n py3.8.13_torch1.10.1_cu111 python=3.8
    3. 运行以下命令,以PyTorch为例安装AI框架。

      conda activate py3.8.13_torch1.10.1_cu111
      pip install torch==1.10.1+cu111 torchvision==0.11.2+cu111 torchaudio==0.10.1 -f https://download.pytorch.org/whl/torch_stable.html

      若系统返回类似如下信息时,则表示AI框架安装成功。安装AI框架

方式2 通过容器启动AI训练

  1. 创建并分别远程连接两台符合要求的ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 构建容器镜像。

    在Dockerfile中增加eRDMA驱动的安装,重新构建应用容器镜像,以便镜像中的应用能够使用eRDMA。具体的操作命令如下:

    • Alibaba Cloud Linux/CentOS

      1. /etc/yum.repos.d创建一个erdma.repo源文件。

        vim /etc/yum.repos.d/erdma.repo
      2. i键进入编辑模式,在文件中添加如下内容。

        [erdma]
        name = ERDMA Repository
        baseurl = https://mirrors.aliyun.com/erdma/yum/redhat/$releasever/erdma/x86_64
        gpgcheck = 1
        enabled = 1
        gpgkey = https://mirrors.aliyun.com/erdma/GPGKEY
      3. Esc键退出编辑模式,输入:wq并按下Enter键,保存并退出文件。

      4. 运行以下命令,更新yum源缓存。

        yum makecache
      5. 运行以下命令,安装相应的用户态驱动包。

        yum install libibverbs rdma-core librdmacm libibverbs-utils aiacc-nccl-plugin -y
    • Ubuntu

      1. 运行以下命令,添加PGP签名。

        wget -qO - https://mirrors.aliyun.com/erdma/GPGKEY | apt-key add -
      2. 运行以下命令,添加apt源。

        • Ubuntu 20.04

          echo "deb [ arch=amd64 ] https://mirrors.aliyun.com/erdma/apt/ubuntu focal/erdma main" | tee /etc/apt/sources.list.d/erdma.list
        • Ubuntu 18.04

          echo "deb [ arch=amd64 ] https://mirrors.aliyun.com/erdma/apt/ubuntu bionic/erdma main" | tee /etc/apt/sources.list.d/erdma.list
      3. 运行以下命令,更新apt源。

        sudo apt update
      4. 运行以下命令,安装用户态驱动。

        apt install libibverbs1 ibverbs-providers ibverbs-utils librdmacm1 aiacc-nccl-plugin -y
  3. 运行以下命令,启动容器。

    docker run -it \
    --runtime=nvidia --shm-size=8g --ipc=host \
    --device=/dev/infiniband/rdma_cm \
    --device=/dev/infiniband/uverbs0 \
    --device=/dev/infiniband/uverbs1 \
    --ulimit memlock=-1 \
    --net=host \
    <docker_image_id> /bin/bash
    说明

    其中,3~4行用于将设备透入到容器内、第6行配置max locked memory为unlimited、第7行用于将underlay的网络设备透入到容器内。

  4. 运行以下命令,查看eRDMA的状态。

    ibv_devinfo

    如下图所示,可以看到2个eRDMA设备的端口状态均为PORT_ACTIVE时,表示容器配置正常。RDMA设备

步骤三:配置实例免密登录

通过nccl、e2e测试性能前,需要配置各实例之间可以免密登录。

  1. 远程连接其中一台ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 运行以下命令,生成密钥。

    ssh-keygen -t rsa

    一直按Esc键,直到结束。

  3. 运行以下命令,获取并复制生成的公钥。

    cat ~/.ssh/id_rsa.pub
  4. 运行以下命令,将公钥拷贝至各实例。

    echo <公钥> >> ~/.ssh/authorized_keys
    重要

    该步骤需要在每台ECS实例上分别执行。

  5. 运行以下命令,测试是否可以免密登录。

    ssh <另一台ECS实例的私网IP地址>

    若系统返回类似如下信息,例如实例A可以登录到实例B,则表示免密登录成功。免密登录

步骤四:性能测试

您可以通过nccl、e2e这两种方式来测试AI训练的性能。

nccl性能测试

说明

为完成测试,您需要在集群中的两台ECS实例上分别执行以下操作。

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 运行以下命令,进入nccl-tests目录。

    cd nccl-tests/
  3. 新建集群IP地址信息文件。

    1. 运行以下命令,新建文件,例如hostfile.txt

      vim hostfile.txt
    2. i键进入编辑模式,在文件中添加集群信息。

      172.20.20.145
      172.20.20.143
      说明

      172.20.20.145172.20.20.143是ECS实例的私网IP地址,您需要根据实际环境替换。ECS实例的私网IP地址在步骤一:创建eRDMA实例时已获取。

    3. Esc键退出编辑模式,输入:wq并按下Enter键,保存并退出文件。

  4. 准备运行脚本。

    1. 运行以下命令,新建脚本,例如run.sh

      vim run.sh
    2. i键进入编辑模式,在脚本中添加以下内容。

      NP=16
      NPER=8
      HOSTFILE=hostfile.txt
      export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/:/root/nccl/build/lib/
      mpirun --allow-run-as-root -np $NP -npernode $NPER --hostfile $HOSTFILE \
        -x PATH -x LD_LIBRARY_PATH \
        -x NCCL_DEBUG=INFO \
        --bind-to none \
         -mca btl_tcp_if_include eth0 \
        ./build/all_reduce_perf -b 1B -e 512M -f 2 -g 1 -n 1000 -w 1000 -c 0 -z 0 -o sum
    3. Esc键退出编辑模式,输入:wq并按下Enter键,保存并退出文件。

  5. 运行以下命令,运行run.sh脚本,启动nccl-test。

    bash run.sh

    若系统返回类似如下的测试数据,则表示nccl性能测试完成。

    iZwz92j225su3pa9gfs****:127727:127784 [0] NCCL INFO Plugin Path : /usr/local/lib/libnccl-net.so
    iZwz92j225su3pa9gfs****:127727:127784 [0] NCCL INFO P2P plugin AIACC-2.0-RDMA
    iZwz92j225su3pa9gfs****:127727:127784 [0] NCCL INFO NCCL_AIACC_DISABLE set by environment to 0.
    iZwz92j225su3pa9gfs****:127727:127784 [0] NCCL INFO NCCL_AIACC_CONFIG_DISABLE set by environment to 0.
    iZwz92j225su3pa9gfs****:127727:127784 [0] NCCL INFO NET/IB : Using [0]rocep16s0:1/RoCE [1]rocep138s0:1/RoCE ; OOB eth0:192.168.30.166<0>
    iZwz92j225su3pa9gfs****:127727:127784 [0] NCCL INFO Using network AIACC-2.0-RDMA
    
    #                                                     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)
    
               0             0   float     sum    50.50    0.00    0.00    N/A
               0             0   float     sum    51.45    0.00    0.00    N/A
               4             1   float     sum    95.84    0.00    0.00    N/A
               8             2   float     sum    92.74    0.00    0.00    N/A
              16             4   float     sum    92.27    0.00    0.00    N/A
              32             8   float     sum    91.87    0.00    0.00    N/A
              64            16   float     sum    92.97    0.00    0.00    N/A
             128            32   float     sum    92.10    0.00    0.00    N/A
             256            64   float     sum    93.16    0.00    0.01    N/A
             512           128   float     sum    94.11    0.01    0.01    N/A
            1024           256   float     sum    95.40    0.01    0.02    N/A
            2048           512   float     sum    98.20    0.02    0.04    N/A
            4096          1024   float     sum    100.7    0.04    0.08    N/A
            8192          2048   float     sum    108.8    0.08    0.14    N/A
           16384          4096   float     sum    112.5    0.15    0.27    N/A
           32768          8192   float     sum    123.0    0.27    0.50    N/A
           65536         16384   float     sum    143.8    0.46    0.85    N/A
          131072         32768   float     sum    188.0    0.70    1.31    N/A
          262144         65536   float     sum    228.0    1.15    2.16    N/A
          524288        131072   float     sum    313.6    1.67    3.13    N/A
         1048576        262144   float     sum    486.3    2.16    4.04    N/A
         2097152        524288   float     sum    449.4    4.67    8.75    N/A
         4194304       1048576   float     sum    664.6    6.31   11.83    N/A
         8388608       2097152   float     sum   1112.9    7.54   14.13    N/A
        16777216       4194304   float     sum   2098.7    7.99   14.99    N/A
        33554432       8388608   float     sum   3998.1    8.39   15.74    N/A
        67108864      16777216   float     sum   7489.1    8.96   16.80    N/A
       134217728      33554432   float     sum    14239    9.43   17.67    N/A
       268435456      67108864   float     sum    27488    9.77   18.31    N/A
       536870912     134217728   float     sum    54083    9.93   18.61    N/A
    说明

    nccl日志说明:Using network AIACC-2.0-RDMA表示正确安装并使用aiacc-nccl-plugin。

    性能数据说明:第五列值表示nccl通信的性能,表示AI训练的耗时,单位为us,值越小表示性能越好。

e2e性能测试

说明

您需要分别在集群(本示例的两台ECS实例)上执行如下操作来完成测试。

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 运行以下命令,准备模型代码。

    wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/example/benchmark.py
  3. 准备启动脚本。

    eRDMA安装aiacc-nccl-plugin之后无需指定任何额外通信参数,默认自动识别。您也可以按照如下操作自行制定:

    1. 运行以下命令,新建脚本,例如train.sh

      vim train.sh
    2. i键进入编辑模式,在脚本中添加以下内容。

      #! /bin/bash
      
      MASTER_ADDR=172.20.20.148
      MASTER_PORT=6000
      NNODES=$1
      NODE_RANK=$2
      GPUS_PER_NODE=8
      WORLD_SIZE=$(($GPUS_PER_NODE*$NNODES))
      
      BS=2
      DISTRIBUTED_ARGS="--nproc_per_node $GPUS_PER_NODE --nnodes $NNODES --node_rank $NODE_RANK --master_addr $MASTER_ADDR --master_port
       $MASTER_PORT"
      
      python -m torch.distributed.launch $DISTRIBUTED_ARGS benchmark.py \
        --world-size=$WORLD_SIZE --master-addr=$MASTER_ADDR --master-port=$MASTER_PORT
      说明

      172.20.20.148是另一台ECS实例的私网IP地址,您需要根据实际环境替换。

  4. Esc键退出编辑模式,输入:wq并按下Enter键,保存并退出文件。

  5. 运行以下命令,启动训练。

    bash train.sh 2 0
    重要

    在另一台ECS实例上,需执行bash train.sh 2 1命令。

    若系统返回类似如下的测试数据,则表示e2e性能测试完成。

    16 GPUs --    2M/8G:  p50:  0.098s    1306/s  p75:  0.098s    1304/s  p90:  0.098s    1302/s  p95:  0.098s    1302/s

    其中1306/s表示数据吞吐量,即每秒处理的训练样本数量,数值越大表示性能越好。