GPU实例绑定弹性RDMA网卡(ERI)后,各GPU实例间在VPC网络下可以实现RDMA直通加速互联,相比传统的RDMA,eRDMA可以提供更高效的数据传输服务,有效提升GPU实例之间的通信效率并缩短任务处理时间。本文介绍如何在GPU实例上配置eRDMA。
背景信息
使用本教程前,请您了解以下内容。
-
弹性RDMA网卡(Elastic RDMA Interface,简称ERI)是一种可以绑定到ECS实例的虚拟网卡。更多信息,请参见功能简介。
-
弹性网卡(Elastic Network Interfaces,简称ENI)是专有网络VPC中的虚拟网络接口,用于连接云服务器与专有网络。更多信息,请参见弹性网卡概述。
-
弹性RDMA(Elastic Remote Direct Memory Access,简称eRDMA)是阿里云提供的低延迟、大吞吐、高弹性的高性能RDMA网络服务。更多信息,请参见eRDMA概述。
操作步骤
-
创建支持ERI的GPU实例。
具体操作,请参见创建配备GPU驱动的GPU实例(Linux)。
需要注意的配置项
配置项
说明
地域及可用区
支持选择华南1(深圳)、华北2(北京)及对应的可用区。
实例规格
支持ERI的实例规格如下:
-
ebmgn7ex
-
ebmgn7ix
镜像
支持以下镜像(任选一款):
-
CentOS 8.5/8.4/7.9
-
Ubuntu 20.04/18.04
-
Alibaba Cloud Linux 3
eRDMA设备数量
每个实例最大支持2个eRDMA网卡设备。
热插拔特性
ERI网卡只支持热插入,不支持热拔出。
其他限制
-
ERI设置不支持IPv6地址。
-
两个实例之间通过ERI通信,通信链路中间不支持跨网元设备(例如负载均衡SLB等)。
启用ERI的主网卡和辅助网卡
创建GPU实例过程中,在带宽和安全组配置向导页面配置弹性网卡时,会默认创建一块eRDMA主网卡和一块eRDMA辅助网卡,并且主网卡和辅助网卡右侧的弹性RDMA接口选项会默认被自动选中。
说明
-
GPU实例开启后不支持启用或关闭某一弹性网卡的弹性RDMA能力。
-
开启了弹性RDMA能力后的2张网卡会自动绑定到不同的通道上,无需您单独指定。
-
主网卡不支持从GPU实例中解绑,只能随GPU实例一起创建和释放。
在实例购买页使能弹性RDMA网卡(ERI)
在创建GPU实例过程中,使能弹性RDMA网卡(ERI)功能时,您需要注意以下几点:
-
目前仅部分公共镜像支持安装eRDMA软件栈,例如Alibaba Cloud Linux 3、CentOS 7.9、CentOS 8.4、CentOS 8.5、Ubuntu 18.04和Ubuntu 20.04镜像。
-
在公共镜像页签下,如果选择了支持安装eRDMA软件栈的镜像操作系统及版本(即可选中安装eRDMA软件栈选项),但未选中安装eRDMA软件栈选项,则实例创建后您可通过脚本安装方式或手动安装方式安装eRDMA软件栈,来使能eRDMA网卡。
-
在公共镜像页签下,如果选择了不支持安装eRDMA软件栈的镜像操作系统及版本(即无法选中安装eRDMA软件栈选项),则实例创建后您无法通过脚本安装方式或手动安装方式来使能eRDMA网卡。
-
在公共镜像页签下,如果未选中安装eRDMA软件栈选项,则您可以选择更多的镜像操作系统及版本。
在实例购买页,选择了支持弹性RDMA网卡的实例(例如ebmgn7ex)后,如果选择公共镜像时,默认同时选中安装GPU驱动和安装eRDMA软件栈选项,则该实例创建完成后,系统会自动在实例内部安装GPU驱动、CUDA、cuDNN以及eRDMA软件栈。
-
-
(可选)单独创建并启用ERI的辅助弹性网卡。
如果在创建GPU实例时关闭了弹性网卡的弹性RDMA能力(即未选中弹性RDMA接口),则您可以通过控制台或OpenAPI任一方式单独创建并启用ERI的辅助弹性网卡。
说明
-
创建GPU实例时,如果主网卡和辅助网卡均未选中弹性RDMA接口,则创建实例后,您可以再单独创建并启用2个eRDMA辅助弹性网卡。
-
创建GPU实例时,如果主网卡或辅助网卡其中一个网卡未选中弹性RDMA接口,则创建实例后,您只能再单独创建并启用1个eRDMA辅助弹性网卡。
通过OpenAPI方式创建并挂载eRDMA网卡到GPU实例时,每个GPU实例最多支持2张eRDMA网卡,且需要分别通过
NetworkCardIndex
参数绑定到不同的通道上。而通过控制台方式创建和挂载eRDMA网卡到GPU实例时,不支持绑定到不同通道,会导致2张eRDMA网卡总带宽减少一半,故建议您使用OpenAPI的方式挂载eRDMA网卡。(推荐)OpenAPI方式
-
创建弹性RDMA网卡。
具体操作,请参见CreateNetworkInterface。主要参数说明如下:
参数
说明
RegionId
实例所在地域的ID。
VSwitchId
指定VPC的交换机ID。弹性网卡的私网IP地址在交换机的IP地址段内的空闲地址中取值。
SecurityGroupId
加入一个安全组。安全组和弹性网卡必须在同一个专有网络VPC中。
NetworkInterfaceTrafficMode
弹性网卡的通讯模式。取值范围:
-
Standard:使用TCP通讯模式。
-
HighPerformance:开启ERI(Elastic RDMA Interface)接口,使用RDMA通讯模式。
本步骤选择
HighPerformance
模式。调用成功后,请记录返回数据中生成的弹性网卡ID(即
NetworkInterfaceId
对应的返回值)。 -
-
绑定eRDMA弹性网卡。
具体操作,请参见AttachNetworkInterface。主要参数说明如下所示:
参数
说明
RegionId
实例所在地域的ID。
NetworkInterfaceId
弹性网卡ID。即已新创建的弹性RDMA网卡。
InstanceId
实例ID。
NetworkCardIndex
网卡指定的物理网卡索引。创建弹性RDMA网卡时,在绑定到某个实例时需要您手动指定通道(即物理网卡索引),当前通道可以指定为0或1(2张弹性RDMA指定不同的值)。
说明
为了获取最大网络带宽,您需要指定2张RDMA网卡绑定到不同的通道。
调用成功(即挂载成功)后,在GPU实例的弹性网卡页签下,您可以看到挂载的弹性RDMA网卡。
控制台方式
-
创建辅助弹性网卡。
具体操作,请参见创建弹性网卡。在创建并启用ERI的辅助弹性网卡时,打开增加弹性RDMA接口开关。ERI会共用该辅助弹性网卡的设置,包括弹性网卡的IP、应用于弹性网卡的安全组规则等。
-
将辅助弹性网卡绑定至GPU实例。
具体操作,请参见绑定弹性网卡。
说明
单台实例最多绑定2个启用ERI的辅助弹性网卡。
将启用ERI的辅助弹性网卡绑定至GPU实例后,如需解绑,必须先停止该实例。具体操作,请参见停止实例。
-
-
远程连接GPU实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
-
(条件必选)部分镜像可能无法自动识别新绑定的辅助弹性网卡,您需要在实例内配置辅助弹性网卡。
您可以执行
ifconfig
命令查看新绑定的辅助弹性网卡。-
如果显示新绑定的辅助弹性网卡,请直接执行步骤5。
-
如果不能显示新绑定的辅助弹性网卡,请手动配置辅助弹性网卡。具体操作,请参见配置辅助弹性网卡。
-
-
(可选)在实例内使能弹性RDMA网卡(ERI)。
在实例购买页,如果选择公共镜像时未选中安装eRDMA软件栈选项,则您可以选择脚本安装方式或手动安装方式安装eRDMA软件栈,来使能弹性RDMA网卡(ERI)。
脚本安装方式
GPU实例创建完成后,您可以通过脚本安装方式单独安装eRDMA软件栈、GPU驱动、CUDA以及cuDNN等软件,脚本示例如下所示。其中,关于
DRIVER_VERSION
、CUDA_VERSION
、CUDNN_VERSION
的版本选择,请参见可选版本说明。#!/bin/sh #Please input version to install DRIVER_VERSION="470.161.03" CUDA_VERSION="11.4.1" CUDNN_VERSION="8.2.4" IS_INSTALL_eRDMA="TRUE" IS_INSTALL_RDMA="FALSE" IS_INSTALL_AIACC_TRAIN="FALSE" IS_INSTALL_AIACC_INFERENCE="FALSE" IS_INSTALL_RAPIDS="FALSE" INSTALL_DIR="/root/auto_install" #using .run to install driver and cuda auto_install_script="auto_install.sh" script_download_url=$(curl http://100.100.100.200/latest/meta-data/source-address | head -1)"/opsx/ecs/linux/binary/script/${auto_install_script}" echo $script_download_url mkdir $INSTALL_DIR && cd $INSTALL_DIR wget -t 10 --timeout=10 $script_download_url && sh ${INSTALL_DIR}/${auto_install_script} $DRIVER_VERSION $CUDA_VERSION $CUDNN_VERSION $IS_INSTALL_AIACC_TRAIN $IS_INSTALL_AIACC_INFERENCE $IS_INSTALL_RDMA $IS_INSTALL_eRDMA $IS_INSTALL_RAPIDS
手动安装方式
GPU实例创建完成后,您可以通过手动安装方式单独安装OFED驱动、eRDMA驱动、GPU驱动以及加载
nv_peer_mem
服务组件,具体操作如下所示。-
安装OFED驱动。
-
运行以下命令,安装依赖软件包。
根据不同镜像,执行相应命令来安装依赖。
镜像
命令
Centos 8.5
yum install -y dkms cmake gcc-c++ libdb-devel iptables-devel gdb-headless bison libmnl-devel elfutils-devel flex libselinux-devel kernel-rpm-macros rpm-build elfutils-libelf-devel
Centos 8.4
dnf config-manager --enable epel #使能epel dnf config-manager --set-enabled powertools #使能powertools yum install -y dkms gcc-c++ cmake libarchive kernel-rpm-macros perl-generators python3-Cython yum install -y libselinux-devel numactl-devel bison elfutils-devel systemd-devel libdb-devel flex rpm-build gdb-headless libmnl-devel valgrind-devel libnl3-devel iptables-devel
Centos 7.9
yum install -y python-devel libmnl-devel valgrind-devel rpm-build systemd-devel libdb-devel iptables-devel lsof libselinux-devel flex cmake elfutils-devel bison libnl3-devel numactl-devel
-
Ubuntu 18.04
-
Ubuntu 20.04
apt-get update apt-get install -y pkg-config apt-get autoremove -y librbd1 fio librados2 apt install dkms libnl-3-dev libnl-route-3-dev cmake -y
Alibaba Cloud Linux 3
yum install -y libmnl-devel bison systemd-devel iptables-devel elfutils-libelf-devel libselinux-devel libnl3-devel lsof libdb-devel numactl-devel elfutils-devel cmake flex yum install -y valgrind-devel python3-Cython perl-generators rpm-build gdb-headless kernel-rpm-macros
-
-
执行以下命令,下载并安装OFED驱动。
根据不同镜像,选择执行相应命令来下载并安装OFED驱动。
镜像
命令
Centos 8.5
wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.5.8.0/MLNX_OFED_LINUX-5.4-3.5.8.0-rhel8.5-x86_64.tgz tar -zxf MLNX_OFED_LINUX-5.4-3.5.8.0-rhel8.5-x86_64.tgz cd MLNX_OFED_LINUX-5.4-3.5.8.0-rhel8.5-x86_64 ./mlnxofedinstall --kernel-only --without-fw-update -q
Centos 8.4
wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.5.8.0/MLNX_OFED_LINUX-5.4-3.5.8.0-rhel8.4-x86_64.tgz tar -zxf MLNX_OFED_LINUX-5.4-3.5.8.0-rhel8.4-x86_64.tgz cd MLNX_OFED_LINUX-5.4-3.5.8.0-rhel8.4-x86_64 ./mlnxofedinstall --kernel-only --without-fw-update -q
Centos 7.9
wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.5.8.0/MLNX_OFED_LINUX-5.4-3.5.8.0-rhel7.9-x86_64.tgz tar -zxf MLNX_OFED_LINUX-5.4-3.5.8.0-rhel7.9-x86_64.tgz cd MLNX_OFED_LINUX-5.4-3.5.8.0-rhel7.9-x86_64 ./mlnxofedinstall --kernel-only --without-fw-update -q
Ubuntu 18.04
wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.5.8.0/MLNX_OFED_LINUX-5.4-3.5.8.0-ubuntu18.04-x86_64.tgz tar -zxf MLNX_OFED_LINUX-5.4-3.5.8.0-ubuntu18.04-x86_64.tgz cd MLNX_OFED_LINUX-5.4-3.5.8.0-ubuntu18.04-x86_64 ./mlnxofedinstall --kernel-only --without-fw-update -q
Ubuntu 20.04
wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.5.8.0/MLNX_OFED_LINUX-5.4-3.5.8.0-ubuntu20.04-x86_64.tgz tar -zxf MLNX_OFED_LINUX-5.4-3.5.8.0-ubuntu20.04-x86_64.tgz cd MLNX_OFED_LINUX-5.4-3.5.8.0-ubuntu20.04-x86_64 ./mlnxofedinstall --kernel-only --without-fw-update -q
Alibaba Cloud Linux 3(通过源码编译的方式安装)
wget https://content.mellanox.com/ofed/MLNX_OFED-5.4-3.5.8.0/MLNX_OFED_SRC-5.4-3.5.8.0.tgz tar -zxf MLNX_OFED_SRC-5.4-3.5.8.0.tgz cd MLNX_OFED_SRC-5.4-3.5.8.0 ./install.pl --config ofed.conf --distro RHEL8
其中,
ofed.conf
文件内容如下所示:libibverbs=y libibverbs-utils=y librdmacm=n librdmacm-utils=n mstflint=n ofed-docs=y ofed-scripts=y mlnx-tools=n mlnx-ethtool=n mlnx-iproute2=y mlnx-ofa_kernel=y mlnx-ofa_kernel-devel=y kernel-mft-mlnx=n mlnx-nvme=n core=y mlxfw=n mlx5=n ipoib=n
-
重启实例。
OFED驱动安装完成后,您需要重启实例,确保新的内核模块生效。具体操作,请参见重启实例。
-
-
安装eRDMA驱动。
-
执行以下命令,下载并安装eRDMA驱动。
wget http://mirrors.cloud.aliyuncs.com/erdma/env_setup.sh bash env_setup.sh --egs
-
执行以下命令,通过eadm工具确认eRDMA驱动是否正常安装。
eadm ver
返回结果如下所示,表示驱动已正常安装。
说明
本示例以驱动版本为0.2.35为例。如果返回结果提示没有本命令或者执行失败,请您重新安装eRDMA驱动。
-
-
安装GPU驱动。
具体操作,请参见在GPU计算型实例中安装GPU驱动(Linux)。
-
加载nv_peer_mem服务组件。
-
(推荐)GPU驱动为470.xx.xx及以上版本
使能GPU Direct RDMA需要加载nv_peer_mem服务组件,建议使用470.xx.xx及以上版本的GPU驱动,因为NVIDIA在驱动版本为470.xx.xx及以上版本中已预装了该服务组件。您可以直接按照以下步骤加载nvidia_peermem模块。
modprobe nvidia_peermem # 可通过lsmod|grep nvidia检查是否已成功加载nvidia_peermem
说明
如果机器重启后,您需要重新加载nvidia_peermem模块。
-
GPU驱动为470.xx.xx以下版本
您需要手动下载并安装相应服务组件,下载及编译安装方法如下所示。
git clone https://github.com/Mellanox/nv_peer_memory.git # 编译并安装nv_peer_mem.ko cd nv_peer_memory && make cp nv_peer_mem.ko /lib/modules/$(uname -r)/kernel/drivers/video depmod -a modprobe nv_peer_mem # 可通过lsmod|grep nv_peer_mem检查 service nv_peer_mem start
-
-
-
带宽验证。
-
执行以下命令,检查2块eRDMA网卡是否正常。
ibv_devinfo
-
eRDMA驱动为0.2.37及以上版本(例如0.2.37版本)
eRDMA驱动安装脚本默认安装最新版本的驱动,如果您需要安装旧版本eRDMA驱动,请提交工单获取帮助。
显示结果如下所示,表示2块eRDMA网卡正常存在。其中,2个eRDMA设备的端口
state
均为PORT_ACTIVE
时,表示eRDMA网卡状态正常。说明
如果eRDMA设备的端口
state
为invalid state
时,表示该eRDMA网卡状态异常,建议先检查辅助网卡是否配置正确。例如,通过执行ifconfig
命令查看是否存在eth1网络和IP地址。 -
eRDMA驱动为0.2.37以下版本(例如0.2.36版本)
显示结果如下所示,表示2块eRDMA网卡正常存在。其中,2个eRDMA设备的端口
state
均为PORT_ACTIVE
时,表示该eRDMA网卡状态正常。说明
如果eRDMA设备的端口
state
为invalid state
时,表示该eRDMA网卡状态异常,建议先检查辅助网卡是否配置正确。例如,通过执行ifconfig
命令查看是否存在eth1网络和IP地址。
-
-
执行以下命令,安装perftest测试工具。
本步骤以CentOS系统为例。
yum install perftest -y
-
执行以下命令,测试RDMA网络带宽是否符合对应硬件的预期表现。
说明
perftest默认使用第1张网卡通信,如果您业务需要启用2张网卡进行通信,则需要同时启动2个perftest进程,并通过
--ib-dev
参数为2个进程各指定1张eRDMA网卡。更多信息,请参见perftest详情。服务器端命令
ib_send_bw -q 32 -n 100 --report_gbits
类似回显信息如下:
# ib_send_bw -q 32 -n 100 --report_gbits --------------------------------------------------------------------------------------- Send BW Test Dual-port : OFF Device : rocep16s0 Number of qps : 32 Transport type : IB Connection type : RC Using SRQ : OFF PCIe relax order: Unsupported ibv_wr* API : OFF TX depth : 100 CQ Moderation : 1 Mtu : 1024[B] Link type : Ethernet GID index : 1 Max inline data : 0[B] rdma_cm QPs : OFF Data ex. method : Ethernet --------------------------------------------------------------------------------------- local address: LID 0000 QPN 0x0024 PSN 0x3d66a7 GID: 00:00:00:00:00:00:00:00:00:00:255:255:172:16:05:90 local address: LID 0000 QPN 0x0025 PSN 0x909c3c ...... remote address: LID 0000 QPN 0x0043 PSN 0x8b8cd7 GID: 00:00:00:00:00:00:00:00:00:00:255:255:172:16:05:87 --------------------------------------------------------------------------------------- #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] 65536 3200 98.13 96.96 0.184930 ---------------------------------------------------------------------------------------
客户端命令
ib_send_bw -q 32 -n 100 --report_gbits server_ip # server_ip为服务器eRDMA网卡的IP地址
类似回显信息如下:
# ib_send_bw -q 32 -n 100 --report_gbits 172.20.20.86 ************************************ * Waiting for client to connect... * ************************************ --------------------------------------------------------------------------------------- Send BW Test Dual-port : OFF Device : rocep16s0 Number of qps : 32 Transport type : IB Connection type : RC Using SRQ : OFF PCIe relax order: Unsupported ibv_wr* API : OFF RX depth : 100 CQ Moderation : 1 Mtu : 1024[B] Link type : Ethernet GID index : 1 Max inline data : 0[B] rdma_cm QPs : OFF Data ex. method : Ethernet --------------------------------------------------------------------------------------- local address: LID 0000 QPN 0x0024 PSN 0xf13bb3 GID: 00:00:00:00:00:00:00:00:00:00:255:255:172:16:05:87 local address: LID 0000 QPN 0x0025 PSN 0x24a721 ...... remote address: LID 0000 QPN 0x0043 PSN 0x89e20e GID: 00:00:00:00:00:00:00:00:00:00:255:255:172:16:05:90 --------------------------------------------------------------------------------------- #bytes #iterations BW peak[Gb/sec] BW average[Gb/sec] MsgRate[Mpps] 65536 3200 0.00 98.75 0.188350 ---------------------------------------------------------------------------------------
-
测试验证
为测试和验证配备eRDMA网络的GPU实例在应用中的实际表现,本文以nccl-tests为例,展示如何在实际业务中使用eRDMA的具体操作。关于nccl-tests的更多信息,请参见nccl-tests。
-
执行以下命令,安装nccl。
通过下载并编译源码安装nccl,源码编译的方式如下:
说明
您也可以在NVIDIA官网NVIDIA NCCL下载安装包,然后进行安装。
# build nccl cd /root git clone https://github.com/NVIDIA/nccl.git cd nccl/ make -j src.lib PREFIX=/usr/local/nccl make install PREFIX=/usr/local/nccl # 通过ls /usr/local/nccl/lib查看libnccl.so库
-
执行以下命令,安装OpenMPI及编译器。
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.3.tar.gz tar -xzf openmpi-4.1.3.tar.gz cd openmpi-4.1.3 ./configure --prefix=/usr/local/openmpi make -j && make install
-
执行以下命令,设置环境变量。
NCCL_HOME=/usr/local/nccl CUDA_HOME=/usr/local/cuda MPI_HOME=/usr/local/openmpi export LD_LIBRARY_PATH=${NCCL_HOME}/lib:${CUDA_HOME}/lib64:${MPI_HOME}/lib:$LD_LIBRARY_PATH export PATH=${CUDA_HOME}/bin:${MPI_HOME}/bin:$PATH
在实例内部进入
~/.bashrc
文件、设置PATH和LD_LIBRARY_PATH,其中,NCCL_HOME、CUDA_HOME、MPI_HOME需要根据实际情况填写。编辑完成后,执行以下命令使环境变量设置生效。source ~/.bashrc
-
执行以下命令,下载并编译测试代码。
git clone https://github.com/NVIDIA/nccl-tests cd nccl-tests/ make MPI=1 CUDA_HOME=/usr/local/cuda MPI_HOME=/usr/local/openmpi
-
执行以下命令,建立实例之间的SSH互信。
在host1生成公钥后并拷贝到host2上来建立实例之间的SSH互信。
#在host1执行 ssh-keygen ssh-copy-id -i ~/.ssh/id_rsa.pub ${host2} ssh root@{host2} # 在host1执行,测试一下是否可以无密码连接host2。如果是,表示已建立实例之间的SSH互信。
-
执行如下命令,测试NCCL all_reduce效果。
# 将host1, host2替换为您对应的IP地址 mpirun --allow-run-as-root -np 16 -npernode 8 -H host1:8,host2:8 \ --bind-to none \ -mca btl_tcp_if_include eth0 \ -x NCCL_SOCKET_IFNAME=eth0 \ -x NCCL_DEBUG=INFO \ -x LD_LIBRARY_PATH \ -x PATH \ ./build/all_reduce_perf -b 4M -e 4M -f 2 -g 1 -t 1 -n 20
相关文档
-
在企业级ECS实例上配置eRDMA,可实现无需更改业务组网,即可在原有网络下体验超低延迟、大吞吐、高弹性的高性能RDMA网络服务。具体操作,请参见在企业级实例上配置eRDMA。
-
容器中需要大规模数据传输和高性能网络通信的应用场景中,将eRDMA功能引入容器(Docker)环境可实现容器应用程序绕过操作系统内核直接访问主机的物理eRDMA设备,从而提供更快的数据传输和通信效率。具体操作,请参见在容器(Docker)中配置eRDMA。
-
如需监测或诊断eRDMA,方便您对eRDMA的运行状态进行实时监控。具体操作,请参见监测和诊断eRDMA。
关于阿里云ecs服务器的内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
本文来自投稿,不代表新手站长_郑州云淘科技有限公司立场,如若转载,请注明出处:https://www.cnzhanzhang.com/9312.html