全部產品
Search
文件中心

Elastic GPU Service:使用eRDMA容器鏡像快速配置eRDMA提升網路效能

更新時間:Jun 25, 2026

eRDMA(Elastic Remote Direct Memory Access)是一種高效能網路通訊技術,將eRDMA功能引入容器(Docker)環境可以實現容器應用程式繞過作業系統核心直接存取主機的物理eRDMA裝置,從而提供更快的資料轉送和通訊效率,適用於在容器中需要大規模資料轉送和高效能網路通訊的應用情境。本文介紹如何使用eRDMA鏡像在GPU執行個體上快速配置eRDMA。

說明

如果您的業務需要具備大規模RDMA的網路服務能力,您可以在支援eRDMA能力的GPU執行個體規格上通過建立掛載支援彈性RDMA能力的網卡來實現。更多資訊,請參見eRDMA概述

準備工作

擷取eRDMA容器鏡像詳細資料,以便您在GPU執行個體上配置該容器鏡像時使用。例如,建立GPU執行個體時需要提前瞭解容器鏡像適用的GPU執行個體類型,拉取容器鏡像時需要提前擷取鏡像地址等資訊。

  1. 登入Container Registry控制台

  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鏡像僅支援所有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軟體棧等,相比手動安裝方式更快捷。

    鏡像地區選取項目作業系統 Ubuntu 20.04 64位。安裝 GPU 驅動相對耗時約 10~20 分鐘,執行個體啟動時間會更長並伴有自動重啟。

  2. 遠端連線GPU執行個體。

    具體操作,請參見使用Workbench登入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網卡裝置狀態正常。

      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
  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

      回顯結果:

      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
      #
  3. 執行以下命令,在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