全部產品
Search
文件中心

Container Service for Kubernetes:使用Arena提交eRDMA加速的PyTorch分布式訓練作業

更新時間:Mar 07, 2026

在多節點 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後需要手動設定網卡,注意避免路由衝突。

  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,單擊組件管理

  2. 組件管理頁面,單擊網路頁簽,定位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 資源已正確識別並可被調度。
  1. 在GPU執行個體上啟用eRDMA

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 容器組在建立的容器所在行,單擊操作列的終端。登入到支援 eRDMA 的節點,執行以下命令查看 eRDMA 裝置資訊。

    預期輸出中顯示 erdma_0 裝置且連接埠狀態為 PORT_ACTIVE,表示 eRDMA 裝置已正常啟用。

    ibv_devinfo
  3. 查看節點的可分配資源。

    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 資源來加速節點間通訊。
  1. 安裝雲原生AI套件的Arena組件

  2. 配置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 網路已生效。
  1. 擷取叢集KubeConfig並通過kubectl工具串連叢集

  2. 查看Master Pod的日誌,訓練日誌顯示 Train Epoch 資訊,說明訓練作業正常運行。

    kubectl logs pytorch-mnist-master-0 | head -n 50
  3. 驗證 eRDMA 是否生效。在上述Master Pod的日誌中尋找關鍵資訊 NET/IB : Using [0]erdma_0:1/RoCE,如果出現此行,表示:

    • NCCL 已成功識別 eRDMA 網卡(erdma_0)。

    • 使用 RoCE(RDMA over Converged Ethernet)協議進行通訊。

    • 分布式訓練的節點間通訊已通過 eRDMA 加速。

步驟五:監控 eRDMA 網卡流量

即時監控eRDMA網卡的網路流量,驗證資料轉送情況。
  1. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇工作負載 > 容器組在建立的容器所在行,單擊操作列的終端。登入到訓練節點,執行以下命令監控 eRDMA 網卡流量。

    eadm stat -d erdma_0 -l

    預期輸出為rx(下載): 914.89 MiB/s 150423 p/s; tx(上傳):914.66 MiB/s 147128 p/s,訓練過程中看到持續上傳下載的雙向流量,表示節點間進行中梯度同步等通訊操作。

  2. 分析訓練效能。

    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 等)。

解決方案:

  1. 執行 kubectl get node <節點名> -o jsonpath='{.status.allocatable}' 確認節點是否有 aliyun/erdma 資源。

  2. 登入節點執行 ibv_devinfo 檢查 eRDMA 裝置是否正常。

  3. 檢查容器鏡像是否包含必要的 RDMA 庫。

訓練過程中出現 NCCL timeout 錯誤怎麼辦?

NCCL timeout 通常由網路不穩定或配置不當引起。建議:

  1. 增加逾時時間:設定 --env NCCL_IB_TIMEOUT=23(預設為 22)。

  2. 增加重試次數:設定 --env NCCL_IB_RETRY_CNT=10

  3. 檢查節點間的網路連通性和 eRDMA 裝置狀態。

如何判斷 eRDMA 是否真正提升了訓練效能?

可以通過以下方式對比:

  1. 分別提交使用 eRDMA 和不使用 eRDMA 的訓練作業(通過是否添加 --device=aliyun/erdma=1 區分)。

  2. 對比相同訓練步數下的完成時間。

  3. 使用 AI Profiling 工具分析通訊時間佔比。

通常在多節點(2 個以上)、模型參數量較大(數十億參數以上)的情境下,eRDMA 的效能提升最為明顯。

Arena 提交作業失敗,提示資源不足怎麼辦?

可能的原因包括:

  • GPU 或 eRDMA 資源不足。

  • 節點不滿足調度條件(如節點選取器、汙點容忍)。

解決方案:

  1. 執行 kubectl get nodes 查看節點狀態和可用資源。

  2. 執行 kubectl describe pod <pod名> 查看 Pod 調度失敗的詳細原因。

  3. 根據提示調整資源請求或增加節點。

Arena提交作業核心參數說明。

參數

說明

建議配置

--name

作業名稱,叢集內全域唯一

使用具有業務含義的名稱

--namespace

作業所屬的命名空間

根據團隊或專案隔離

--workers

Worker 節點數量(包含 Master)

設定為 2 表示 1 個 Master + 1 個 Worker

--gpus

每個 Worker 使用的 GPU 卡數

根據模型大小和顯存需求設定

--device=aliyun/erdma=1

啟用 eRDMA 的關鍵參數,為每個 Worker 分配 1 個 eRDMA 資源

必須設定為 1 以啟用 eRDMA

--nproc-per-node

每個節點啟動的訓練進程數

通常設定為與 --gpus 相同

--clean-task-policy

Pod 清理策略

設定為 None 保留 Pod 以便查看日誌

--env

環境變數

用於配置 NCCL 通訊參數

NCCL 環境變數配置(用於最佳化分布式通訊):

環境變數

說明

推薦配置

NCCL_SOCKET_IFNAME

指定用於通訊的網卡介面

設定為 eth0(ACK 叢集預設網卡)

NCCL_NET_GDR_LEVEL

GPU Direct RDMA 策略等級(0-5)

eRDMA 情境下推薦設定為 1(PIX 層級)

NCCL_P2P_LEVEL

點對點通訊策略(0-5)

設定為 5(SYS 層級)支援跨節點通訊

NCCL_ALGO

集合通訊演算法

可選 RingTree 等,根據網路拓撲選擇

NCCL_DEBUG

記錄層級

調試時設定為 INFO,生產環境可改為 WARN

NCCL_IB_HCA

指定使用的 RDMA 網卡

通過 ibstat 查看可用網卡名稱

NCCL_IB_TIMEOUT

IB 通訊逾時時間

根據網路延遲調整

NCCL_IB_RETRY_CNT

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