すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:Arena を使用した eRDMA アクセラレーションによる PyTorch 分散トレーニングジョブの送信

最終更新日:Mar 07, 2026

マルチノード GPU トレーニングでは、ネットワーク通信遅延が全体的なパフォーマンスを低下させる可能性があります。モデルトレーニング時間を短縮するには、Arena を使用して PyTorch 分散トレーニングジョブを送信し、eRDMA ネットワークアクセラレーションを有効にします。これにより、低遅延、高スループットのノード間通信が提供され、トレーニング効率が向上し、クラスター利用率が高まります。

適用範囲

ステップ 1: ACK eRDMA Controller コンポーネントのインストール

ACK eRDMA Controller コンポーネントをインストールします。

説明
  • クラスターで Terway ネットワークプラグインを使用している場合は、Terway コンポーネントが eRDMA 対応 ENI を変更しないように、Terway のホワイトリストも構成する必要があります。詳細については、「ENI のホワイトリストの設定」をご参照ください。

  • ノードに複数のネットワークインターフェースコントローラー (NIC) がある場合、ACK eRDMA Controller は、アタッチされた eRDMA 対応 ENI のルートを、同じ CIDR ブロック内の NIC のルートよりも低い優先度で構成します。デフォルトルート優先度は 200 です。ACK eRDMA Controller のインストール後に NIC を手動で構成する場合は、ルート競合を回避するようにしてください。

  1. クラスターリスト ページで、お使いのクラスターの名前をクリックします。左側のナビゲーションウィンドウで、アドオン管理 をクリックします。

  2. [アドオン] ページで、[ネットワーク] タブをクリックし、[ACK eRDMA コントローラー] コンポーネントを見つけ、その後、プロンプトに従って設定およびインストールします。

    構成項目

    説明

    preferDriver ドライバータイプ

    クラスターノードで使用する eRDMA ドライバータイプを選択します。有効な値は次のとおりです。

    • default: デフォルトのドライバーモード。

    • compat: RoCE 互換ドライバーモード。

    • ofed: OFED ベースのドライバーモード。このモードは GPU インスタンスタイプに適しています。

    ドライバータイプの詳細については、「eRDMA の有効化」をご参照ください。

    ポッドにノードのすべての eRDMA デバイスを割り当てるかどうか

    有効な値は次のとおりです。

    • True (選択済み):ノード上のすべての eRDMA デバイスを Pod に割り当てます。

    • False (クリア済み):NUMA トポロジーに基づいて、1 つの eRDMA デバイスを Pod に割り当てます。Pod とデバイスの固定 NUMA 割り当てを確実にするには、ノードで静的 CPU 管理ポリシーを有効にする必要があります。CPU ポリシーの構成方法については、「ノードプールの作成と管理」をご参照ください。

    インストールが完了したら、左側のナビゲーションウィンドウで ワークロード > ポッド を選択します。次に、名前空間を ack-erdma-controller に設定し、Pod のステータスを表示して、コンポーネントが期待どおりに実行されていることを確認します。

ステップ 2: ノードでの eRDMA の有効化と検証

ノードで eRDMA を有効にし、GPU と eRDMA リソースが正しく検出され、スケジュール可能であることを確認します。
  1. GPU インスタンスでの eRDMA の有効化

  2. [クラスター] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、 を選択します。 作成された Pod の行で、[操作] をクリックし、[ターミナル] をクリックします。eRDMA 対応ノードにログインし、次のコマンドを実行して eRDMA デバイス情報を表示します。

    期待される出力は、ポートステータスが PORT_ACTIVEerdma_0 デバイスを示します。これにより、eRDMA が有効になっていることが確認されます。

    ibv_devinfo
  3. ノード上の割り当て可能なリソースを表示します。

    kubectl get node <node-name> -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 を使用できます。

ステップ 3: Arena を使用したトレーニングジョブの送信

Arena を使用して PyTorch 分散トレーニングジョブを送信し、eRDMA リソースをリクエストしてノード間通信を高速化します。
  1. Cloud-native AI Suite の 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"

ステップ 4: トレーニングジョブのステータスの検証

トレーニングジョブが正常に開始されることを確認し、eRDMA ネットワークアクセラレーションがアクティブであることを検証します。
  1. クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続します。

  2. マスター Pod のログを表示します。ログに Train Epoch が表示されている場合、トレーニングジョブは正常に実行されています。

    kubectl logs pytorch-mnist-master-0 | head -n 50
  3. eRDMA がアクティブであることを確認します。マスター Pod のログで NET/IB : Using [0]erdma_0:1/RoCE を探します。これが見つかった場合、次のことを意味します。

    • NCCL が eRDMA NIC (erdma_0) を検出します。

    • 通信に RoCE (RDMA over Converged Ethernet) を使用します。

    • 分散トレーニングにおけるノード間通信は eRDMA アクセラレーションを使用します。

ステップ 5: eRDMA NIC トラフィックの監視

