eRDMA:使用高性能网络进行分布式训练

更新时间:
复制为 MD 格式

弹性RDMA(Elastic Remote Direct Memory Access,简称eRDMA)是阿里云自研的云上弹性RDMA网络。PAI通用计算资源中的部分GPU机型已支持eRDMA能力,您只需使用特定镜像提交基于这些GPU机型的DLC任务,系统将自动在容器内挂载eRDMA网卡,从而加速分布式训练过程。

使用限制

  • 仅适用于基于通用计算资源(预付费)提交的训练作业。

  • 仅适用于2.19及以上的NCCL版本。

  • 目前PAI DLC平台支持eRDMAGPU机型及对应的eRDMA网卡数量如下:

    GPU机型

    eRDMA网卡数量

    ecs.ebmgn7v.32xlarge

    2

    ecs.ebmgn8v.48xlarge

    2

    ecs.ebmgn8is.32xlarge

    2

    ecs.ebmgn8i.32xlarge

    4

    ecs.gn8is.2xlarge

    1

    ecs.gn8is.4xlarge

    1

    ecs.gn8is-2x.8xlarge

    1

    ecs.gn8is-4x.16xlarge

    1

    ecs.gn8is-4x.16xlarge

    1

平台预置环境变量

PAI基于通用计算资源中已经支持eRDMA的机型,自动开启了eRDMA特性,并默认设置了NCCL环境变量。您可以根据训练框架、通信框架以及模型特点进行必要的调整。强烈建议您使用平台预置系统内的默认变量, 可以获得较优性能。

公共环境变量

环境变量

PYTHONUNBUFFERED

1

TZ

根据当前作业所在的Region进行设定,一般是"Asia/Shanghai"。

eRDMA高性能网络变量

说明

值“-”表示该环境变量在该环境中无效。

环境变量

NCCL_DEBUG

INFO

NCCL_SOCKET_IFNAME

eth0

NCCL_IB_TC

-

NCCL_IB_SL

-

NCCL_IB_GID_INDEX

1

NCCL_IB_HCA

erdma

NCCL_IB_TIMEOUT

-

NCCL_IB_QPS_PER_CONNECTION

8

NCCL_MIN_NCHANNELS

16

NCCL_NET_PLUGIN

none

配置自定义镜像

基于支持eRDMA的通用计算资源提交训练任务时,您可以自行构建并使用自定义镜像。注意事项如下:

环境要求

  • CUDA >= 12.1

  • NCCL >= 2.19

  • Python3

安装eRDMA

根据镜像中的Linux发行版本不同,eRDMA库安装也有所不同。以下内容以Ubuntu 22.04版本为例,介绍如何安装eRDMA库,代码示例如下:

# 添加PGP签名。
wget -qO - http://mirrors.cloud.aliyuncs.com/erdma/GPGKEY | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg
# 添加apt源。
mkdir -p /etc/apt/sources.list.d
echo "deb [ ] http://mirrors.cloud.aliyuncs.com/erdma/apt/ubuntu jammy/erdma main" | sudo tee /etc/apt/sources.list.d/erdma.list
# 更新&安装eRDMA用户态驱动程序包。
sudo apt update
sudo apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1

其他发行版本的安装流程,请参考Docker容器中使用eRDMA

示例Dockerfile

# ${user_docker_image_url} 请替换成您自己的已经存在的Docker镜像。
FROM ${user_docker_image_url}
# 如果镜像中已经预装了RDMA库,需要先卸载掉。
RUN rm /etc/apt/sources.list.d/mellanox_mlnx_ofed.list && \
    apt remove -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1
RUN wget -qO - http://mirrors.aliyun.com/erdma/GPGKEY | gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg && \
    echo "deb [ ] http://mirrors.aliyun.com/erdma/apt/ubuntu jammy/erdma main" | tee /etc/apt/sources.list.d/erdma.list && \
    apt update && apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1

使用MPIJob执行NCCL Test测试

提交使用MPIJob框架的训练任务,并配置以下关键参数,其他参数配置说明,请参见快速提交MPIJob训练任务

参数

描述

环境信息

节点镜像

镜像地址页签,输入已准备的自定义镜像。

