このドキュメントでは、GPU や TPU などのアクセラレータ VM に自動ネットワーキングを使用して、Google Kubernetes Engine(GKE)アクセラレータ ワークロードのネットワーク構成を簡素化する方法について説明します。これは、アクセラレータ最適化マシンで AI、ML、HPC を実行するために不可欠です。
このドキュメントは、GKE の基本的なコンセプト、GPU と TPU のワークロード、VPC ネットワーキングについて理解していることを前提としています。具体的には、次のことを理解しておく必要があります。
このページは、組織のネットワークを設計するクラウド アーキテクトとネットワーク スペシャリストの方々を対象としています。すべての GKE ドキュメント セットの概要については、GKE のドキュメントを確認するをご覧ください。Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE ユーザーのロールとタスクをご覧ください。
GKE を使用すると、専用のアクセラレータで高パフォーマンスの AI と ML を簡単に実行できます。アクセラレータ VM の自動ネットワーキングを使用すると、RDMA などのプロトコルに不可欠な高速マルチネットワーク接続を単一の構成フラグで有効にできます。この自動化により、複数の VPC ネットワークの設定、IP アドレス範囲の管理、すべてのノードプールと Pod のネットワーク インターフェースの構成といった複雑な手動プロセスが不要になります。GKE は、ノードプールの作成時に単一のパラメータを使用することで、必要なすべてのクラウド リソースと Kubernetes ネットワーキング リソースを提供します。
用語
次の用語は、アクセラレータ VM のネットワーキング アーキテクチャを理解するうえで重要です。
- Virtual Private Cloud(VPC): VPC は、Google の本番環境ネットワーク内に実装された物理ネットワークを仮想化したネットワークです。Compute Engine 仮想マシン(VM)インスタンス、GKE クラスタ、その他のリソースの接続を提供します。
- Titanium NIC: CPU からネットワーク処理タスクをオフロードし、CPU がワークロードに集中できるようにするスマート NIC。GPU マシンでは、GPU 間の直接通信以外のすべてのトラフィックを処理します。TPU マシンでは、すべての NIC が Titanium NIC です。
- サブネットワーク: サブネットワークは、大規模な VPC をセグメント化したものです。各サブネットワークはリージョンに関連付けられ、定義された IP アドレス範囲があります。
- ネットワーク インターフェース コントローラ(NIC): NIC は、VM インスタンスをネットワークに接続する仮想ネットワーク インターフェースです。各 NIC は、特定の VPC とサブネットワークに接続されます。
- ホスト ネットワーク: ノードのメイン ネットワーク インターフェース(NIC)によって、一般的なクラスタ通信(コントロール プレーン トラフィックや通常の Pod ネットワーキングなど)のために使用されるプライマリ ネットワーク。
- データ ネットワーク: アクセラレータ VM 間の高パフォーマンス データ転送専用のネットワーク。GPU の場合、これは通常、RDMA を使用する GPUDirect VPC です。TPU の場合、これは 2 番目のホスト ネットワークになることがあります。
- リモート ダイレクト メモリ アクセス(RDMA): RDMA は、オペレーティング システムや CPU を介さずに、ネットワーク デバイスがコンピュータのメインメモリと直接データを交換できるテクノロジーです。これにより、レイテンシが大幅に短縮され、スループットが向上します。これは、HPC ワークロードと ML ワークロードにとって重要です。
- NVLink: NVLink は、単一ノード内の複数の GPU を接続するために NVIDIA が開発した高速相互接続テクノロジーです。これにより、GPU はメモリを共有し、大規模なデータセットに対して連携できます。
- Kubernetes 動的リソース割り当て(DRA): DRA は、Pod が GPU などのリソースやその他の専用ハードウェアをリクエストして消費するためのより柔軟な方法を提供する Kubernetes 機能です。これにより、リソース割り当てのきめ細かい管理が可能になります。
自動ネットワーキングの仕組み
アクセラレータ最適化マシンには、GPU と TPU の間の高スループットで低レイテンシの通信をサポートする特殊なネットワーク アーキテクチャがあります。各物理マシンには複数の GPU または TPU が含まれており、多くの場合、NVLink などの高速相互接続によって接続されています。マシンには、一般的なネットワーキング用の NIC が 1 つ以上と、高速相互接続用の GPU NIC が複数あります。
アクセラレータ最適化マシンタイプを使用する GKE ノードを作成すると、GKE は基盤となる VM に複数の NIC を構成します。ホスト NIC は、一般的なクラスタ通信と管理のためにホスト VPC ネットワークに接続し、コントロール プレーンと通信します。GPU NIC は、多くの場合 RDMA が有効で MTU 設定が高い(8896)専用の高パフォーマンス VPC ネットワークに接続し、GPUDirect 通信を容易にします。
Pod が GPU または TPU をリクエストするときに、ノードの高パフォーマンス ネットワーク インターフェースにアクセスするように構成できます。使用可能なすべての NIC をリクエストすることも、特定のサブセットをリクエストすることもできます。要求された各ネットワーク インターフェースは、単一の Pod 専用であり、共有されません。このネットワーク構成により、特定の Pod がそのインターフェースの全帯域幅とリソースを独占的に使用できます。これは、パフォーマンスが重視されるワークロードにとって重要な利点です。
制限事項
- アクセラレータ VM の自動ネットワーキングは、Autopilot クラスタではサポートされていません。
- 自動ネットワーキングでは、クラスタで GKE Dataplane V2 を使用する必要があります。
- サポートされているマシンタイプ: 自動ネットワーキングは、A3、A4、TPU Trillium(v6e)アクセラレータ最適化マシン ファミリーでサポートされています。
- シングルゾーンのノードプールが必要: シングルゾーンのノードプールを使用する必要があります。
- GKE マネージド DRANET を使用してワークロードを構成する場合は、GKE マネージド DRANET の考慮すべきポイントと制限事項をご覧ください。
- 同じノードプールで マルチネットワーク API と DRANET の両方を使用することはできません。Pod のネットワーク アタッチメントには、1 つの方法を選択する必要があります。
アクセラレータ最適化マシンのネットワーク構成
アクセラレータ最適化マシンは、タイプによってネットワーク構成が異なります。次の表に、さまざまなマシンタイプのネットワーク仕様をまとめます。
GPU アクセラレータ VM
| マシンタイプ | GPU の数 | Titanium NIC の数 | GPU NIC の数 | GPUDirect テクノロジー | 追加の VPC |
|---|---|---|---|---|---|
| A3 | 8(H100) | 1 | 4 | TCPX | 4(GPU NIC 用) |
| A3 Mega | 8(H100) | 1 | 8 | TCPXO | 8(GPU NIC 用) |
| A3 Ultra | 8(H200) | 2 | 8 | RDMA | 2(2 番目の NIC 用に 1、GPU NIC 用に 1) |
| A4 | 8(B200) | 2 | 8 | RDMA | 2(2 番目の NIC 用に 1、GPU NIC 用に 1) |
| A4X | 4(GB200) | 1 | 4 | RDMA | 2(2 番目の NIC 用に 1、GPU NIC 用に 1) |
TPU アクセラレータ VM
| マシンタイプ | TPU チップの数 | NIC の数 | 追加の VPC |
|---|---|---|---|
| TPU Trillium(v6e)(ct6e-standard-4t) | 4 | 2 | 2(2 番目の NIC 用に 1、最初の NIC での追加の VNIC 用に 1) |
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
クラスタで GKE バージョン 1.34.1-gke.1829001 以降が使用されていることを確認します。
クラスタに GKE Dataplane V2 があることを確認します。この機能は、新しいクラスタを作成するとき、または既存のクラスタを更新するときに有効にできます。
新しいクラスタを作成します。
gcloud container clusters create CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --enable-dataplane-v2次のように置き換えます。
CLUSTER_NAME: 新しいクラスタの名前。CLUSTER_VERSION: クラスタのバージョン。1.34.1-gke.1829001 以降にする必要があります。
既存のクラスタを更新します。
gcloud container clusters update CLUSTER_NAME \ --enable-dataplane-v2CLUSTER_NAMEは、使用するクラスタの名前に置き換えます。
RDMA を使用する GPU ワークロードをデプロイする場合は、
DeviceClassリソースが存在することを確認します。kubectl get deviceclass mrdma.google.com
デフォルトのネットワーク プロファイルを使用してノードプールを作成する
単一ゾーン内のすべての GPU マシンまたは TPU マシンを接続するネットワークを自動的に作成するには、auto アクセラレータ ネットワーク プロファイルを使用してノードプールを作成します。
gcloud
構成されたネットワーク プロファイルで自動的にノードプールを作成するには、次のコマンドを実行します。
gcloud beta container node-pools create NODE_POOL_NAME \
--accelerator-network-profile=auto \
--node-locations=ZONE \
--machine-type=MACHINE_TYPE
アクセラレータを使用してノードプールを作成する方法については、Autopilot ノードプールで GPU を実行すると Autopilot に TPU ワークロードをデプロイするをご覧ください。これらのドキュメントの手順に沿って操作する場合は、gcloud container node-pools create コマンドに --accelerator-network-profile=auto フラグを追加します。
マルチホスト TPU スライス ノードプールの場合、--tpu-topology フラグを追加する必要もあります。
次のように置き換えます。
NODE_POOL_NAME: 新しいノードプールの名前。ZONE: ノードプールのゾーン。MACHINE_TYPE: ノードのマシンタイプ(例:a3-ultragpu-8g)。
REST
nodePools.create メソッドへのリクエストで、accelerator_network_profile フィールドを指定します。
{
"nodePool": {
"name": "NODE_POOL_NAME",
"machineType": "MACHINE_TYPE",
...
"accelerator_network_profile": "auto"
}
}
次のように置き換えます。
NODE_POOL_NAME: 新しいノードプールの名前。MACHINE_TYPE: ノードのマシンタイプ(例:a3-ultragpu-8g)。
GPU を使用するワークロードをスケジュールする
以降のセクションでは、GKE マネージド DRANET で RDMA ネットワーク インターフェースを使用するように GPU ノードプールとワークロードを構成する方法について説明します。詳細については、GKE マネージド DRANET を使用してネットワーク リソースを割り当てるをご覧ください。
GPU ノードプールで GKE マネージド DRANET ドライバを有効にする
RDMA をサポートする GPU ノードプールで GKE DRANET ドライバを有効にするには、ノードプールの作成時に cloud.google.com/gke-networking-dra-driver=true ラベルを追加します。
gcloud beta container node-pools create NODE_POOL_NAME \
--region=REGION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--accelerator type=ACCELERATOR_TYPE,count=ACCELERATOR_COUNT,gpu-driver-version=DRIVER_VERSION \
--machine-type=MACHINE_TYPE \
--num-nodes=NUM_NODES \
--reservation-affinity=specific \
--reservation=projects/RESERVATION_PROJECT/reservations/RESERVATION_NAME/reservationBlocks/RESERVATION_BLOCK \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
次のように置き換えます。
NODE_POOL_NAME: 新しいノードプールの名前。REGION: クラスタの Google Cloud リージョン。CLUSTER_NAME: クラスタの名前。ACCELERATOR_TYPE: GPU アクセラレータのタイプ。例:
- A4 VM:
nvidia-b200と入力します。 - A3 Ultra VM:
nvidia-h200-141gbと入力します。
- A4 VM:
ACCELERATOR_COUNT: ノードプール内のノードに接続する GPU の数。たとえば、a4-highgpu-8g VM と a3-ultragpu-8g VM はどちらも、GPU の数は 8 です。DRIVER_VERSION: 使用する GPU ドライバのバージョン。たとえば、defaultやlatestです。MACHINE_TYPE: ノードプールのマシンタイプ(例:a3-ultragpu-8g)。NUM_NODES: ノードプールのノード数。Flex Start の場合、この値は 0 に設定する必要があります。RESERVATION_PROJECT: 予約のプロジェクト ID。RESERVATION_NAME: 予約の名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。RESERVATION_BLOCK: 予約内の特定のブロックの名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。
このコマンドは、アクセラレータ ネットワーク プロファイルを使用して、指定したアクセラレータ VM 用の VPC ネットワークとサブネットを自動的に構成します。または、VPC ネットワークとサブネットを明示的に指定することもできます。
ワークロードの RDMA リソースをデプロイする
RDMA リソースを Pod に割り当てるには、ResourceClaimTemplate を指定します。
ResourceClaimTemplateを作成して RDMA デバイスの割り当て方法を定義します。次のマニフェストは、ノード上の使用可能なすべてのmrdmaデバイスをリクエストします。このマニフェストをall-mrdma-template.yamlとして保存します。apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-mrdma spec: spec: devices: requests: - name: req-mrdma exactly: deviceClassName: mrdma.google.com allocationMode: All次のようにマニフェストを適用します。
kubectl apply -f all-mrdma-template.yamlワークロードをデプロイし、
ResourceClaimTemplateを参照します。次のマニフェストは、all-mrdmaテンプレートを参照する Pod をデプロイします。これにより、この Pod にノード上の RDMA インターフェースへのアクセス権が付与されます。このマニフェストをagnhost-rdma-pod.yamlとして保存します。apiVersion: v1 kind: Pod metadata: name: agnhost-rdma namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: rdma limits: nvidia.com/gpu: 1 resourceClaims: - name: rdma resourceClaimTemplateName: all-mrdma次のようにマニフェストを適用します。
kubectl apply -f agnhost-rdma-pod.yaml追加で割り当てられたネットワーク インターフェースが Pod 内で表示されることを確認します。
kubectl exec agnhost-rdma -- ls /sys/class/net次の出力例は、デフォルト インターフェースの
eth0とloに加えて、RDMA インターフェース(gpu0rdma0など)が割り当てられていることを示しています。ネットワーク インターフェース(NIC)の数と名前は、GKE ノードのマシンタイプによって異なります。eth0 gpu0rdma0 gpu1rdma0 gpu2rdma0 gpu3rdma0 lo
TPU を使用するワークロードをスケジュールする
以降のセクションでは、GKE マネージド DRANET で RDMA 以外のネットワーク インターフェースを使用するように TPU ノードプールとワークロードを構成する方法について説明します。詳細については、GKE マネージド DRANET を使用してネットワーク リソースを割り当てるをご覧ください。
ネットワーキングの DeviceClass を確認する
ネットワーキング用の DeviceClass リソースがクラスタに存在することを確認します。
kubectl get deviceclass netdev.google.com
出力は次のようになります。
NAME AGE
netdev.google.com 2d22h
TPU スライス ノードプールで GKE マネージド DRANET ドライバを有効にする
TPU スライス ノードプールの作成時に GKE DRANET ドライバを有効にするには、cloud.google.com/gke-networking-dra-driver=true ラベルを追加します。
gcloud beta container node-pools create NODE_POOL_NAME \
--location=LOCATION \
--cluster=CLUSTER_NAME \
--node-locations=NODE_LOCATIONS \
--machine-type=MACHINE_TYPE \
--tpu-topology=TPU_TOPOLOGY \
--num-nodes=NUM_NODES \
--accelerator-network-profile=auto \
--node-labels=cloud.google.com/gke-networking-dra-driver=true
次のように置き換えます。
NODE_POOL_NAME: 新しいノードプールの名前。LOCATION: クラスタの Google Cloud リージョンまたはゾーン。CLUSTER_NAME: クラスタの名前。NODE_LOCATIONS: ノードプール内のノードの Google Cloud ゾーン。MACHINE_TYPE: ノードに使用するマシンのタイプ。TPU に対応したマシンタイプの詳細については、TPU のバージョンを選択するをご覧ください。TPU_TOPOLOGY: TPU トポロジ(例:2x4x4)。トポロジの形式は TPU のバージョンによって異なります。TPU トポロジの詳細については、トポロジを選択するをご覧ください。NUM_NODES: ノードプール内のノード数。
詳細については、単一ホスト TPU スライス ノードプールを作成するをご覧ください。
すべてのネットワーク デバイスをリクエストするワークロードをデプロイする
RDMA 以外のネットワーク デバイスを Pod に割り当てるには、ResourceClaimTemplate を指定します。
netdev.google.comDeviceClassを参照するResourceClaimTemplateを作成します。次のマニフェストは、ノード上の使用可能な RDMA 以外のすべてのネットワーク デバイスをリクエストします。このマニフェストを
all-netdev-template.yamlとして保存します。apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: name: all-netdev spec: spec: devices: requests: - name: req-netdev exactly: deviceClassName: netdev.google.com allocationMode: All次のようにマニフェストを適用します。
kubectl apply -f all-netdev-template.yamlワークロードをデプロイし、
ResourceClaimTemplateを参照します。次のマニフェストは、all-netdevテンプレートを参照する Pod をデプロイします。これにより、この Pod にノード上の RDMA 以外のすべてのネットワーク デバイスへのアクセス権が付与されます。このマニフェストをnetdev-pod.yamlとして保存します。apiVersion: v1 kind: Pod metadata: name: agnhost-netdev namespace: default labels: app: agnhost spec: containers: - name: agnhost image: registry.k8s.io/e2e-test-images/agnhost:2.39 args: ["netexec", "--http-port", "80"] ports: - name: agnhost-port containerPort: 80 resources: claims: - name: netdev limits: google.com/tpu: 4 nodeSelector: cloud.google.com/gke-tpu-accelerator: TPU_ACCELERATOR cloud.google.com/gke-tpu-topology: TPU_TOPOLOGY resourceClaims: - name: netdev resourceClaimTemplateName: all-netdev次のように置き換えます。
TPU_ACCELERATOR: TPU アクセラレータ タイプ(例:tpu-v5p-slice)。TPU_TOPOLOGY: TPU トポロジ(例:2x4x4)。
次のようにマニフェストを適用します。
kubectl apply -f netdev-pod.yaml追加で割り当てられたネットワーク インターフェースが Pod 内で表示されることを確認します。
kubectl exec agnhost-netdev -- ls /sys/class/net次の出力例は、デフォルト インターフェースの
eth0とloに加えて、eth1やeth2などのネットワーク デバイスが割り当てられていることを示しています。NIC の数と名前は、GKE ノードのマシンタイプによって異なります。eth0 eth1 eth2 lo
トラブルシューティング
ノードプールのネットワーク設定を確認するには、次のコマンドを実行します。
gcloud beta container node-pools describe NODE_POOL_NAME \
--zone=ZONE \
--cluster=CLUSTER_NAME
次のように置き換えます。
NODE_POOL_NAME: ノードプールの名前。ZONE: ノードプールのゾーン。CLUSTER_NAME: クラスタの名前。
出力には、ノードプールに接続されている追加のネットワークとサブネットワークが表示されます。
次のステップ
- アクセラレータ最適化マシンについて読む。
- DRA を使用して GPU をプロビジョニングする方法を確認する。
- Pod のマルチネットワーク サポートを設定する方法を確認する。
- GKE マネージド DRANET を使用してネットワーク リソースを割り当てる方法を確認する