GPU实例绑定弹性RDMA网卡(ERI)后,各GPU实例间在VPC网络下可以实现RDMA直通加速互连,相比传统的RDMA,eRDMA可以提供更高效的数据传输服务,有效提升GPU实例之间的通信效率并缩短任务处理时间。本文介绍如何在GPU实例上配置eRDMA。
使用限制
限制项 | 说明 |
实例规格 | 支持ERI的实例规格如下:
|
镜像 | 支持以下镜像(任选一款):
|
eRDMA设备数量 | ebmgn7ix、ebmgn7ex、 ebmgn8is弹性裸金属实例支持2个eRDMA网卡设备。 |
网络限制 |
|
操作步骤
支持eRDMA能力的实例使能eRDMA能力需满足2个条件:安装了eRDMA软件栈、绑定了开启弹性RDMA接口的网卡。
创建新GPU实例时配置eRDMA
创建支持ERI的GPU实例。
创建过程中需注意以下配置项(其他参数,请参见自定义购买实例):
实例规格:以ebmgn7ex或ebmgn8is为例。
镜像:选择公共镜像时,默认同时选中安装GPU驱动和安装eRDMA软件栈选项,则该实例创建完成后,系统会自动在实例内部安装GPU驱动、CUDA、cuDNN以及eRDMA软件栈。
弹性网卡:创建GPU实例过程中,在带宽和安全组配置向导页面配置弹性网卡时,会默认创建一块eRDMA主网卡和一块eRDMA辅助网卡,并且主网卡和辅助网卡右侧的弹性RDMA接口选项会默认被自动选中。
说明GPU实例开启后不支持启用或关闭某一弹性网卡的弹性RDMA能力。
开启了弹性RDMA能力后的2张网卡会自动绑定到不同的通道上,无需您单独指定。
主网卡不支持从GPU实例中解绑,只能随GPU实例一起创建和释放。
进入已创建的实例详情页,单击弹性网卡页签,查看实例网卡类型。
主网卡或辅助网卡的网卡类型如下所示,表示该实例已开启了弹性RDMA接口的网卡。
为已有GPU实例配置eRDMA
登录ECS管理控制台。
找到目标实例并进入实例详情页,选择弹性网卡页签,查看实例是否已开启了弹性RDMA接口的网卡。
如果已开启,请跳过以下步骤。
如果未开启,请按照以下步骤,为主网卡或者辅助弹性网卡配置eRDMA。
为主网卡或辅助弹性网卡配置eRDMA。
说明创建GPU实例时,如果主网卡和辅助网卡均未选中弹性RDMA接口,则创建实例后,您可以再单独创建并启用2个eRDMA辅助弹性网卡。
创建GPU实例时,如果主网卡或辅助网卡其中一个网卡未选中弹性RDMA接口,则创建实例后,您只能再单独创建并启用1个eRDMA辅助弹性网卡。
(可选)在实例内使能弹性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="550.90.07" CUDA_VERSION="12.4.1" CUDNN_VERSION="9.2.0.82" IS_INSTALL_eRDMA="TRUE" IS_INSTALL_RDMA="FALSE" INSTALL_DIR="/root/auto_install" #using .run to install driver and cuda auto_install_script="auto_install_v4.0.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 rm -rf $INSTALL_DIR mkdir -p $INSTALL_DIR cd $INSTALL_DIR && wget -t 10 --timeout=10 $script_download_url && bash ${INSTALL_DIR}/${auto_install_script} $DRIVER_VERSION $CUDA_VERSION $CUDNN_VERSION $IS_INSTALL_RDMA $IS_INSTALL_eRDMA
手动安装方式
GPU实例创建完成后,您可以通过手动安装方式单独安装OFED驱动、eRDMA驱动、GPU驱动以及加载
nv_peer_mem
服务组件,具体操作如下所示。安装OFED驱动。
运行以下命令,安装依赖软件包。
根据不同镜像,执行相应命令来安装依赖。
镜像
命令
Centos 8.5
sudo 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
sudo dnf config-manager --enable epel #使能epel sudo dnf config-manager --set-enabled powertools #使能powertools sudo yum install -y dkms gcc-c++ cmake libarchive kernel-rpm-macros perl-generators python3-Cython sudo 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
sudo 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
sudo apt-get update sudo apt-get install -y pkg-config sudo apt-get autoremove -y librbd1 fio librados2 sudo apt install dkms libnl-3-dev libnl-route-3-dev cmake -y
Alibaba Cloud Linux 3
sudo 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 sudo yum install -y valgrind-devel python3-Cython perl-generators rpm-build gdb-headless kernel-rpm-macros
执行以下命令,下载并安装OFED驱动。
根据不同镜像,选择执行相应命令来下载并安装OFED驱动。
镜像
命令
Centos 8.5
sudo 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 sudo ./mlnxofedinstall --kernel-only --without-fw-update -q
Centos 8.4
sudo 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 sudo ./mlnxofedinstall --kernel-only --without-fw-update -q
Centos 7.9
sudo 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 sudo ./mlnxofedinstall --kernel-only --without-fw-update -q
Ubuntu 18.04
sudo 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 sudo ./mlnxofedinstall --kernel-only --without-fw-update -q
Ubuntu 20.04
sudo 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 sudo ./mlnxofedinstall --kernel-only --without-fw-update -q
Alibaba Cloud Linux 3(通过源码编译的方式安装)
sudo 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 sudo ./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驱动。
sudo wget http://mirrors.cloud.aliyuncs.com/erdma/env_setup.sh sudo bash env_setup.sh --egs
执行以下命令,通过eadm工具确认eRDMA驱动是否正常安装。
eadm ver
返回结果如下所示,表示驱动已正常安装。
说明本示例以驱动版本为0.2.35为例。如果返回结果提示没有本命令或者执行失败,请您重新安装eRDMA驱动。
安装GPU驱动。
具体操作,请参见在GPU计算型实例中手动安装Tesla驱动(Linux)。
加载nv_peer_mem服务组件。
(推荐)GPU驱动为470.xx.xx及以上版本
使能GPU Direct RDMA需要加载nv_peer_mem服务组件,建议使用470.xx.xx及以上版本的GPU驱动,因为NVIDIA在驱动版本为470.xx.xx及以上版本中已预装了该服务组件。您可以直接按照以下步骤加载nvidia_peermem模块。
sudo modprobe nvidia_peermem # 可通过lsmod|grep nvidia检查是否已成功加载nvidia_peermem
说明如果机器重启后,您需要重新加载nvidia_peermem模块。
GPU驱动为470.xx.xx以下版本
您需要手动下载并安装相应服务组件,下载及编译安装方法如下所示。
sudo 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
带宽验证。
远程连接GPU实例。
具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
执行以下命令,检查2块eRDMA网卡是否正常。
sudo ibv_devinfo
eRDMA驱动安装脚本默认安装最新版本的驱动,如果您需要安装旧版本eRDMA驱动,请提交工单获取帮助。
本文以eRDMA驱动为0.2.37或以上版本为例,显示结果如下所示,表示2块eRDMA网卡正常存在。其中,2个eRDMA设备的端口
state
均为PORT_ACTIVE
时,表示eRDMA网卡状态正常。说明如果eRDMA设备的端口
state
为invalid state
时,表示该eRDMA网卡状态异常,建议先检查辅助网卡是否配置正确。例如,通过执行ifconfig
命令查看所有网卡配置是否存在,所有网卡IP地址是否存在。执行以下命令,安装perftest测试工具。
sudo yum install perftest -y
执行以下命令,测试RDMA网络带宽是否符合对应硬件的预期表现。
在Server端执行以下命令,等待Client端的连接请求。
sudo ib_write_bw -d erdma_0 -F -q 16 --run_infinitely --report_gbits -p 18515
在Client端执行以下命令,发送连接请求和数据包。
sudo ib_write_bw -d erdma_0 -F -q 16 --run_infinitely --report_gbits -p 18515 server_ip
其中,
server_ip
是Server端ECS实例上绑定eRDMA的弹性网卡所对应的私有IP地址。获取IP地址的方法,请参见查看IP地址。
说明上述perftest测试使用了1张网卡通信,如果您业务需要启用2张网卡进行通信,则需要同时启动2个perftest进程,并通过
-d
参数为2个进程各指定1张eRDMA网卡、-p
参数指定不同的通信端口。更多信息,请参见perftest详情。测试结果包括平均带宽,系统返回信息如下,表示eRDMA通信正常。
测试验证
为测试和验证配备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。