您可以使用PAI-DLC提供的NCCL测试镜像,该镜像已预装了eRDMA的依赖:dsw-registry-vpc.<RegionID>.cr.aliyuncs.com/pai/nccl-tests:12.2.2-cudnn8-devel-ubuntu22.04-nccl2.19.3-1-85f9143

其中<RegionID>需替换为地域ID,例如华北6(乌兰察布)为cn-wulanchabu。更多关于地域ID的详细说明,请参见地域和可用区

启动命令

# -np 16 -npernode 8 表示使用2个节点,每个节点8张卡,总共16张卡。
mpirun --allow-run-as-root -np 16 -npernode 8 --bind-to none -mca btl_tcp_if_include eth0 -x UCX_TLS=tcp -x UCX_NET_DEVICES=eth0 -x NCCL_SOCKET_IFNAME=eth0 -x NCCL_IB_DISABLE=0 -x NCCL_IB_GID_INDEX=1 -x NCCL_IB_QPS_PER_CONNECTION=8 -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x NCCL_MIN_NCHANNELS=16 -x NCCL_ALGO=Ring -x PATH /opt/nccl-tests/build/all_reduce_perf -b 32K -e 4G -f 2 -g 1 -t 1 -n 20

资源信息

资源来源

选择资源配额

资源配额

选择已创建的通用计算资源配额,例如资源规格为ecs.ebmgn8v.48xlarge。如何创建资源配额,请参见通用计算资源配额

框架

选择MPIJob

任务资源

配置以下参数:

  • 节点数量:2

  • GPU(卡数):8

  • CPU(核数):64

  • 内存(GiB):256

  • 共享内存(GiB):256

eRDMA网络带宽的NCCL Test示例结果如下:

dlci              -worker-0:27:100 [2] NCCL INFO comm 0x5604ef4799e0 rank 2 nranks 16 cudaDev 2 nvmlDev 2 busId a2000 commId 0xbbe9b8703193e2e4 - Init COMPLETE
#
#                                                              out-of-place                       in-place
#       size         count      type   redop    root     time   algbw   busbw  #wrong     time   algbw   busbw  #wrong
#        (B)    (elements)                                (us)  (GB/s)  (GB/s)            (us)  (GB/s)  (GB/s)
   32768         8192     float     sum      -1    169.2    0.19    0.36      0    165.1    0.20    0.37      0
   65536        16384     float     sum      -1    181.7    0.36    0.68      0    170.0    0.39    0.72      0
  131072        32768     float     sum      -1    196.6    0.67    1.25      0    199.5    0.66    1.23      0
  262144        65536     float     sum      -1    227.8    1.15    2.16      0    226.0    1.16    2.17      0
  524288       131072     float     sum      -1    345.6    1.52    2.84      0    346.8    1.51    2.83      0
 1048576       262144     float     sum      -1   1258.2    0.83    1.56      0   1317.5    0.80    1.49      0
 2097152       524288     float     sum      -1   1367.7    1.53    2.88      0   1313.0    1.60    2.99      0
 4194304      1048576     float     sum      -1   1502.1    2.79    5.24      0   1504.8    2.79    5.23      0
 8388608      2097152     float     sum      -1   1763.1    4.76    8.92      0   1793.4    4.68    8.77      0
16777216      4194304     float     sum      -1   2838.3    5.91   11.08      0   2867.2    5.85   10.97      0
33554432      8388608     float     sum      -1   4952.3    6.78   12.70      0   4962.5    6.76   12.68      0
67108864     16777216     float     sum      -1   9027.4    7.43   13.94      0   8976.9    7.48   14.02      0
134217728     33554432     float     sum      -1    17641    7.61   14.27      0    17664    7.60   14.25      0
268435456     67108864     float     sum      -1    34935    7.68   14.41      0    34922    7.69   14.41      0
536870912    134217728     float     sum      -1    69392    7.74   14.51      0    69274    7.75   14.53      0
1073741824    268435456     float     sum      -1   138739    7.74   14.51      0   138833    7.73   14.50      0
2147483648    536870912     float     sum      -1   277591    7.74   14.51      0   277373    7.74   14.52      0
4294967296   1073741824     float     sum      -1   554176    7.75   14.53      0   554452    7.75   14.52      0
dlcinqih2e19f6nn-worker-0:28:28 [3] NCCL INFO comm 0x55bc7e54fe90 rank 3 nranks 16 cudaDev 3 busId c6000 - Destroy COMPLETE