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軟體棧等,相比手動安裝方式更快捷。
遠端連線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。