基于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后端的场景下可以无缝使用。
步骤一:创建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实例时,配置镜像时需按以下步骤配置:
选择所需的操作系统及版本。支持的镜像及版本请参见使用限制。
选中安装GPU驱动,然后再选择对应的CUDA版本、Driver版本和CUDNN版本。
搭建NCCL环境
NVIDIA集体通信库(NCCL)是英伟达基于NVIDIA-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/
搭建MPI环境
MPI(Message Passing Interface)是支持多种编程语言的并行计算通信库,具有高性能、大规模性、可移植性、可扩展性等特点。
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
运行以下命令,安装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等多种操作系统
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
运行以下命令,安装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环境
远程连接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
若系统返回类似如下信息时,则表示AI框架安装成功。
方式2 通过容器启动AI训练
创建并分别远程连接两台符合要求的ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
构建容器镜像。
在Dockerfile中增加eRDMA驱动的安装,重新构建应用容器镜像,以便镜像中的应用能够使用eRDMA。具体的操作命令如下:
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 aiacc-nccl-plugin -y
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
运行以下命令,更新apt源。
sudo apt update
运行以下命令,安装用户态驱动。
apt install libibverbs1 ibverbs-providers ibverbs-utils librdmacm1 aiacc-nccl-plugin -y
运行以下命令,启动容器。
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的状态。
ibv_devinfo
如下图所示,可以看到2个eRDMA设备的端口状态均为
PORT_ACTIVE
时,表示容器配置正常。
步骤三:配置实例免密登录
通过nccl、e2e测试性能前,需要配置各实例之间可以免密登录。
远程连接其中一台ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
运行以下命令,生成密钥。
ssh-keygen -t rsa
一直按Esc键,直到结束。
运行以下命令,获取并复制生成的公钥。
cat ~/.ssh/id_rsa.pub
运行以下命令,将公钥拷贝至各实例。
echo <公钥> >> ~/.ssh/authorized_keys
重要该步骤需要在每台ECS实例上分别执行。
运行以下命令,测试是否可以免密登录。
ssh <另一台ECS实例的私网IP地址>
若系统返回类似如下信息,例如实例A可以登录到实例B,则表示免密登录成功。
步骤四:性能测试
您可以通过nccl、e2e这两种方式来测试AI训练的性能。
nccl性能测试
为完成测试,您需要在集群中的两台ECS实例上分别执行以下操作。
远程连接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
若系统返回类似如下的测试数据,则表示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实例)上执行如下操作来完成测试。
远程连接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实例的私网IP地址,您需要根据实际环境替换。
按Esc键退出编辑模式,输入
:wq
并按下Enter键,保存并退出文件。运行以下命令,启动训练。
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表示数据吞吐量,即每秒处理的训练样本数量,数值越大表示性能越好。