Pod で RDMA ネットワーキングを有効化し、NCCL 分散トレーニングや SMC-R による透過的な TCP 高速化を実現します。
ACK eRDMA Controller をインストールし、Pod で eRDMA 高速化を有効化します。このドキュメントでは、NCCL を使用した GPU 分散トレーニングと、SMC-R を使用した透過的な TCP 高速化の 2 つのシナリオについて説明します。
前提条件
以下をご確認ください:
-
Kubernetes 1.20 以降を実行している Container Service for Kubernetes (ACK) クラスター。必要に応じて、クラスターをアップグレードしてください。
-
Elastic RDMA Interface (ERI) をサポートする ERI 対応インスタンスファミリーのノードがノードプールに追加されています。
仕組み
ACK eRDMA Controller は、クラスターノード上の eRDMA 対応 Elastic Network Interface (ENI) を管理します。eRDMA デバイスを aliyun/erdma 拡張リソースとして登録し、ENI ルートを設定し、Kubernetes のリソースリクエストを通じて Pod にデバイスを公開します。
Pod は、リソース制限で aliyun/erdma を宣言することで eRDMA へのアクセスをリクエストします。コードを変更せずに TCP 接続も高速化するには、Pod のアノテーションを通じて SMC-R を有効にします。
| コンポーネント | 役割 |
|---|---|
| ACK eRDMA Controller | eRDMA デバイスを拡張リソースとして登録し、ENI ルートを管理します |
eRDMA ドライバー (default / compat / ofed) |
各ノードにインストールされるカーネルレベルのドライバー |
aliyun/erdma リソース |
Pod のデバイスアクセス用の Kubernetes 拡張リソース |
| SMC-R | TCP を RDMA トランスポートに透過的に置き換える Linux プロトコル |
ステップ 1:ACK eRDMA Controller のインストール
ご利用のクラスターが Terway ネットワークプラグインを使用している場合は、Terway が eRDMA 対応 ENI を変更しないように、ENI のホワイトリストを設定してください。
-
[クラスター] ページで、クラスター名をクリックし、[アドオン] をクリックします。
-
[アドオン] ページで、[ネットワーク] タブをクリックします。 次の設定で ACK eRDMA Controller を検索してインストールします:
説明ノードに複数の NIC がある場合、コントローラーは eRDMA ENI ルートに、同じ CIDR の NIC ルートよりも低い優先度を割り当てます。デフォルトの優先度は
200です。手動で NIC ルートを設定する際は、この範囲との競合を避けてください。設定 説明 preferDriver (ドライバータイプ) eRDMA ドライバーのモードです。 default:標準の高速化。compat:RoCE 互換環境。ofed:NCCL を実行する GPU インスタンス。詳細については、「eRDMA の有効化」をご参照ください。ノードのすべての eRDMA デバイスを Pod に割り当てるかどうかを指定します True:ノード上のすべての eRDMA デバイスを Pod に割り当てます。False:NUMA トポロジーに基づいて 1 つのデバイスを割り当てます。Falseには静的 CPU 管理ポリシーが必要です。詳細については、「ノードプールの作成と管理」をご参照ください。 -
コントローラーが実行中であることを確認します。[ワークロード] > [Pods] に移動し、名前空間を
ack-erdma-controllerに設定して、すべての Pod が実行中であることを確認します。
ステップ 2:Pod で eRDMA を有効化
ご利用の Pod の spec に以下の構成を追加して、eRDMA 高速化を有効にします。
eRDMA デバイスアクセスの有効化
コンテナのリソース制限で aliyun/erdma リソースを宣言します。
spec:
containers:
- name: erdma-container
resources:
limits:
aliyun/erdma: 1
Pod の起動後、eRDMA デバイスが利用可能であることを確認します。
/# ls /dev/infiniband/
rdma_cm uverbs0
SMC-R による透過的な TCP 高速化の有効化
SMC-R は、コードを変更することなく、RDMA を介して TCP 接続を透過的に高速化します。eRDMA デバイスアクセスを有効にした後、次のアノテーションを追加します。
metadata:
annotations:
network.alibabacloud.com/erdma-smcr: "true"
-
TCP 接続の両端で SMC-R が有効になっている必要があります。
-
カーネルバージョン 5.10.134-17 以降の Alibaba Cloud Linux 3 でのみサポートされています。詳細については、「Alibaba Cloud Linux 3 イメージリリースノート」をご参照ください。
-
preferDriverがofedまたはcompatに設定されている場合はサポートされません。 -
eRDMA と SMC-R は IPv6 をサポートしていません。SMC-R は IPv6 接続の場合、TCP にフォールバックします。
ユースケース
GPU 分散トレーニングのための NCCL 通信の高速化
このシナリオは、分散トレーニングを実行する GPU コンピューティング型インスタンスで使用します。Pod は ofed ドライバーを使用し、GPU と eRDMA リソースをリクエストします。
-
preferDriverをofedに設定して ACK eRDMA Controller をインストールします。 -
GPU ノードをノードプールに追加します。詳細については、「ノードプールの作成と管理」をご参照ください。
-
ビルド時にコンテナイメージに eRDMA パッケージをインストールします。Debian または Ubuntu の場合 (ご利用の環境に合わせて
{OS|ubuntu}と{Version|focal}を置き換えてください):wget -qO - https://mirrors.aliyun.com/erdma/GPGKEY | apt-key add - \ && echo "deb [ arch=amd64 ] https://mirrors.aliyun.com/erdma/apt/{OS|ubuntu} {Version|focal}/erdma main" \ | tee /etc/apt/sources.list.d/erdma.list \ && apt update \ && apt install -y libibverbs1 ibverbs-providers ibverbs-utils librdmacm1Alibaba Cloud Linux または RHEL の場合:
cat > /etc/yum.repos.d/erdma.repo <<EOF [erdma] name = ERDMA Repository baseurl = http://mirrors.aliyun.com/erdma/yum/redhat/7/erdma/x86_64/ gpgcheck = 0 enabled = 1 EOF yum install --disablerepo=* --enablerepo erdma -y libibverbs ibverbs-providers ibverbs-utils librdmacm -
GPU アプリケーションをデプロイします。この StatefulSet は、それぞれ 8 つの GPU と 1 つの eRDMA デバイスを持つ 2 つのレプリカで
nccl-testを実行します:apiVersion: apps/v1 kind: StatefulSet metadata: name: nccltest spec: selector: matchLabels: app: nccltest serviceName: "nccltest" replicas: 2 template: metadata: labels: app: nccltest spec: hostNetwork: true dnsPolicy: ClusterFirstWithHostNet containers: - env: - name: NCCL_SOCKET_IFNAME value: "eth0" - name: NCCL_DEBUG value: "INFO" - name: NCCL_IB_GID_INDEX value: "1" image: <nccl-test-image-with-erdma> imagePullPolicy: Always name: nccltest securityContext: privileged: true resources: limits: nvidia.com/gpu: "8" aliyun/erdma: "1" requests: nvidia.com/gpu: "8" aliyun/erdma: "1" -
NCCL が eRDMA を使用していることを確認します。ログに
erdma_0とerdma_1がアクティブとして表示され、eRDMA による高速化が確認できます。
SMC-R によるアプリケーションネットワークの透過的な高速化
このシナリオは、コードの変更なしで eRDMA 高速化が必要な標準的な TCP ワークロードで使用します。preferDriver を default に設定します。
-
preferDriverをdefaultに設定して ACK eRDMA Controller をインストールします。 -
SMC-R アノテーションを付けてアプリケーションをデプロイします。この Deployment は、eRDMA デバイスアクセスと SMC-R 高速化を有効にします:
apiVersion: apps/v1 kind: Deployment metadata: labels: app: app-with-erdma name: app-with-erdma spec: replicas: 2 selector: matchLabels: app: app-with-erdma template: metadata: labels: app: app-with-erdma annotations: network.alibabacloud.com/erdma-smcr: "true" spec: containers: - image: <application image> imagePullPolicy: Always name: app-with-erdma resources: limits: aliyun/erdma: 1 -
高速化を確認します。コンテナに
smc-toolsをインストールし、smcssを実行します:/# smcss State UID Inode Local Address Peer Address Intf Mode ACTIVE 00000 0059964 172.17.192.73:47772 172.17.192.10:80 0000 SMCRSMCRin the Mode column confirms eRDMA acceleration is active. If it showsTCP, verify both client and server pods have the SMC-R annotation set to"true".
次のステップ
-
ACK eRDMA Controller — コンポーネントのリファレンスと設定詳細
-
eRDMA の有効化 — ドライバータイプの選択ガイド
-
ノードプールの作成と管理 — eRDMA 対応ノードの追加と CPU ポリシーの設定