eRDMA NIC トラフィックをリアルタイムで監視して、データ転送を検証します。
  1. [クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、ワークロード > ポッド を選択します。 作成された Pod の行で [アクション] をクリックし、次に [端末] をクリックします。トレーニングノードにログオンして、次のコマンドを実行し、eRDMA NIC トラフィックをモニターします。

    eadm stat -d erdma_0 -l

    期待される出力は rx (download): 914.89 MiB/s 150423 p/s; tx (upload): 914.66 MiB/s 147128 p/s です。トレーニング中の継続的な双方向のアップロードおよびダウンロードトラフィックは、ノード間の勾配同期やその他の通信操作を示します。

  2. はトレーニングパフォーマンスを分析します。

    ACK クラスターは AI Profiling をサポートしています。この機能は、Torch、Python、および CUDA カーネルレベルでトレーニングパフォーマンスを分析します。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 <node-name> -o jsonpath='{.status.allocatable}' を実行して、ノードに aliyun/erdma リソースがあることを確認します。

  2. ノードにログインし、ibv_devinfo を実行して eRDMA デバイスが機能していることを確認します。

  3. コンテナイメージに必要な RDMA ライブラリが含まれていることを確認します。

トレーニング中に NCCL タイムアウトエラーが発生した場合はどうすればよいですか?

NCCL タイムアウトは通常、不安定なネットワークまたは不適切な構成が原因で発生します。次のことを推奨します。

  1. タイムアウト値を増やします: --env NCCL_IB_TIMEOUT=23 (デフォルトは 22) を設定します。

  2. 再試行回数を増やします: --env NCCL_IB_RETRY_CNT=10 を設定します。

  3. ノード間のネットワーク接続と eRDMA デバイスのステータスを確認します。

eRDMA が実際にトレーニングパフォーマンスを向上させるかどうかを判断するにはどうすればよいですか?

次のように結果を比較します。

  1. 2 つのトレーニングジョブを送信します。1 つは eRDMA を使用するもの (--device=aliyun/erdma=1 を追加)、もう 1 つは使用しないものです。

  2. 同じトレーニングステップ数での完了時間を比較します。

  3. AI Profiling ツールを使用して、通信時間の割合を分析します。

eRDMA は、大規模モデル (数十億以上のパラメーター) を使用するマルチノード (2 つ以上のノード) シナリオで最も顕著なパフォーマンス向上をもたらします。

Arena がジョブの送信に失敗し、リソース不足を報告した場合はどうすればよいですか?

考えられる原因は次のとおりです。

  • GPU または eRDMA リソースの不足。

  • ノードがスケジューリング要件 (ノードセレクターや Taint Toleration など) を満たしていません。

解決策:

  1. kubectl get nodes を実行して、ノードステータスと利用可能なリソースを表示します。

  2. kubectl describe pod <pod-name> を実行して、Pod スケジューリング失敗の詳細な理由を表示します。

  3. リソースリクエストを調整するか、必要に応じてノードを追加します。

主要な Arena ジョブパラメーター

パラメーター

説明

推奨構成

--name

ジョブ名。クラスター全体で一意である必要があります。

ビジネスコンテキストを反映した名前を使用します。

--namespace

ジョブの名前空間。

チームまたはプロジェクトで分離します。

--workers

ワーカーノードの数 (マスターを含む)。

マスター 1 台とワーカー 1 台の場合、2 に設定します。

--gpus

ワーカーあたりの GPU 数。

モデルサイズと GPU メモリ要件に基づいて設定します。

--device=aliyun/erdma=1

eRDMA を有効にするための主要なパラメーター。ワーカーごとに 1 つの eRDMA リソースを割り当てます。

eRDMA を有効にするには 1 に設定する必要があります。

--nproc-per-node

ノードあたりのトレーニングプロセス数。

通常、--gpus と一致します。

--clean-task-policy

Pod クリーンアップポリシー。

ログ検査のために Pod を保持するには None に設定します。

--env

環境変数。

NCCL 通信パラメーターを構成します。

NCCL 環境変数 (分散通信を最適化するため):

環境変数

説明

推奨構成

NCCL_SOCKET_IFNAME

通信に使用されるネットワークインターフェースの名前。

eth0 (ACK クラスターのデフォルト NIC) に設定します。

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 NIC の名前。

ibstat を実行して利用可能な NIC 名を一覧表示します。

NCCL_IB_TIMEOUT

InfiniBand 通信タイムアウト。

ネットワーク遅延に基づいて調整します。

NCCL_IB_RETRY_CNT

失敗した InfiniBand 通信の再試行回数。

不安定なネットワークの場合は増やします。

その他の NCCL 環境変数については、NCCL ドキュメントをご参照ください。

本番環境で eRDMA をサポートするコンテナイメージを構築するにはどうすればよいですか?

eRDMA を使用するには、コンテナに RDMA ユーザーモードライブラリとドライバーをインストールします。次の Dockerfile の例は、公式 PyTorch イメージに基づいており、eRDMA ドライバーと MNIST トレーニング例を統合しています。

本番環境で eRDMA をサポートするコンテナイメージの構築の詳細については、「コンテナでの eRDMA の有効化 (Docker)」をご参照ください。
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/*