使用eRDMA容器镜像快速配置eRDMA提升网络性能
eRDMA(Elastic Remote Direct Memory Access)是一种高性能网络通信技术,将eRDMA功能引入容器(Docker)环境可以实现容器应用程序绕过操作系统内核直接访问主机的物理eRDMA设备,从而提供更快的数据传输和通信效率,适用于在容器中需要大规模数据传输和高性能网络通信的应用场景。本文介绍如何使用eRDMA镜像在GPU实例上快速配置eRDMA。
如果您的业务需要具备大规模RDMA的网络服务能力,您可以在支持eRDMA能力的GPU实例规格上通过创建挂载支持弹性RDMA能力的网卡来实现。更多信息,请参见eRDMA概述。
准备工作
获取eRDMA容器镜像详细信息,以便您在GPU实例上配置该容器镜像时使用。例如,创建GPU实例时需要提前了解容器镜像适用的GPU实例类型,拉取容器镜像时需要提前获取镜像地址等信息。
登录容器镜像服务控制台。
在左侧导航栏,单击制品中心。
在仓库名称搜索框,搜索
erdma,并选择目标镜像egs/erdma。eRDMA容器镜像大概每3个月内更新一次。镜像详情如下所示:
镜像名称
版本信息
镜像地址
适用的GPU实例
优势
eRDMA
Python:3.10.12
CUDA:12.4.1
cuDNN:9.1.0.70
NCCL:2.21.5
基础镜像:Ubuntu 22.04
egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.4.1-cudnn9-ubuntu22.04
eRDMA镜像仅支持所有8代GPU实例(例如ebmgn8is、gn8is等)选择。
说明关于实例的更多信息,请参见GPU计算型(gn/ebm/scc系列)
在容器内直接访问阿里云eRDMA网络。
阿里云提供eRDMA和驱动、CUDA适配来保障功能的开箱即用。
eRDMA
Python:3.10.12
CUDA:12.1.1
cuDNN:8.9.0.131
NCCL:2.17.1
基础镜像:Ubuntu 22.04
egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.1.1-cudnn8-ubuntu22.04
操作步骤
在GPU实例中安装了Docker环境,将eRDMA功能引入Docker环境后,您可以在容器内直接访问eRDMA设备。本操作以Ubuntu 20.04操作系统为例。
创建GPU实例并配置eRDMA功能。
具体操作,请参见在GPU实例上启用eRDMA。
建议您在ECS管理控制台上创建配置了eRDMA网卡的GPU实例,并选中安装GPU驱动和安装eRDMA软件栈选项。
说明GPU实例创建完成后,会同时自动安装Tesla驱动、CUDA、cuDNN库以及eRDMA软件栈等,相比手动安装方式更快捷。
在镜像区域选择操作系统 Ubuntu 20.04 64位。安装 GPU 驱动相对耗时约 10~20 分钟,实例启动时间会更长并伴有自动重启。
远程连接GPU实例。
具体操作,请参见使用Workbench登录Linux实例。
执行以下命令,在Ubuntu系统GPU实例上安装Docker环境。
sudo apt-get update sudo apt-get -y install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] http://mirrors.cloud.aliyuncs.com/docker-ce/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io执行以下命令,检查Docker是否安装成功。
docker -v执行以下命令,安装nvidia-container-toolkit软件包。
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list sudo apt-get update sudo apt-get install -y nvidia-container-toolkit依次执行以下命令,设置Docker开机自启动并重启Docker服务。
sudo systemctl enable docker sudo systemctl restart docker执行以下命令,拉取eRDMA镜像。
sudo docker pull egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.1.1-cudnn8-ubuntu22.04执行以下命令,运行eRDMA容器。
sudo docker run -d -t --network=host --gpus all \ --privileged \ --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 \ --name erdma \ -v /root:/root \ egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.1.1-cudnn8-ubuntu22.04
测试验证
本测试以创建2个GPU实例(例如host1和host2)为例,2个GPU实例上均已安装了Docker环境,并且该环境下已成功运行eRDMA容器。
在host1和host2中的容器内,分别查看eRDMA网卡设备是否正常。
执行以下命令,进入容器环境。
sudo docker exec -it erdma bash执行以下命令,在容器内查看eRDMA网卡设备。
ibv_devinfo回显信息如下,可以看到2个eRDMA网卡设备状态为
PORT_ACTIVE,即eRDMA网卡设备状态正常。root@xxx:~/# ibv_devinfo hca_id: erdma_0 transport: eRDMA (0) fw_ver: 0.2.0 node_guid: 0216:3eff:fe2c:6aad sys_image_guid: 0216:3eff:fe2c:6aad vendor_id: 0x1ded vendor_part_id: 4223 hw_ver: 0x0 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 1024 (3) active_mtu: 1024 (3) sm_lid: 0 port_lid: 0 port_lmc: 0x00 link_layer: Ethernet hca_id: erdma_1 transport: eRDMA (0) fw_ver: 0.2.0 node_guid: 0216:3eff:fe16:58b6 sys_image_guid: 0216:3eff:fe16:58b6 vendor_id: 0x1ded vendor_part_id: 4223 hw_ver: 0x0 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 1024 (3) active_mtu: 1024 (3) sm_lid: 0 port_lid: 0 port_lmc: 0x00 link_layer: Ethernet vendor_part_id: 4223 hw_ver: 0x0 phys_port_cnt: 1 port: 1 state: PORT_ACTIVE (4) max_mtu: 1024 (3) active_mtu: 1024 (3) sm_lid: 0 port_lid: 0 port_lmc: 0x00 link_layer: Ethernet
在容器内测试host1和host2的nccl-test。
执行以下命令,下载nccl-test测试代码。
git clone https://github.com/NVIDIA/nccl-tests.git执行以下命令,编译nccl-test。
apt update apt install openmpi-bin libopenmpi-dev -y cd nccl-tests && make MPI=1 CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/local/cuda MPI_HOME=/usr/lib/x86_64-linux-gnu/openmpi建立host1和host2之间的免密连接,并配置通过12345端口进行SSH连接。
SSH连接配置后,您可以在容器内通过
ssh -p 12345 ip测试两个eRDMA Docker环境是否可以免密连接。测试命令如下:在host1中的容器内,执行以下命令,生成SSH密钥并将公钥复制到host2中的容器内。
ssh-keygen ssh-copy-id -i ~/.ssh/id_rsa.pub ${host2}在host2中的容器内,执行以下命令,安装SSH服务并指定SSH服务器的监听端口号为
12345。apt-get update && apt-get install ssh -y mkdir /run/sshd /usr/sbin/sshd -p 12345在host1中的容器内,执行以下命令,测试是否免密连接host2中的容器。
ssh root@{host2} -p 12345
在host1中的容器内,执行测试all_reduce_perf。
mpirun --allow-run-as-root -np 16 -npernode 8 -H 172.16.15.237:8,172.16.15.235:8 \ --bind-to none -mca btl_tcp_if_include eth0 \ -x NCCL_SOCKET_IFNAME=eth0 \ -x NCCL_IB_DISABLE=0 \ -x NCCL_IB_GID_INDEX=1 \ -x NCCL_NET_GDR_LEVEL=5 \ -x NCCL_DEBUG=INFO \ -x NCCL_ALGO=Ring -x NCCL_P2P_LEVEL=3 \ -x LD_LIBRARY_PATH -x PATH \ -mca plm_rsh_args "-p 12345" \ /workspace/nccl-tests/build/all_reduce_perf -b 1G -e 1G -f 2 -g 1 -n 20回显结果:
iZ2zei2cgn3427b89ubkfvZ:2732:2765 [7] NCCL INFO comm 0x562feba84040 rank 7 nranks 16 cudaDev 7 busId f1000 commId 0x89cad9815cd2a14b - Init COMPLETE iZ2zei2cgn3427b89ubkfvZ:2728:2770 [5] NCCL INFO comm 0x55d55c96d340 rank 5 nranks 16 cudaDev 5 busId ea000 commId 0x89cad9815cd2a14b - 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) 1073741824 268435456 float sum -1 158061 6.79 12.74 0 156821 6.85 12.84 0 iZ2zeiwklcnbixy8g0r8grZ:4068:4068 [2] NCCL INFO comm 0x563b4653f3c0 rank 10 nranks 16 cudaDev 2 busId 71000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2724:2724 [2] NCCL INFO comm 0x55c35266a000 rank 2 nranks 16 cudaDev 2 busId 71000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4071:4071 [5] NCCL INFO comm 0x563a86fc7210 rank 13 nranks 16 cudaDev 5 busId ea000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4067:4067 [1] NCCL INFO comm 0x559741cc9290 rank 9 nranks 16 cudaDev 1 busId 6a000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4075:4075 [7] NCCL INFO comm 0x55d60e86e170 rank 15 nranks 16 cudaDev 7 busId f1000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2723:2723 [1] NCCL INFO comm 0x5596ca34a0b0 rank 1 nranks 16 cudaDev 1 busId 6a000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2728:2728 [5] NCCL INFO comm 0x55d55c96d340 rank 5 nranks 16 cudaDev 5 busId ea000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4072:4072 [6] NCCL INFO comm 0x5609dddc4170 rank 14 nranks 16 cudaDev 6 busId f0000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2725:2725 [3] NCCL INFO comm 0x564411727220 rank 3 nranks 16 cudaDev 3 busId 72000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2726:2726 [4] NCCL INFO comm 0x557b9ed258a0 rank 4 nranks 16 cudaDev 4 busId e9000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4069:4069 [3] NCCL INFO comm 0x55b879b75000 rank 11 nranks 16 cudaDev 3 busId 72000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4070:4070 [4] NCCL INFO comm 0x557580c1a5f0 rank 12 nranks 16 cudaDev 4 busId e9000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2730:2730 [6] NCCL INFO comm 0x562b87361c0 rank 6 nranks 16 cudaDev 6 busId f0000 - Destroy COMPLETE iZ2zeiwklcnbixy8g0r8grZ:4066:4066 [0] NCCL INFO comm 0x558bf49799a0 rank 8 nranks 16 cudaDev 0 busId 69000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2722:2722 [0] NCCL INFO comm 0x5589a9d7a980 rank 0 nranks 16 cudaDev 0 busId 69000 - Destroy COMPLETE iZ2zei2cgn3427b89ubkfvZ:2732:2732 [7] NCCL INFO comm 0x562feba84040 rank 7 nranks 16 cudaDev 7 busId f1000 - Destroy COMPLETE # Out of bounds values : 0 OK # Avg bus bandwidth : 12.7876 #
执行以下命令,在host端(容器外)监控eRDMA网络是否有流量。
eadm stat -d erdma_0 -l回显结果如下所示,表示eRDMA网络存在流量,即使用的是eRDMA网络。
root@xxxZ:~# eadm stat -d erdma_0 -l Monitoring erdma_0... (press CTRL-C to stop) 14:53:00 rx: 5.50 GiB/s 4537261 p/s tx: 5.49 GiB/s 4538210 p/s
相关文档
在GPU实例上配置eRDMA,各GPU实例间在VPC网络下可以实现RDMA直通加速互连。具体操作,请参见在GPU实例上启用eRDMA。
在大规模数据传输和高性能网络通信的应用场景,如果您需要在GPU实例上自行配置Docker环境,并将eRDMA功能引入到该Docker环境,以提供更快的数据传输和通信效率。具体操作,请参见在容器(Docker)中启用eRDMA。