マルチノード GPU トレーニングでは、ネットワーク通信の遅延がパフォーマンスのボトルネックになる可能性があります。モデルのトレーニングサイクルを短縮するために、Arena を使用して PyTorch 分散ジョブを送信し、ネットワークアクセラレーションのために Elastic Remote Direct Memory Access (eRDMA) を有効にすることができます。この設定により、ノード間の低遅延、高スループットの通信が提供され、トレーニング効率とクラスター使用率が向上します。
適用性
クラスタータイプ: ACK マネージドクラスターのみがサポートされています。
Elastic Remote Direct Memory Access (eRDMA) でサポートされているインスタンスタイプ:
gn8is、ebmgn8is、gn8v、ebmgn8v
ステップ 1: ACK eRDMA Controller をインストールする
以下の手順を実行して ACK eRDMA Controller をインストールできます。
ACK クラスターが Terway を使用している場合、Terway が eRDMA ENI を変更する場合に備えて、Terway 用に Elastic Network Interface (ENI) フィルターを構成します。詳細については、「ENI のフィルターを構成する」をご参照ください。
ノードに複数の ENI がある場合、ACK eRDMA Controller は、デフォルトのルーティング優先度
200を使用して、同じ CIDR ブロック内の ENI のルートよりも低い優先度で eRDMA の追加 ENI のルートを構成します。ACK eRDMA Controller のインストール後に ENI を手動で構成する必要がある場合は、ルーティングの競合を避けるようにしてください。
クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。
[アドオン] ページで、[ネットワーキング] タブをクリックし、ACK eRDMA Controller を見つけ、ページの手順に従ってコンポーネントを構成およびインストールします。
パラメーター
説明
preferDriver ドライバータイプ
クラスターノードで使用される eRDMA ドライバーのタイプを選択します。有効な値:
default: デフォルトのドライバーモード。compat: RDMA over Converged Ethernet (RoCE) と互換性のあるドライバーモード。ofed: ofed ベースのドライバーモードで、GPU モデルに適用できます。
ドライバーのタイプの詳細については、「eRDMA を有効にする」をご参照ください。
ノードのすべての ERDMA デバイスを Pod に割り当てるかどうかを指定します
有効な値:
True: このチェックボックスを選択すると、ノード上のすべての eRDMA デバイスが Pod に割り当てられます。
False: このチェックボックスを選択しない場合、Pod には非均一メモリアクセス (NUMA) トポロジーに基づいて eRDMA デバイスが割り当てられます。NUMA を Pod とデバイスに割り当てられるようにするには、ノードの静的 CPU ポリシーを有効にする必要があります。CPU ポリシーの構成方法の詳細については、「ノードプールを作成および管理する」をご参照ください。
左側のナビゲーションウィンドウで、[ワークロード] > [Pod] を選択します。[Pod] ページで、ack-erdma-controller 名前空間を選択して Pod のステータスを表示し、コンポーネントが期待どおりに実行されていることを確認します。
ステップ 2: ノードで eRDMA を有効にして検証する
ノードで eRDMA を有効にし、ノード上の GPU および eRDMA リソースが検出され、スケジューリングに利用可能であることを確認します。
[クラスター] ページで、ターゲットクラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。作成した Pod の行で、[アクション] 列の [ターミナル] をクリックします。eRDMA をサポートするノードにログインし、次のコマンドを実行して eRDMA デバイス情報を表示します。
出力に
erdma_0デバイスが表示され、そのポートステータスがPORT_ACTIVEの場合、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": 1 つの GPU が利用可能であることを示します。"aliyun/erdma":"200": 最大 200 個の Pod が eRDMA を使用できることを示します。
ステップ 3: 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"
ステップ 4: トレーニングジョブのステータスを検証する
トレーニングジョブが開始され、eRDMA ネットワークがアクティブであることを確認します。
Master Pod のログを表示します。トレーニングログに
Train Epoch情報が表示されている場合、トレーニングジョブは正常に実行されています。kubectl logs pytorch-mnist-master-0 | head -n 50eRDMA がアクティブであることを確認します。Master Pod のログでメッセージ
NET/IB : Using [0]erdma_0:1/RoCEを検索します。この行が存在することは、次のことを示します:NCCL が eRDMA ネットワークインターフェースカード (
erdma_0) を正常に検出しました。通信には RoCE (RDMA over Converged Ethernet) プロトコルが使用されます。
分散トレーニングのためのノード間通信は eRDMA によって高速化されます。
ステップ 5: eRDMA ネットワークインターフェースカードのトラフィックを監視する
eRDMA ネットワークインターフェースカードのネットワークトラフィックをリアルタイムで監視して、データ送信を検証します。
[クラスター] ページで、ターゲットクラスターの名前をクリックします。左側のナビゲーションウィンドウで、 を選択します。作成した Pod の行で、[アクション] 列の [ターミナル] をクリックします。トレーニングノードにログインし、次のコマンドを実行して eRDMA ネットワークインターフェースカードのトラフィックを監視します。
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 プロファイリング機能を提供しており、Torch、Python、CUDA Kernel などの複数のレベルでトレーニングパフォーマンスを分析できます。プロファイリングツールを使用して、計算、通信、メモリ使用量など、トレーニングジョブのパフォーマンスボトルネックを分析できます。
リソースのクリーンアップ
トレーニングジョブが完了したら、次のコマンドを実行してジョブを削除します:
この操作は、ジョブに関連するすべての 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 コンポーネントが正しくインストールされていません。
コンテナイメージに `libibverbs` や `librdmacm` などの RDMA ユーザーモードライブラリがありません。
解決策:
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 を使用し、もう 1 つは使用しません。
--device=aliyun/erdma=1パラメーターを追加または省略することで、それらを区別できます。同じトレーニングステップ数での完了時間を比較します。
AI プロファイリングツールを使用して、通信に費やされた時間の割合を分析します。
通常、eRDMA によるパフォーマンスの向上は、複数のノード (2 つ以上) と大規模なモデル (数十億以上のパラメーター) を持つシナリオで最も顕著です。
リソース不足エラーで Arena ジョブの送信が失敗した場合はどうすればよいですか?
考えられる理由は次のとおりです:
GPU または eRDMA リソースが不足しています。
ノードが、ノードセレクターや Taint Toleration などのスケジューリング条件を満たしていません。
解決策:
kubectl get nodesを実行して、ノードのステータスと利用可能なリソースを表示します。kubectl describe pod <pod_name>を実行して、Pod のスケジューリング失敗の詳細な理由を表示します。リソースリクエストを調整するか、要件を満たすためにノードを追加します。
コアジョブパラメーター
パラメーター | 説明 | 推奨構成 |
| ジョブ名。クラスター内で一意である必要があります。 | ビジネス固有の名前を使用します。 |
| ジョブが属する名前空間。 | チームまたはプロジェクトごとに分離します。 |
| Master ノードを含むワーカーノードの数。 | 1 つの Master と 1 つのワーカーに対して 2 に設定します。 |
| 各ワーカーが使用する GPU の数。 | モデルサイズと GPU メモリ要件に基づいて設定します。 |
| eRDMA を有効にするためのキーパラメーターです。各ワーカーに 1 つの eRDMA リソースを割り当てます。 | eRDMA を有効にするには 1 に設定する必要があります。 |
| 各ノードで開始するトレーニングプロセスの数。 | 通常、 |
| Pod のクリーンアップポリシー。 | ログ検査のために Pod を保持するには、 |
| 環境変数。 | NCCL 通信パラメーターを構成するために使用されます。 |
NCCL 環境変数構成 (分散通信の最適化のため):
環境変数 | 説明 | 推奨構成 |
| 通信用のネットワークインターフェースカードを指定します。 |
|
| GPU Direct RDMA ポリシーレベル (0-5)。 | eRDMA シナリオでは、これを |
| ピアツーピア通信ポリシー (0-5)。 | クロスノード通信をサポートするために |
| 集合通信アルゴリズム。 | オプションには |
| ログレベル。 | デバッグ用に |
| 使用する RDMA ネットワークインターフェースカードを指定します。 |
|
| InfiniBand (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/*