使用弹性eRDMA可以获得超低的延迟,更快地处理请求。本文介绍如何在eRDMA增强型实例上部署AI训练集群,然后测试AI训练集群的性能。
AI训练场景架构
- mpi/gloo后端多用于CPU的控制流通信。
- nccl是nv开源的GPU多机多卡实现,主要用于大数据量的数据流通信,所以在性能优化上是有得天独厚的优势,也是主流AI框架的推荐通信后端。
- nccl底层通信链接上的实现也会有不同的transport,比如单机内部多卡P2P通信,多机上主要是传统socket通信如VPC网络,以及性能较优的ib通信,如RDMA网络,eRDMA位于这一层,对标的就是RDMA,具有超低延迟,在性能上接近RDMA网络的优势,易用性上无需修改业务组网,且在nccl后端的场景下可以无感使用。

步骤一:创建eRDMA实例
具体操作,请参见eRDMA使用方法介绍。
- 规格:ecs.ebmgn7ex.32xlarge
- 实例私网IP地址:172.20.20.145、172.20.20.143
步骤二:搭建环境
您可以通过以下两种方式来搭建AI训练的环境。
方式1 通过ECS实例启动AI训练
- 搭建GPU环境
GPU云服务器提供GPU加速计算能力,实现GPU计算资源的即开即用和弹性伸缩。更多信息,请参见什么是GPU云服务器。
在步骤一:创建eRDMA实例时,配置镜像时需按以下步骤配置:- 选择所需的操作系统及版本。支持的镜像及版本请参见使用限制。
- 选中安装GPU驱动,然后再选择对应的CUDA版本、Driver版本和CUDNN版本。
- 搭建NCCL环境
NVIDIA集体通信库(NCCL)是英伟达基于NCIDIA-GPU的一套开源的集体通信库,实现了针对NVIDIA GPU性能优化的多GPU和多节点集体通信原语。NCCL提供了诸如all-gather, all-reduce, broadcast, reduce, reduce-scatter等实现,这些实现优化后可以通过PCIe和NVLink等高速互联,从而实现高带宽和低延迟。
- 远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,安装git。
yum install -y git
- 依次运行以下命令,编译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"
- 依次运行以下命令,编译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/
- 远程连接ECS实例。
- 搭建MPI环境
MPI(Message Passing Interface)是支持多编程语言编程的并行计算通信库,具有高性能、大规模性、可移植性、可扩展性等特点。
- 远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,安装MPI环境。
yum install -y libgfortran4 libgfortran wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/openmpi-4.0.3-1.el7.x86_64.rpm rpm -Uivh openmpi-4.0.3-1.el7.x86_64.rpm
- 远程连接ECS实例。
- 搭建AIACC环境
神龙AI加速引擎AIACC是基于阿里云IaaS资源推出的AI加速引擎,用于优化基于AI主流计算框架搭建的模型,能显著提升训练和推理性能。其中AIACC的nccl-plugin组件可以提供eRDMA无感使用的易用性能力以及通信性能优化能力。更多信息,请参见什么是神龙AI加速引擎AIACC。
AIACC环境支持的版本及操作系统如下:- nccl2.8.x~2.16.x的所有版本
- CentOS 7.x/8.x、Alibaba Cloud Linux、Ubuntu 18/20等多种操作系统
- 远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,安装AIACC环境。
- 方式一:通过rpm包安装
wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/nccl-plugin/rpm/aiacc-nccl-plugin-1.0.2.rpm rpm -i aiacc-nccl-plugin-1.0.2.rpm
- 方式二:通过deb包安装
wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/nccl-plugin/deb/aiacc-nccl-plugin-1.0.2.deb dpkg -i aiacc-nccl-plugin-1.0.2.deb
- 方式一:通过rpm包安装
- 部署AI环境
- 远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,创建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
- 运行以下命令,以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
- 远程连接ECS实例。
方式2 通过容器启动AI训练
- 创建并分别远程连接两台符合要求的ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 搭建环境。
- Alibaba Cloud Linux/CentOS
- 在
/etc/yum.repos.d
创建一个erdma.repo
源文件。vim /etc/yum.repos.d/erdma.repo
- 按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
- 按Esc键退出编辑模式,输入
:wq
并按下Enter键,保存并退出文件。 - 运行以下命令,更新yum源缓存。
yum makecache
- 运行以下命令,安装相应的用户态驱动包。
yum install libibverbs rdma-core librdmacm libibverbs-utils -y
- 运行以下命令,安装AIACC通信加速器。
wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/nccl-plugin/rpm/aiacc-nccl-plugin-1.0.2.rpm rpm -i aiacc-nccl-plugin-1.0.2.rpm
- 在
- Ubuntu
- 运行以下命令,添加PGP签名。
wget -qO - https://mirrors.aliyun.com/erdma/GPGKEY | apt-key add -
- 运行以下命令,添加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
- Ubuntu 20.04
- 运行以下命令,更新apt源。
sudo apt update
- 运行以下命令,安装用户态驱动。
apt install libibverbs1 ibverbs-providers ibverbs-utils librdmacm1
- 运行以下命令,安装AIACC通信加速器。
wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/nccl-plugin/deb/aiacc-nccl-plugin-1.0.2.deb dpkg -i aiacc-nccl-plugin-1.0.2.deb
- 运行以下命令,添加PGP签名。
- Alibaba Cloud Linux/CentOS
- 运行以下命令,启动容器。
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的网络设备透入到容器内。
- 运行以下命令,查看eRDMA的状态。
如下图所示,可以看到2个eRDMA设备的端口状态均为ibv_devinfo
PORT_ACTIVE
时,表示容器配置正常。
步骤三:配置实例免密登录
通过nccl、e2e测试性能前,需要配置各实例之间可以免密登录。
- 远程连接其中一台ECS实例。具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,生成免密密钥。
一直按Esc键,直到结束。ssh-keygen -t rsa
- 运行以下命令,获取并复制生成的公钥。
cat ~/.ssh/id_rsa.pub
- 运行以下命令,将公钥拷贝至各实例。
echo <公钥> >> ~/.ssh/authorized_keys
重要 该步骤需要在每台ECS实例上分别执行。 - 运行以下命令,测试是否可以免密登录。
回显类似如下信息,例如实例①可以登录到实例②,表示免密登录成功。ssh <另一台ECS实例的私网IP地址>
步骤四:性能测试
您可以通过nccl、e2e这两种方式来测试AI训练的性能。
nccl性能测试
- 远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,进入nccl-tests目录。
cd nccl-tests/
- 新建集群IP地址信息文件。
- 运行以下命令,新建文件,例如
hostfile.txt
。vim hostfile.txt
- 按i进入编辑模式,在文件中添加集群信息。
172.20.20.145 172.20.20.143
说明 172.20.20.145和172.20.20.143是ECS实例的私网IP地址,您需要根据实际环境替换。ECS实例的私网IP地址在步骤一:创建eRDMA实例时已获取。 - 按Esc键退出编辑模式,输入
:wq
并按下Enter键,保存并退出文件。
- 运行以下命令,新建文件,例如
- 准备运行脚本。
- 运行以下命令,新建脚本,例如
run.sh
。vim run.sh
- 按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
- 按Esc键退出编辑模式,输入
:wq
并按下Enter键,保存并退出文件。
- 运行以下命令,新建脚本,例如
- 运行以下命令,运行
run.sh
脚本,启动nccl-test。
回显类似如下的测试数据,表示测试完成。bash run.sh
# 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) iZwz966sgqhb98hdprvmdwZ:5587:5587 [0] NCCL INFO Launch mode Parallel 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通信的性能,表示AI训练的耗时,单位为us,值越小表示性能越好。
e2e性能测试
- 远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
- 运行以下命令,准备模型代码。
wget https://ali-perseus-release.oss-cn-huhehaote.aliyuncs.com/ACSpeed/example/benchmark.py
- 准备启动脚本。
eRDMA安装aiacc-nccl-plugin之后无需指定任何额外通信参数,默认自动识别。您也可以按照如下操作自行制定:
- 运行以下命令,新建脚本,例如
train.sh
。vim train.sh
- 按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实例的私网P地址,您需要根据实际环境替换。
- 运行以下命令,新建脚本,例如
- 按Esc键退出编辑模式,输入
:wq
并按下Enter键,保存并退出文件。 - 运行以下命令,启动训练。
bash train.sh 2 0
重要 在另一台ECS实例上,需执行bash train.sh 2 1
命令。回显类似如下的测试数据,表示测试完成。
其中1306/s是吞吐量,表示每秒可以处理多少个训练样本, 值越大表示性能越好。16 GPUs -- 2M/8G: p50: 0.098s 1306/s p75: 0.098s 1304/s p90: 0.098s 1302/s p95: 0.098s 1302/s