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 镜像仅支持 ebmgn7ex、ebmgn7ix 以及 所有 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 软件栈等,相比手动安装方式更快捷。
-
远程连接 GPU 实例。
具体操作,请参见 使用 Workbench 工具以 SSH 协议登录 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 网卡设备状态正常。
-
-
在容器内测试 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回显结果如下所示:
-
-
执行以下命令,在 host 端(容器外)监控 eRDMA 网络是否有流量。
eadm stat -d erdma_0 -l回显结果如下所示,表示 eRDMA 网络存在流量,即使用的是 eRDMA 网络。
相关文档
-
在 GPU 实例上配置 eRDMA,各 GPU 实例间在 VPC 网络下可以实现 RDMA 直通加速互连。具体操作,请参见 在 GPU 实例上配置 eRDMA 。
-
在大规模数据传输和高性能网络通信的应用场景,如果您需要在 GPU 实例上自行配置 Docker 环境,并将 eRDMA 功能引入到该 Docker 环境,以提供更快的数据传输和通信效率。具体操作,请参见 在容器(Docker)中使用 eRDMA 。