在多節點 GPU 訓練中網路通訊延遲拖累整體效能時,為縮短模型訓練周期,可利用 Arena 提交 PyTorch 分布式作業並配置 eRDMA 網路加速,實現低延遲、高吞吐的節點間通訊,提升訓練效率和叢集利用率。
適用範圍
-
叢集類型:僅支援ACK託管叢集。
-
支援彈性RDMA(eRDMA)執行個體規格:
gn8is、ebmgn8is、gn8v、ebmgn8v
步驟一:安裝ACK eRDMA Controller組件
您可以參見如下流程安裝ACK eRDMA Controller組件。
-
如果您的叢集網路外掛程式為Terway,還需要配置Terway的網卡白名單,避免Terway組件修改eRDMA的網卡。配置方式,請參見為彈性網卡(ENI)配置白名單。
-
當節點存在多張網卡時,ACK eRDMA Controller 為附加的eRDMA網卡配置路由時,採用比同網段網卡路由更低的優先順序,預設採用
200的路由優先順序,如果您在安裝ACK eRDMA Controller後需要手動設定網卡,注意避免路由衝突。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理。
-
在組件管理頁面,單擊網路頁簽,定位ACK eRDMA Controller組件,按照頁面提示配置組件並完成安裝。
配置項
說明
preferDriver 驅動類型
選擇叢集節點上使用的eRDMA驅動類型。可選值:
-
default:預設驅動模式。 -
compat:相容RoCE驅動模式。 -
ofed:基於ofed的驅動模式,適用於GPU機型。
關於驅動類型的詳細說明,請參見啟用eRDMA。
是否為Pod分配節點全部eRDMA裝置
可選值:
-
True(勾選):為Pod分配節點上所有的eRDMA裝置。
-
False(不勾選):Pod根據NUMA拓撲分配一個eRDMA裝置。節點需要開啟CPU Static Policy才能保證Pod和裝置的固定NUMA分配。關於如何配置CPU Policy,請參見建立和管理節點池。
安裝完成後,您可以在左側導覽列,選擇工作負載>容器組,然後選擇命名空間為ack-erdma-controller,查看Pod運行狀態,確認組件運行正常。
-
步驟二:節點啟用eRDMA並驗證
節點啟用eRDMA,且確認節點上的 GPU 和 eRDMA 資源已正確識別並可被調度。
-
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。在建立的容器所在行,單擊操作列的終端。登入到支援 eRDMA 的節點,執行以下命令查看 eRDMA 裝置資訊。
預期輸出中顯示
erdma_0裝置且連接埠狀態為PORT_ACTIVE,表示 eRDMA 裝置已正常啟用。ibv_devinfo -
查看節點的可分配資源。
kubectl get node <節點名稱> -o jsonpath='{.status.allocatable}'預期輸出:
{"aliyun/erdma":"200","cpu":"15890m","ephemeral-storage":"243149919035","hugepages-1Gi":"0","hugepages-2Mi":"0","memory":"128290128Ki","nvidia.com/gpu":"1","pods":"64"}-
"nvidia.com/gpu":"1":表示可用的GPU數量為1。 -
"aliyun/erdma":"200":表示支援最多 200 個 Pod 使用 eRDMA。
-
步驟三:通過 Arena 提交訓練作業
使用 Arena 提交 PyTorch 分布式訓練作業,並申請 eRDMA 資源來加速節點間通訊。
-
配置Arena用戶端並提交訓練作業。更多參數,請參見作業核心參數說明。
本文使用已構建好的鏡像
kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch:mnist-example進行示範。該鏡像僅用於快速體驗,生產環境請參考如何構建生產環境支援 eRDMA 的容器鏡像?arena submit pytorch \ --name=pytorch-mnist \ --namespace=default \ --workers=2 \ --gpus=1 \ --device=aliyun/erdma=1 \ --nproc-per-node=1 \ --env NCCL_NET_GDR_LEVEL=1 \ --env NCCL_P2P_LEVEL=5 \ --env NCCL_DEBUG=INFO \ --env NCCL_SOCKET_IFNAME=eth0 \ --env NCCL_ALGO=Ring \ --clean-task-policy=None \ --working-dir=/root \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/pytorch:mnist-example \ --image-pull-policy=Always \ --tensorboard \ --logdir=/workspace/logs \ "torchrun /workspace/arena/examples/pytorch/mnist/main.py \ --epochs 10000 \ --backend nccl \ --data /workspace \ --dir /workspace/logs"
步驟四:驗證訓練作業運行狀態
確認訓練作業已成功啟動,並驗證 eRDMA 網路已生效。
-
查看Master Pod的日誌,訓練日誌顯示
Train Epoch資訊,說明訓練作業正常運行。kubectl logs pytorch-mnist-master-0 | head -n 50 -
驗證 eRDMA 是否生效。在上述Master Pod的日誌中尋找關鍵資訊
NET/IB : Using [0]erdma_0:1/RoCE,如果出現此行,表示:-
NCCL 已成功識別 eRDMA 網卡(
erdma_0)。 -
使用 RoCE(RDMA over Converged Ethernet)協議進行通訊。
-
分布式訓練的節點間通訊已通過 eRDMA 加速。
-
步驟五:監控 eRDMA 網卡流量
即時監控eRDMA網卡的網路流量,驗證資料轉送情況。
-
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。在建立的容器所在行,單擊操作列的終端。登入到訓練節點,執行以下命令監控 eRDMA 網卡流量。
eadm stat -d erdma_0 -l預期輸出為
rx(下載): 914.89 MiB/s 150423 p/s; tx(上傳):914.66 MiB/s 147128 p/s,訓練過程中看到持續上傳下載的雙向流量,表示節點間進行中梯度同步等通訊操作。 -
分析訓練效能。
ACK 叢集提供了 AI Profiling 功能,可以從 Torch、Python 和 CUDA Kernel 多個層面分析訓練效能。通過 Profiling 工具深入分析訓練作業的效能瓶頸,包括計算、通訊和記憶體使用量情況。
清理資源
訓練作業完成後,執行以下命令刪除作業:
此操作將刪除作業相關的所有 Pod 和資源,但不會刪除 TensorBoard 日誌等持久化資料。
arena delete pytorch-mnist -n default
預期輸出:
INFO[0001] The training job pytorch-mnist has been deleted successfully
常見問題
為什麼日誌中沒有顯示 NET/IB : Using erdma_0 ?
可能的原因包括:
-
未在提交命令中添加
--device=aliyun/erdma=1參數。 -
節點不支援 eRDMA 或 eRDMA Controller 組件未正確安裝。
-
容器鏡像中缺少 RDMA 使用者態庫(libibverbs、librdmacm 等)。
解決方案:
-
執行
kubectl get node <節點名> -o jsonpath='{.status.allocatable}'確認節點是否有aliyun/erdma資源。 -
登入節點執行
ibv_devinfo檢查 eRDMA 裝置是否正常。 -
檢查容器鏡像是否包含必要的 RDMA 庫。
訓練過程中出現 NCCL timeout 錯誤怎麼辦?
NCCL timeout 通常由網路不穩定或配置不當引起。建議:
-
增加逾時時間:設定
--env NCCL_IB_TIMEOUT=23(預設為 22)。 -
增加重試次數:設定
--env NCCL_IB_RETRY_CNT=10。 -
檢查節點間的網路連通性和 eRDMA 裝置狀態。
如何判斷 eRDMA 是否真正提升了訓練效能?
可以通過以下方式對比:
-
分別提交使用 eRDMA 和不使用 eRDMA 的訓練作業(通過是否添加
--device=aliyun/erdma=1區分)。 -
對比相同訓練步數下的完成時間。
-
使用 AI Profiling 工具分析通訊時間佔比。
通常在多節點(2 個以上)、模型參數量較大(數十億參數以上)的情境下,eRDMA 的效能提升最為明顯。
Arena 提交作業失敗,提示資源不足怎麼辦?
可能的原因包括:
-
GPU 或 eRDMA 資源不足。
-
節點不滿足調度條件(如節點選取器、汙點容忍)。
解決方案:
-
執行
kubectl get nodes查看節點狀態和可用資源。 -
執行
kubectl describe pod <pod名>查看 Pod 調度失敗的詳細原因。 -
根據提示調整資源請求或增加節點。
Arena提交作業核心參數說明。
|
參數 |
說明 |
建議配置 |
|
|
作業名稱,叢集內全域唯一 |
使用具有業務含義的名稱 |
|
|
作業所屬的命名空間 |
根據團隊或專案隔離 |
|
|
Worker 節點數量(包含 Master) |
設定為 2 表示 1 個 Master + 1 個 Worker |
|
|
每個 Worker 使用的 GPU 卡數 |
根據模型大小和顯存需求設定 |
|
|
啟用 eRDMA 的關鍵參數,為每個 Worker 分配 1 個 eRDMA 資源 |
必須設定為 1 以啟用 eRDMA |
|
|
每個節點啟動的訓練進程數 |
通常設定為與 |
|
|
Pod 清理策略 |
設定為 |
|
|
環境變數 |
用於配置 NCCL 通訊參數 |
NCCL 環境變數配置(用於最佳化分布式通訊):
|
環境變數 |
說明 |
推薦配置 |
|
|
指定用於通訊的網卡介面 |
設定為 |
|
|
GPU Direct RDMA 策略等級(0-5) |
eRDMA 情境下推薦設定為 |
|
|
點對點通訊策略(0-5) |
設定為 |
|
|
集合通訊演算法 |
可選 |
|
|
記錄層級 |
調試時設定為 |
|
|
指定使用的 RDMA 網卡 |
通過 |
|
|
IB 通訊逾時時間 |
根據網路延遲調整 |
|
|
IB 通訊失敗重試次數 |
不穩定網路可適當增加 |
更多 NCCL 環境變數說明,請參見 NCCL 官方文檔。
如何構建生產環境支援 eRDMA 的容器鏡像?
使用 eRDMA 需要在容器中安裝 RDMA 使用者態庫和驅動。以下 Dockerfile 樣本基於 PyTorch 官方鏡像,整合了 eRDMA 驅動程式和 MNIST 訓練樣本。
構建生產環境支援 eRDMA 的容器鏡像,更多資訊,請參見在容器(Docker)中啟用eRDMA。
ARG PYTORCH_IMAGE=docker.io/pytorch/pytorch:2.5.1-cuda12.4-cudnn9-runtime
FROM docker.io/library/alpine:3.22.1 AS downloader
WORKDIR /workspace
RUN apk add git wget gzip
RUN mkdir -p /workspace/MNIST/raw && \
cat <<EOF > /workspace/MNIST/raw/checksums.md5
f68b3c2dcbeaaa9fbdd348bbdeb94873 train-images-idx3-ubyte.gz
d53e105ee54ea40749a09fcbcd1e9432 train-labels-idx1-ubyte.gz
9fb629c4189551a2d022fa330f9573f3 t10k-images-idx3-ubyte.gz
ec29112dd5afa0611ce80d1b7f02629c t10k-labels-idx1-ubyte.gz
EOF
RUN cd /workspace/MNIST/raw && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/train-images-idx3-ubyte.gz && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/train-labels-idx1-ubyte.gz && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/t10k-images-idx3-ubyte.gz && \
wget https://ossci-datasets.s3.amazonaws.com/mnist/t10k-labels-idx1-ubyte.gz && \
md5sum -c checksums.md5 && \
rm checksums.md5 && \
gzip -d *.gz
RUN git clone https://github.com/kubeflow/arena.git -b v0.15.2
FROM ${PYTORCH_IMAGE}
WORKDIR /workspace
COPY --from=downloader /workspace .
RUN set -eux && \
apt update && \
apt install -y wget gpg && \
wget -qO - https://mirrors.aliyun.com/erdma/GPGKEY | gpg --dearmour -o /etc/apt/trusted.gpg.d/erdma.gpg && \
echo "deb [ ] https://mirrors.aliyun.com/erdma/apt/ubuntu jammy/erdma main" > /etc/apt/sources.list.d/erdma.list && \
apt update && \
apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1 && \
pip install --no-cache-dir -r /workspace/arena/examples/pytorch/mnist/requirements.txt && \
rm -rf /var/lib/apt/lists/*