マルチノード GPU トレーニングでは、ネットワーク通信遅延が全体的なパフォーマンスを低下させる可能性があります。モデルトレーニング時間を短縮するには、Arena を使用して PyTorch 分散トレーニングジョブを送信し、eRDMA ネットワークアクセラレーションを有効にします。これにより、低遅延、高スループットのノード間通信が提供され、トレーニング効率が向上し、クラスター利用率が高まります。
適用範囲
-
クラスタータイプ:ACK マネージドクラスターのみ。
-
eRDMA インスタンスタイプ:
gn8is, ebmgn8is, gn8v, ebmgn8v
ステップ 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 を手動で構成する場合は、ルート競合を回避するようにしてください。
クラスターリスト ページで、お使いのクラスターの名前をクリックします。左側のナビゲーションウィンドウで、アドオン管理 をクリックします。
-
[アドオン] ページで、[ネットワーク] タブをクリックし、[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 リソースが正しく検出され、スケジュール可能であることを確認します。
-
[クラスター] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、 を選択します。 作成された Pod の行で、[操作] をクリックし、[ターミナル] をクリックします。eRDMA 対応ノードにログインし、次のコマンドを実行して eRDMA デバイス情報を表示します。
期待される出力は、ポートステータスが
PORT_ACTIVEのerdma_0デバイスを示します。これにより、eRDMA が有効になっていることが確認されます。ibv_devinfo -
ノード上の割り当て可能なリソースを表示します。
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 リソースをリクエストしてノード間通信を高速化します。
-
Cloud-native AI Suite の Arena コンポーネントをインストールします。
-
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 ネットワークアクセラレーションがアクティブであることを検証します。
-
マスター Pod のログを表示します。ログに
Train Epochが表示されている場合、トレーニングジョブは正常に実行されています。kubectl logs pytorch-mnist-master-0 | head -n 50 -
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 トラフィックをリアルタイムで監視して、データ転送を検証します。
-
[クラスターリスト] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、 を選択します。 作成された 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です。トレーニング中の継続的な双方向のアップロードおよびダウンロードトラフィックは、ノード間の勾配同期やその他の通信操作を示します。 -
はトレーニングパフォーマンスを分析します。
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 など) が不足しています。
解決策:
-
kubectl get node <node-name> -o jsonpath='{.status.allocatable}'を実行して、ノードにaliyun/erdmaリソースがあることを確認します。 -
ノードにログインし、
ibv_devinfoを実行して eRDMA デバイスが機能していることを確認します。 -
コンテナイメージに必要な RDMA ライブラリが含まれていることを確認します。
トレーニング中に NCCL タイムアウトエラーが発生した場合はどうすればよいですか?
NCCL タイムアウトは通常、不安定なネットワークまたは不適切な構成が原因で発生します。次のことを推奨します。
-
タイムアウト値を増やします:
--env NCCL_IB_TIMEOUT=23(デフォルトは 22) を設定します。 -
再試行回数を増やします:
--env NCCL_IB_RETRY_CNT=10を設定します。 -
ノード間のネットワーク接続と eRDMA デバイスのステータスを確認します。
eRDMA が実際にトレーニングパフォーマンスを向上させるかどうかを判断するにはどうすればよいですか?
次のように結果を比較します。
-
2 つのトレーニングジョブを送信します。1 つは eRDMA を使用するもの (
--device=aliyun/erdma=1を追加)、もう 1 つは使用しないものです。 -
同じトレーニングステップ数での完了時間を比較します。
-
AI Profiling ツールを使用して、通信時間の割合を分析します。
eRDMA は、大規模モデル (数十億以上のパラメーター) を使用するマルチノード (2 つ以上のノード) シナリオで最も顕著なパフォーマンス向上をもたらします。
Arena がジョブの送信に失敗し、リソース不足を報告した場合はどうすればよいですか?
考えられる原因は次のとおりです。
-
GPU または eRDMA リソースの不足。
-
ノードがスケジューリング要件 (ノードセレクターや Taint Toleration など) を満たしていません。
解決策:
-
kubectl get nodesを実行して、ノードステータスと利用可能なリソースを表示します。 -
kubectl describe pod <pod-name>を実行して、Pod スケジューリング失敗の詳細な理由を表示します。 -
リソースリクエストを調整するか、必要に応じてノードを追加します。
主要な Arena ジョブパラメーター
|
パラメーター |
説明 |
推奨構成 |
|
|
ジョブ名。クラスター全体で一意である必要があります。 |
ビジネスコンテキストを反映した名前を使用します。 |
|
|
ジョブの名前空間。 |
チームまたはプロジェクトで分離します。 |
|
|
ワーカーノードの数 (マスターを含む)。 |
マスター 1 台とワーカー 1 台の場合、2 に設定します。 |
|
|
ワーカーあたりの GPU 数。 |
モデルサイズと GPU メモリ要件に基づいて設定します。 |
|
|
eRDMA を有効にするための主要なパラメーター。ワーカーごとに 1 つの eRDMA リソースを割り当てます。 |
eRDMA を有効にするには 1 に設定する必要があります。 |
|
|
ノードあたりのトレーニングプロセス数。 |
通常、 |
|
|
Pod クリーンアップポリシー。 |
ログ検査のために Pod を保持するには |
|
|
環境変数。 |
NCCL 通信パラメーターを構成します。 |
NCCL 環境変数 (分散通信を最適化するため):
|
環境変数 |
説明 |
推奨構成 |
|
|
通信に使用されるネットワークインターフェースの名前。 |
|
|
|
GPU Direct RDMA ポリシーレベル (0~5)。 |
eRDMA の場合、 |
|
|
ピアツーピア通信ポリシー (0~5)。 |
ノード間通信をサポートするには |
|
|
コレクティブ通信アルゴリズム。 |
ネットワークトポロジーに基づいて |
|
|
ログレベル。 |
デバッグのために |
|
|
使用する RDMA NIC の名前。 |
|
|
|
InfiniBand 通信タイムアウト。 |
ネットワーク遅延に基づいて調整します。 |
|
|
失敗した 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/*