使用eRDMA镜像快速配置eRDMA

使用eRDMA容器镜像快速配置eRDMA提升网络性能

eRDMA(Elastic Remote Direct Memory Access)是一种高性能网络通信技术,将 eRDMA 功能引入容器(Docker)环境可以实现容器应用程序绕过操作系统内核直接访问主机的物理 eRDMA 设备,从而提供更快的数据传输和通信效率,适用于在容器中需要大规模数据传输和高性能网络通信的应用场景。本文介绍如何使用 eRDMA 镜像在 GPU 实例上快速配置 eRDMA。

说明

如果您的业务需要具备大规模 RDMA 的网络服务能力,您可以在支持 eRDMA 能力的 GPU 实例规格上通过创建挂载支持弹性 RDMA 能力的网卡来实现。更多信息,请参见 eRDMA 概述

准备工作

获取 eRDMA 容器镜像详细信息,以便您在 GPU 实例上配置该容器镜像时使用。例如,创建 GPU 实例时需要提前了解容器镜像适用的 GPU 实例类型,拉取容器镜像时需要提前获取镜像地址等信息。

  1. 登录 容器镜像服务控制台

  2. 在左侧导航栏,单击 制品中心

  3. 仓库名称 搜索框,搜索 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 操作系统为例。

  1. 创建 GPU 实例并配置 eRDMA 功能。

    具体操作,请参见 GPU 实例上配置 eRDMA

    建议您在 ECS 管理控制台上创建配置了 eRDMA 网卡的 GPU 实例,并选中 安装 GPU 驱动 安装 eRDMA 软件栈 选项。

    说明

    GPU 实例创建完成后,会同时自动安装 Tesla 驱动、CUDA、cuDNN 库以及 eRDMA 软件栈等,相比手动安装方式更快捷。

    Dingtalk_20241203101142.jpg

  2. 远程连接 GPU 实例。

    具体操作,请参见 使用 Workbench 工具以 SSH 协议登录 Linux 实例

  3. 执行以下命令,在 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
  4. 执行以下命令,检查 Docker 是否安装成功。

    docker -v
  5. 执行以下命令,安装 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
  6. 依次执行以下命令,设置 Docker 开机自启动并重启 Docker 服务。

    sudo systemctl enable docker
    sudo systemctl restart docker
  7. 执行以下命令,拉取 eRDMA 镜像。

    sudo docker pull egs-registry.cn-hangzhou.cr.aliyuncs.com/egs/erdma:cuda12.1.1-cudnn8-ubuntu22.04
  8. 执行以下命令,运行 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 容器。

  1. host1 host2 中的容器内,分别查看 eRDMA 网卡设备是否正常。

    1. 执行以下命令,进入容器环境。

      sudo docker exec -it erdma bash
    2. 执行以下命令,在容器内查看 eRDMA 网卡设备。

      ibv_devinfo

      回显信息如下,可以看到 2 eRDMA 网卡设备状态为 PORT_ACTIVE ,即 eRDMA 网卡设备状态正常。

      查看eRDMA网卡设备.jpg

  2. 在容器内测试 host1 host2 nccl-test。

    1. 执行以下命令,下载 nccl-test 测试代码。

      git clone https://github.com/NVIDIA/nccl-tests.git
    2. 执行以下命令,编译 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
    3. 建立 host1 host2 之间的免密连接,并配置通过 12345 端口进行 SSH 连接。

      SSH 连接配置后,您可以在容器内通过 ssh -p 12345 ip 测试两个 eRDMA Docker 环境是否可以免密连接。测试命令如下:

      1. host1 中的容器内,执行以下命令,生成 SSH 密钥并将公钥复制到 host2 中的容器内。

        ssh-keygen
        ssh-copy-id -i ~/.ssh/id_rsa.pub ${host2}
      2. host2 中的容器内,执行以下命令,安装 SSH 服务并指定 SSH 服务器的监听端口号为 12345

        apt-get update && apt-get install ssh -y
        mkdir /run/sshd
        /usr/sbin/sshd -p 12345 
      3. host1 中的容器内,执行以下命令,测试是否免密连接 host2 中的容器。

        ssh root@{host2}  -p 12345
    4. 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

      回显结果如下所示:

      测试记录.jpg

  3. 执行以下命令,在 host 端(容器外)监控 eRDMA 网络是否有流量。

    eadm stat -d erdma_0 -l

    回显结果如下所示,表示 eRDMA 网络存在流量,即使用的是 eRDMA 网络。

    监控流量.jpg

相关文档

  • GPU 实例上配置 eRDMA,各 GPU 实例间在 VPC 网络下可以实现 RDMA 直通加速互连。具体操作,请参见 GPU 实例上配置 eRDMA

  • 在大规模数据传输和高性能网络通信的应用场景,如果您需要在 GPU 实例上自行配置 Docker 环境,并将 eRDMA 功能引入到该 Docker 环境,以提供更快的数据传输和通信效率。具体操作,请参见 在容器(Docker)中使用 eRDMA