使用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.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

    eRDMA镜像仅支持以下GPU实例选择,更多信息,请参见GPU计算型

    • ebmgn7ex

    • ebmgn7ix

    • 在容器内直接访问阿里云eRDMA网络。

    • 阿里云提供eRDMA和驱动、CUDA适配来保障功能的开箱即用。

操作步骤

在GPU实例中安装了Docker环境,将eRDMA功能引入Docker环境后,您可以在容器内直接访问eRDMA设备。本操作以ebmgn7ix实例规格、Ubuntu 20.04操作系统为例。

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

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

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

    说明

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

    创建GPU实例.jpg

  2. 远程连接GPU实例。

    具体操作,请参见通过密码或密钥认证登录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网卡设备。

      sudo ibv_devinfo

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

      查看eRDMA网卡设备.jpg

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

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

      sudo git clone https://github.com/NVIDIA/nccl-tests.git
    2. 执行以下命令,编译nccl-test。

      sudo apt update
      sudo apt install openmpi-bin libopenmpi-dev -y
      sudo cd nccl-test && make MPI=1 CUDA_HOME=/usr/local/cuda-12.1/ NCCL_HOME=/usr/local/cuda-12.1/ 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中的容器内。

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

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

        sudo ssh ecs-user@{host2}  -p 12345
    4. 在host1中的容器内,执行测试all_reduce_perf。

      sudo 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网络是否有流量。

    sudo eadm stat -d erdma_0 -l

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

    监控流量.jpg

相关文档

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

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