A4 または A3 Ultra を使用するカスタム AI 最適化 GKE クラスタを作成する

このページでは、AI と ML のワークロードをサポートするために A4 または A3 Ultra 仮想マシン(VM)を使用する AI 最適化 Google Kubernetes Engine(GKE)クラスタを作成する方法について説明します。A4X の場合は、A4X を使用するカスタム AI 最適化 GKE クラスタを作成するをご覧ください。

A4 マシンシリーズと A3 Ultra マシンシリーズは、ターゲットを絞ったワークロード配置、高度なクラスタ メンテナンス制御、トポロジーを考慮したスケジューリングなどの機能を備えた大規模な AI / ML クラスタを実行できるように設計されています。詳細については、クラスタ管理の概要をご覧ください。

GKE は、組織の多様なワークロードを実行するための単一のプラットフォーム サーフェスを提供し、複数のプラットフォームを管理する運用上の負担を軽減します。高性能な分散型事前トレーニング、モデルのファインチューニング、モデルの推論、アプリケーションのサービング、サポート サービスなどのワークロードを実行できます。

このページでは、ワークロードのニーズに基づいてクラスタを構成する際に最大限の柔軟性を確保するために、Google Cloud CLI を使用して GKE クラスタを作成する方法について説明します。または、Cluster Toolkit を使用して、多くのユースケースのベスト プラクティスを反映したデフォルト設定でクラスタを迅速にデプロイすることもできます。この操作を行う手順については、デフォルト構成で AI に最適化された GKE クラスタを作成するをご覧ください。

GPUDirect RDMA を使用したクラスタ構成オプション

Google Cloud CLI を使用してクラスタを作成するには、次のクラスタ構成オプションのいずれかを選択します。

  • 分散 AI ワークロードを実行する予定がない場合: GPUDirect RDMA を使用せずに GKE クラスタを作成します。
  • 分散 AI ワークロードを実行する予定がある場合: GPUDirect RDMA を使用して GKE クラスタを作成します。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API を有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

必要なロール

GKE クラスタの作成と管理に必要な権限を取得するには、プロジェクトに対する次の IAM ロールの付与を管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

使用オプションを選択して容量を取得する

  1. 使用オプションを選択します。GPU リソースの取得方法と使用方法に基づいて選択します。詳細については、消費オプションを選択するをご覧ください。

    GKE の場合、消費オプションを選択する際は、次の追加情報を考慮してください。

  2. 容量を取得する。使用オプションの容量を取得する方法を学習する。

要件

AI 最適化 GKE クラスタには、次の要件が適用されます。

  • Flex Start プロビジョニング モデルを使用するには、GKE バージョン 1.32.2-gke.1652000 以降を使用する必要があります。
  • マシンタイプに応じて、最小 GPU ドライバ バージョンを使用していることを確認します。

    • A4: A4 VM の B200 GPU には、R570 GPU ドライバ バージョン以上が必要です。GKE は、デフォルトで、A4 の最小バージョン(1.32.1-gke.1729000 以降)を実行するすべての A4 ノードにこのドライバ バージョンを自動的にインストールします。
    • A3 Ultra: A3 Ultra VM の H200 GPU には、R550 GPU ドライバ バージョン以上が必要です。これは、GKE バージョン 1.31 で latest ドライバ バージョンとして使用できます。A3 Ultra VM の場合、gpu-driver-version=latest フィールドの値を GKE バージョン 1.31 で設定する必要があります。GKE バージョン 1.31.5-gke.1169000 以降では、gpu-driver-version フラグを省略した場合を含め、デフォルトで R550 GPU ドライバ バージョンが A3 Ultra ノードに自動的にインストールされます。
  • GPUDirect RDMA を使用するには、次の追加要件が適用されます。

    • マシンタイプに応じて、次の最小バージョンを使用します。
      • A4: バージョン 1.32.2-gke.1475000 以降を使用します。
      • A3 Ultra: バージョン 1.31.4-gke.1183000 以降を使用します。
    • GKE ノードでは Container-Optimized OS ノードイメージを使用する必要があります。Ubuntu と Windows のノードイメージはサポートされません。
    • GKE ワークロードは使用可能なすべての GPU を使用し、Pod は単一の GKE ノードで使用可能なすべてのセカンダリ ネットワーク インターフェース カード(NIC)を使用する必要があります。複数の Pod が単一の GKE ノードで RDMA を共有することはできません。
    • この設定では、NCCL テストが実行されます。この NCCL テストを実行するには、最小 VM 割り当てが 2 である必要があります(a4-highgpu-8g または a3-ultragpu-8g マシンタイプを使用する場合は 16 個の GPU)。
    • GPUDirect RDMA は、NCCL Fast Socket または GPUDirect TCPX/TCPXO と互換性がありません。GPUDirect RDMA を使用するクラスタで、NCCL Fast Socket を有効にしたり、TCPX/TCPXO プラグインをインストールしたりしないでください。
  • 選択したマシンタイプを使用できるロケーションを使用していることを確認します。詳細については、GPU のロケーションをご覧ください。

AI 最適化 GKE クラスタを作成する

このセクションの手順に沿って、AI 最適化 GKE クラスタの要件を満たす GKE クラスタを作成します。GPUDirect RDMA を使用するクラスタを作成するか、使用しないクラスタを作成するかを選択できます。

クラスタの作成に関する考慮事項

クラスタを作成する際は、次の情報を考慮してください。

  • クラスタのロケーションを選択する:
    • 選択したマシンタイプが利用可能なロケーションを使用していることを確認します。詳細については、GPU のロケーションをご覧ください。
    • 高密度予約の場合は、ゾーンクラスタを作成できます。この場合は、--region フラグを --zone=COMPUTE_ZONE フラグに置き換えます。ここで、COMPUTE_ZONE はコントロール プレーンのゾーンです。
    • 1,000 個を超えるノードで実行され、ノード間のネットワーク レイテンシが低いワークロードの場合は、リージョン クラスタを作成できます。パフォーマンスに影響を受けやすいノードを物理的にコロケーションするには、--node-locations フラグを使用して、単一のゾーン内に GPU ノードプールを作成します。
  • ドライバのバージョンを選択する:
    • ドライバのバージョンは、次のいずれかの値になります。
      • default: GKE ノード バージョンのデフォルトのドライバ バージョンをインストールします。デフォルトのドライバ バージョンの要件について詳しくは、要件セクションをご覧ください。
      • latest: GKE バージョンに対応する最新のドライバ バージョンをインストールします。このオプションは、Container-Optimized OS を使用するノードでのみ使用できます。
      • disabled: ドライバの自動インストールをスキップします。ノードプールの作成後に、手動でドライバをインストールする必要があります。
    • GKE ノード バージョンのデフォルトと最新の GPU ドライバ バージョンの詳細については、NVIDIA GPU ドライバを手動でインストールするをご覧ください。
  • 予約アフィニティを選択する:

    • 予約の名前や予約内の特定のブロックの名前など、予約に関する情報を確認できます。これらの値を確認するには、将来の予約リクエストを表示するをご覧ください。
    • --reservation-affinity フラグは、specific または any の値を取ることができます。ただし、高パフォーマンスの分散 AI ワークロードには、特定の予約を使用することをおすすめします。
    • 共有予約などの特定の予約を使用する場合は、--reservation フラグの値を次の形式で指定します。

      projects/PROJECT_ID/reservations/RESERVATION_NAME/reservationBlocks/BLOCK_NAME
      

      次のように置き換えます。

      • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
      • RESERVATION_NAME: 予約の名前。
      • BLOCK_NAME: 予約内の特定のブロックの名前。

GPUDirect RDMA を使用せずにクラスタを作成する

GPUDirect RDMA を使用しないクラスタを作成するには、次の手順に沿って、CPU ベースのデフォルト ノードプールと GPU を搭載した追加のノードプールを含むクラスタを作成します。このアプローチにより、デフォルトのノードプールで他のサービスを実行できます。

  1. クラスタを作成します。

      gcloud container clusters create CLUSTER_NAME \
          --cluster-version=CLUSTER_VERSION \
          --region=COMPUTE_REGION
    

    次のように置き換えます。

    • CLUSTER_NAME: 新しいクラスタの名前。
    • CLUSTER_VERSION: 新しいクラスタのバージョン。構成をサポートする GKE のバージョンについては、要件をご覧ください。
    • COMPUTE_REGION: 新しいクラスタのリージョン。ゾーンクラスタを作成する場合は、--region フラグではなく --zone フラグを使用します。例: --zone=COMPUTE_ZONECOMPUTE_ZONE は、コントロール プレーンのゾーンに置き換えます。
  2. 次のいずれかのコマンドを使用して、GPU ベースのノードプールを作成します。実行する必要があるコマンドは、デプロイで使用する使用オプションによって異なります。使用オプションのプロビジョニング モデルに対応するタブを選択します。

    予約で制限

    予約バインド プロビジョニングの場合は、次のコマンドを実行します。

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --num-nodes=NUM_NODES \
          --reservation-affinity=specific \
          --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME
    

    次のように置き換えます。

    • NODE_POOL_NAME: ノードプールの名前。
    • COMPUTE_REGION: 新しいクラスタのリージョン。
    • CLUSTER_NAME: 新しいクラスタの名前。
    • COMPUTE_ZONE: ノードプールのゾーン。
    • GPU_TYPE: GPU アクセラレータのタイプ。

      • A4 VM: nvidia-b200 と入力します。
      • A3 Ultra VM: nvidia-h200-141gb と入力します。
    • AMOUNT: ノードプール内のノードに接続する GPU の数。たとえば、a4-highgpu-8g VM と a3-ultragpu-8g VM はどちらも、GPU の数は 8 です。

    • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。defaultlatestdisabled のいずれかの値になります。

    • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。たとえば、A4 VM には a4-highgpu-8g を使用し、A3 Ultra VM には a3-ultragpu-8g を使用します。

    • NUM_NODES: ノードプールのノード数。

    • RESERVATION_NAME: 予約の名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。

    • BLOCK_NAME: 予約内の特定のブロックの名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。

    Flex Start

    Flex Start プロビジョニングの場合は、次のコマンドを実行します。

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --flex-start --enable-autoscaling --num-nodes=0 \
          --total-max-nodes TOTAL_MAX_NODES \
          --no-enable-autorepair --location-policy=ANY \
          --reservation-affinity=none [\
          --enable-queued-provisioning]
    

    次のように置き換えます。

    • NODE_POOL_NAME: ノードプールの名前。
    • COMPUTE_REGION: 新しいクラスタのリージョン。
    • CLUSTER_NAME: 新しいクラスタの名前。
    • COMPUTE_ZONE: ノードプールのゾーン。
    • GPU_TYPE: GPU アクセラレータのタイプ。

      • A4 VM: nvidia-b200 と入力します。
      • A3 Ultra VM: nvidia-h200-141gb と入力します。
    • AMOUNT: ノードプール内のノードに接続する GPU の数。たとえば、a4-highgpu-8g VM と a3-ultragpu-8g VM はどちらも、GPU の数は 8 です。

    • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。defaultlatestdisabled のいずれかの値になります。

    • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。たとえば、A4 VM には a4-highgpu-8g を使用し、A3 Ultra VM には a3-ultragpu-8g を使用します。

    • TOTAL_MAX_NODES: ノードプール全体で自動的にスケーリングするノードの最大数。

      キューに格納されたプロビジョニングで Flex Start を使用する場合は、--enable-queued-provisioning フラグを含めます。

      Flex Start の使用方法については、キューに格納されたプロビジョニングで Flex Start を使用して大規模なワークロードを実行するをご覧ください。

    スポット

    スポット プロビジョニングの場合は、次のコマンドを実行します。

      gcloud container node-pools create NODE_POOL_NAME \
          --region COMPUTE_REGION --cluster CLUSTER_NAME \
          --node-locations COMPUTE_ZONE \
          --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
          --machine-type MACHINE_TYPE \
          --num-nodes=NUM_NODES \
          --spot
    

    次のように置き換えます。

    • NODE_POOL_NAME: ノードプールの名前。
    • COMPUTE_REGION: 新しいクラスタのリージョン。
    • CLUSTER_NAME: 新しいクラスタの名前。
    • COMPUTE_ZONE: ノードプールのゾーン。
    • GPU_TYPE: GPU アクセラレータのタイプ。

      • A4 VM: nvidia-b200 と入力します。
      • A3 Ultra VM: nvidia-h200-141gb と入力します。
    • AMOUNT: ノードプール内のノードに接続する GPU の数。たとえば、a4-highgpu-8g VM と a3-ultragpu-8g VM はどちらも、GPU の数は 8 です。

    • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。defaultlatestdisabled のいずれかの値になります。

    • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。たとえば、A4 VM には a4-highgpu-8g を使用し、A3 Ultra VM には a3-ultragpu-8g を使用します。

    • NUM_NODES: ノードプールのノード数。

      Spot VM を使用してクラスタを作成する方法については、Spot VM を使用して低コストでフォールト トレラントなワークロードを実行するをご覧ください。

  3. 次のセクションで kubectl コマンドを実行できるように、クラスタに接続します。

      gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

    次のように置き換えます。

GPUDirect RDMA を使用してクラスタを作成する

分散 AI ワークロードの場合、複数の GPU ノードがリンクされて 1 台のコンピュータとして動作することがよくあります。A4 VM と A3 Ultra VM には、NVIDIA ConnectX-7(CX7)NIC を基盤とする Titanium ML ネットワーク アダプタが付属しています。A4 VM と A3 Ultra VM はどちらも、RDMA over Converged Ethernet(RoCE)を使用して、ノード間の GPU 間トラフィックで 3.2 Tbps の非ブロッキングを実現します。RoCE は、AI ワークロードに高性能なクラウド エクスペリエンスを提供することで、複数の GPU 間でのスケーリングとコラボレーションを可能にします。

Google Cloud CLI と GPUDirect TCPX(A3 High VM)または TCPXO(A3 Mega VM)を使用して GKE クラスタを作成する方法については、Autopilot モードのクラスタで GPU ネットワーク帯域幅を最大にするまたは Standard モードのクラスタで GPU ネットワーク帯域幅を最大にするをご覧ください。

GPUDirect RDMA を使用して Autopilot モードまたは Standard モードで GKE クラスタを作成するには、次の手順を行います。これらの手順については、次のセクションで説明します。

  1. VPC とサブネットを作成する
  2. マルチネットワーキングを使用して GKE クラスタを作成する
  3. GKE ネットワーク オブジェクトを作成する
  4. RDMA バイナリをインストールして NCCL を構成する
  5. NCCL テストをデプロイして実行する
  6. GPUDirect-RDMA 用に Pod マニフェストを構成する

VPC とサブネットを作成する

A4 VM と A3 Ultra VM の両方に次の構成があります。

  • NVLink で接続された仮想マシンあたり 8 個の NVIDIA B200(A4)または H200(A3 Ultra)GPU
  • 2 つの Intel Emerald Rapids CPU
  • GPU 間ネットワーキング用の 8 個の 400 Gbps CX-7 NIC
  • 外部サービス用の 2 つの 200 Gbps Google Titanium NIC

分散トレーニングなどの AI ワークロードと ML ワークロードでは、ジョブの完了時間を短縮してパフォーマンスを最適化するために、強力なアクセラレーションが必要となります。高性能、高スループット、低レイテンシを必要とするワークロードの場合、GPUDirect RDMA は GPU との間のペイロードの転送に必要なネットワーク ホップを削減し、利用可能なネットワーク帯域幅をより効率的に使用します。GPUDirect RDMA は、GPUDirect を使用しない GPU と比較して、スループットを大幅に向上させるように設計されています。

CPU に関連付けられている Google Titanium NIC の 1 つが、GKE のデフォルト ネットワークを使用します。デフォルト ネットワークに十分な IP アドレス範囲がある場合は、この NIC 用に新しい VPC を作成する必要はありません。

これらのコマンドを使用すると、2 番目の CPU Titanium NIC(gVNIC)用に 1 つの VPC を作成し、8 つの CX-7 RDMA NIC 用に別の VPC を作成できます。

  1. デプロイに合わせて環境変数を設定します。

    export REGION="COMPUTE_REGION"
    export ZONE="COMPUTE_ZONE"
    export PROJECT="PROJECT_ID"
    export GVNIC_NETWORK_PREFIX="GVNIC_NETWORK_PREFIX"
    export RDMA_NETWORK_PREFIX="RDMA_NETWORK_PREFIX"
    

    次の変数を置き換えます。

    • COMPUTE_REGION: クラスタのリージョン。
    • COMPUTE_ZONE: ノードプールのゾーン。
    • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
    • GVNIC_NETWORK_PREFIX: A4 VM の場合は a4high-gvnic、A3 Ultra VM の場合は a3ultra-gvnic
    • RDMA_NETWORK_PREFIX: A4 VM の場合は a4high-rdma、A3 Ultra VM の場合は a3ultra-rdma
  2. 2 つの VPC ネットワークを作成します。

    # Create a VPC for the additional Google Titanium CPU NIC
    gcloud compute --project=${PROJECT} \
      networks create \
      ${GVNIC_NETWORK_PREFIX}-net \
      --subnet-mode=custom
    
    gcloud compute --project=${PROJECT} \
      networks subnets create \
      ${GVNIC_NETWORK_PREFIX}-sub \
      --network=${GVNIC_NETWORK_PREFIX}-net \
      --region=${REGION} \
      --range=192.168.0.0/24
    
    gcloud compute --project=${PROJECT} \
      firewall-rules create \
      ${GVNIC_NETWORK_PREFIX}-internal \
      --network=${GVNIC_NETWORK_PREFIX}-net \
      --action=ALLOW \
      --rules=tcp:0-65535,udp:0-65535,icmp \
      --source-ranges=192.168.0.0/16
    
    # Create HPC VPC for the RDMA NICs with 8 subnets.
    gcloud beta compute --project=${PROJECT} \
      networks create ${RDMA_NETWORK_PREFIX}-net \
      --network-profile=${ZONE}-vpc-roce \
      --subnet-mode=custom
    
    # Create subnets for the HPC VPC.
    for N in $(seq 0 7); do
      gcloud compute --project=${PROJECT} \
        networks subnets create \
        ${RDMA_NETWORK_PREFIX}-sub-$N \
        --network=${RDMA_NETWORK_PREFIX}-net \
        --region=${REGION} \
        --range=192.168.$((N+1)).0/24 &  # offset to avoid overlap with gvnics
    done
    

マルチネットワーキングを使用して GKE クラスタを作成する

Autopilot

  1. マルチネットワーキングを使用して GKE Autopilot クラスタを作成します。

    gcloud container clusters create-auto CLUSTER_NAME \
        --enable-multi-networking \
        --cluster-version=CLUSTER_VERSION \
        --region=COMPUTE_REGION
    

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • CLUSTER_VERSION: 新しいクラスタのバージョン。構成をサポートする GKE のバージョンを確認するには、要件セクションをご覧ください。
    • COMPUTE_REGION: コンピューティング リージョンの名前。
  2. 次のセクションで kubectl コマンドを実行できるように、クラスタに接続します。

    gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • COMPUTE_REGION: コンピューティング リージョンの名前。

    詳細については、kubectl をインストールしてクラスタ アクセスを構成するをご覧ください。

Standard

マルチネットワーキングを使用して GKE Standard クラスタと GPU ノードプールを作成します。

  1. クラスタを作成します。

    gcloud container clusters create CLUSTER_NAME \
      --region=COMPUTE_REGION \
      --cluster-version=CLUSTER_VERSION \
      --enable-dataplane-v2 --enable-ip-alias --enable-multi-networking [\
      --services-ipv4-cidr=SERVICE_CIDR \
      --cluster-ipv4-cidr=POD_CIDR]
    

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • CLUSTER_VERSION: 新しいクラスタのバージョン。構成をサポートする GKE のバージョンを確認するには、要件セクションをご覧ください。
    • COMPUTE_REGION: コンピューティング リージョンの名前。

    必要に応じて、サービスと Pod のセカンダリ CIDR 範囲を明示的に指定できます。これらのオプション フラグを使用する場合は、次の変数を置き換えます。

    • SERVICE_CIDR: Service のセカンダリ CIDR の範囲。
    • POD_CIDR: Pod のセカンダリ CIDR の範囲。

    これらのフラグを使用する場合は、CIDR の範囲が追加のノード ネットワークのサブネット範囲と重複してないことを確認する必要があります。たとえば、SERVICE_CIDR=10.65.0.0/19 値と POD_CIDR=10.64.0.0/19 値の範囲が重複しないようにします。詳細については、Pod の IPv4 アドレス範囲を追加するをご覧ください。

  2. ノードプールを作成します。実行する必要があるコマンドは、デプロイで使用する使用オプションによって異なります。使用オプションのプロビジョニング モデルに対応するタブを選択します。

    予約で制限

    予約バインド プロビジョニングの場合は、次のコマンドを実行します。

    gcloud container node-pools create NODE_POOL_NAME \
      --region COMPUTE_REGION --cluster CLUSTER_NAME \
      --node-locations COMPUTE_ZONE \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
      --machine-type MACHINE_TYPE \
      --num-nodes=NUM_NODES \
      --reservation-affinity=specific \
      --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME  \
      --additional-node-network network=${GVNIC_NETWORK_PREFIX}-net,subnetwork=${GVNIC_NETWORK_PREFIX}-sub \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-0 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-1 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-2 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-3 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-4 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-5 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-6 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-7
    

    次のように置き換えます。

    • NODE_POOL_NAME: ノードプールの名前。
    • COMPUTE_REGION: 新しいクラスタのリージョン。
    • CLUSTER_NAME: 新しいクラスタの名前。
    • COMPUTE_ZONE: ノードプールのゾーン。
    • GPU_TYPE: GPU アクセラレータのタイプ。

      • A4 VM: nvidia-b200 と入力します。
      • A3 Ultra VM: nvidia-h200-141gb と入力します。
    • AMOUNT: ノードプール内のノードに接続する GPU の数。たとえば、a4-highgpu-8g VM と a3-ultragpu-8g VM はどちらも、GPU の数は 8 です。

    • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。defaultlatestdisabled のいずれかの値になります。

    • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。たとえば、A4 VM には a4-highgpu-8g を使用し、A3 Ultra VM には a3-ultragpu-8g を使用します。

    • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。たとえば、A4 VM には a4-highgpu-8g を使用し、A3 Ultra VM には a3-ultragpu-8g を使用します。

    • NUM_NODES: ノードプールのノード数。Flex Start の場合、この値は 0 に設定する必要があります。

    • RESERVATION_NAME: 予約の名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。

    • BLOCK_NAME: 予約内の特定のブロックの名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。

    Flex Start

    Flex Start プロビジョニングの場合は、次のコマンドを実行します。

    gcloud container node-pools create NODE_POOL_NAME \
      --region COMPUTE_REGION --cluster CLUSTER_NAME \
      --node-locations COMPUTE_ZONE \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=DRIVER_VERSION \
      --machine-type MACHINE_TYPE \
      --num-nodes=NUM_NODES \
      --flex-start --num-nodes=0 --enable-autoscaling \
      --total-max-nodes TOTAL_MAX_NODES \
      --no-enable-autorepair --location-policy=ANY \
      --reservation-affinity=none \
      [--enable-queued-provisioning \]
      --additional-node-network network=${GVNIC_NETWORK_PREFIX}-net,subnetwork=${GVNIC_NETWORK_PREFIX}-sub \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-0 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-1 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-2 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-3 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-4 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-5 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-6 \
      --additional-node-network network=${RDMA_NETWORK_PREFIX}-net,subnetwork=${RDMA_NETWORK_PREFIX}-sub-7
    

    次のように置き換えます。

    • NODE_POOL_NAME: ノードプールの名前。
    • COMPUTE_REGION: 新しいクラスタのリージョン。
    • CLUSTER_NAME: 新しいクラスタの名前。
    • COMPUTE_ZONE: ノードプールのゾーン。
    • GPU_TYPE: GPU アクセラレータのタイプ。

      • A4 VM: nvidia-b200 と入力します。
      • A3 Ultra VM: nvidia-h200-141gb と入力します。
    • AMOUNT: ノードプール内のノードに接続する GPU の数。たとえば、a4-highgpu-8g VM と a3-ultragpu-8g VM はどちらも、GPU の数は 8 です。

    • DRIVER_VERSION: インストールする NVIDIA ドライバのバージョン。defaultlatestdisabled のいずれかの値になります。

    • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。たとえば、A4 VM には a4-highgpu-8g を使用し、A3 Ultra VM には a3-ultragpu-8g を使用します。

    • MACHINE_TYPE: ノードの Compute Engine マシンタイプ。たとえば、A4 VM には a4-highgpu-8g を使用し、A3 Ultra VM には a3-ultragpu-8g を使用します。

    • NUM_NODES: ノードプールのノード数。Flex Start の場合、この値は 0 に設定する必要があります。

    • TOTAL_MAX_NODES: ノードプール全体における、ノードが自動スケーリングする最大数。

    キューに格納されたプロビジョニングで Flex Start を使用する場合は、--enable-queued-provisioning フラグを含めます。

    Flex Start の使用方法については、キューに格納されたプロビジョニングで Flex Start を使用して大規模なワークロードを実行するをご覧ください。

  3. 次のセクションで kubectl コマンドを実行できるように、クラスタに接続します。

    gcloud container clusters get-credentials CLUSTER_NAME --location=COMPUTE_REGION
    

    次のように置き換えます。

    • CLUSTER_NAME: クラスタの名前。
    • COMPUTE_REGION: コンピューティング リージョンの名前。

    詳細については、kubectl をインストールしてクラスタ アクセスを構成するをご覧ください。

GKE ネットワーク オブジェクトを作成する

前のセクションで作成した VPC ネットワークは、GKE ネットワーク パラメータ セットを使用して構成する必要があります。具体的には、2 番目の CPU Titanium NIC(gVNIC)を NetDevice モードで構成し、8 つの CX-7 RDMA NIC をそれぞれ RDMA モードで構成する必要があります。

このコマンドでは、次の名前を使用します。

  • CPU Titanium NIC(gVNIC)VPC の名前は ${GVNIC_NETWORK_PREFIX}-net で、サブネットの名前は ${GVNIC_NETWORK_PREFIX}-sub です。
  • CX-7 RDMA NIC の VPC の名前は ${RDMA_NETWORK_PREFIX}-net で、サブネットの名前は ${RDMA_NETWORK_PREFIX}-sub-[0…7] です。

次のコマンドを実行して、GKE ネットワーク オブジェクトを作成します。

kubectl apply -f - <<EOF
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: gvnic-1
spec:
  vpc: ${GVNIC_NETWORK_PREFIX}-net
  vpcSubnet: ${GVNIC_NETWORK_PREFIX}-sub
  deviceMode: NetDevice
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: gvnic-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: gvnic-1
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-0
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-0
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-0
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-0
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-1
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-1
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-1
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-1
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-2
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-2
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-2
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-2
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-3
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-3
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-3
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-3
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-4
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-4
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-4
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-4
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-5
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-5
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-5
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-5
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-6
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-6
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-6
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-6
---
apiVersion: networking.gke.io/v1
kind: GKENetworkParamSet
metadata:
  name: rdma-7
spec:
  vpc: ${RDMA_NETWORK_PREFIX}-net
  vpcSubnet: ${RDMA_NETWORK_PREFIX}-sub-7
  deviceMode: RDMA
---
apiVersion: networking.gke.io/v1
kind: Network
metadata:
  name: rdma-7
spec:
  type: "Device"
  parametersRef:
    group: networking.gke.io
    kind: GKENetworkParamSet
    name: rdma-7
EOF

RDMA バイナリをインストールして NCCL を構成する

次の DaemonSet を適用して、各ノードに RDMA バイナリと NCCL ライブラリをインストールします。基盤となる各 VM に、RDMA バイナリは /home/kubernetes/bin/gib ディレクトリにインストールされ、NCCL ライブラリは /home/kubernetes/bin/nvidia/lib64 ディレクトリにインストールされます。

Autopilot

GKE Autopilot モードの場合は、次のコマンドを実行します。

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer-autopilot.yaml

Standard

GKE Standard モードの場合は、次のコマンドを実行します。

kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/gpudirect-rdma/nccl-rdma-installer.yaml

NCCL テストを実行する

プロビジョニングされたクラスタの機能を検証するには、NCCL テストを実行します。手順については、NCCL テストをデプロイして実行するをご覧ください。

GPUDirect RDMA 用に Pod マニフェストを構成する

GPUDirect RDMA を使用してワークロードを実行するには、次の手順で Pod マニフェストを構成します。

  1. Pod メタデータに次のアノテーションを追加します。

    Autopilot

    GKE Autopilot モードでは、次のアノテーションを使用します。

    metadata:
    annotations:
      networking.gke.io/default-interface: 'eth0'
      networking.gke.io/interfaces: |
        [
          {"interfaceName":"eth0","network":"default"},
          {"interfaceName":"eth1","network":"gvnic-1"},
          {"interfaceName":"eth2","network":"rdma-0"},
          {"interfaceName":"eth3","network":"rdma-1"},
          {"interfaceName":"eth4","network":"rdma-2"},
          {"interfaceName":"eth5","network":"rdma-3"},
          {"interfaceName":"eth6","network":"rdma-4"},
          {"interfaceName":"eth7","network":"rdma-5"},
          {"interfaceName":"eth8","network":"rdma-6"},
          {"interfaceName":"eth9","network":"rdma-7"}
        ]
    

    Standard

    GKE Standard モードの次のアノテーションには gvnic-1 仕様が含まれていませんが、ワークロードで必要な場合は追加できます。

    GKE Standard モードでは、次のアノテーションを使用します。

    metadata:
    annotations:
      networking.gke.io/default-interface: 'eth0'
      networking.gke.io/interfaces: |
        [
          {"interfaceName":"eth0","network":"default"},
          {"interfaceName":"eth2","network":"rdma-0"},
          {"interfaceName":"eth3","network":"rdma-1"},
          {"interfaceName":"eth4","network":"rdma-2"},
          {"interfaceName":"eth5","network":"rdma-3"},
          {"interfaceName":"eth6","network":"rdma-4"},
          {"interfaceName":"eth7","network":"rdma-5"},
          {"interfaceName":"eth8","network":"rdma-6"},
          {"interfaceName":"eth9","network":"rdma-7"}
        ]
    
  2. ノードセレクタを使用して、選択した GPU タイプと特定の予約を指定します。

    spec:
      nodeSelector:
        cloud.google.com/gke-accelerator: ACCELERATOR
        cloud.google.com/reservation-name: RESERVATION_NAME
        cloud.google.com/reservation-affinity: "specific"
    

    次のように置き換えます。

    • ACCELERATOR: Compute Engine の容量予約で予約したアクセラレータ。次のいずれかの値を使用する必要があります。
      • nvidia-b200: A4 VM 用 NVIDIA B200(180 GB)
      • nvidia-h200-141gb: A3 Ultra VM 用の NVIDIA H200(141 GB)
    • RESERVATION_NAME: Compute Engine の容量予約の名前。

    共有予約、または予約の特定のブロックとサブブロックを使用するには、予約済みゾーンパスリソースを使用するの該当するセクションをご覧ください。

  3. 次の Volume を Pod 仕様に追加します。

    spec:
      volumes:
        - name: library-dir-host
          hostPath:
            path: /home/kubernetes/bin/nvidia
        - name: gib
          hostPath:
            path: /home/kubernetes/bin/gib
    
  4. GPU をリクエストするコンテナに、次のボリューム マウント、環境変数、リソースを追加します。ワークロード コンテナは、8 個の GPU すべてをリクエストする必要があります。

    Autopilot

    GKE Autopilot モードの場合は、次のリソースを構成します。

    containers:
      - name: my-container
        volumeMounts:
          - name: library-dir-host
            mountPath: /usr/local/nvidia
            readOnly: true
          - name: gib
            mountPath: /usr/local/gib
            readOnly: true
        env:
          - name: LD_LIBRARY_PATH
            value: /usr/local/nvidia/lib64
        resources:
          limits:
            nvidia.com/gpu: 8
    

    Standard

    GKE Standard モードの場合は、次のリソースを構成します。

    containers:
      - name: my-container
        volumeMounts:
          - name: library-dir-host
            mountPath: /usr/local/nvidia
          - name: gib
            mountPath: /usr/local/gib
        env:
          - name: LD_LIBRARY_PATH
            value: /usr/local/nvidia/lib64
        resources:
          limits:
            nvidia.com/gpu: 8
    
  5. ワークロード コンテナから次のシェル スクリプトを使用して、NCCL を構成するために必要なすべての環境変数を設定します。

    source /usr/local/gib/scripts/set_nccl_env.sh
    

次のタブに、完成した Pod マニフェストの例を示します。

Autopilot

GKE Autopilot モードの場合、完成した Pod マニフェストは次のようになります。

apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth1","network":"gvnic-1"},
        {"interfaceName":"eth2","network":"rdma-0"},
        {"interfaceName":"eth3","network":"rdma-1"},
        {"interfaceName":"eth4","network":"rdma-2"},
        {"interfaceName":"eth5","network":"rdma-3"},
        {"interfaceName":"eth6","network":"rdma-4"},
        {"interfaceName":"eth7","network":"rdma-5"},
        {"interfaceName":"eth8","network":"rdma-6"},
        {"interfaceName":"eth9","network":"rdma-7"}
      ]
spec:
  ...
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
          readOnly: true
        - name: gib
          mountPath: /usr/local/gib
          readOnly: true
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 8
          ...

Standard

GKE Standard モードの場合、完成した Pod マニフェストは次のようになります。

apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
  annotations:
    networking.gke.io/default-interface: 'eth0'
    networking.gke.io/interfaces: |
      [
        {"interfaceName":"eth0","network":"default"},
        {"interfaceName":"eth2","network":"rdma-0"},
        {"interfaceName":"eth3","network":"rdma-1"},
        {"interfaceName":"eth4","network":"rdma-2"},
        {"interfaceName":"eth5","network":"rdma-3"},
        {"interfaceName":"eth6","network":"rdma-4"},
        {"interfaceName":"eth7","network":"rdma-5"},
        {"interfaceName":"eth8","network":"rdma-6"},
        {"interfaceName":"eth9","network":"rdma-7"}
      ]
spec:
  ...
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
    - name: gib
      hostPath:
        path: /home/kubernetes/bin/gib
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
        - name: gib
          mountPath: /usr/local/gib
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 8
          ...

GPUDirect RDMA を使用するクラスタのネットワーク パフォーマンスをテストする

プロビジョニングされたクラスタの機能を検証することをおすすめします。これを行うには、Google 環境向けに最適化された NVIDIA Collective Communications Library(NCCL)テストである NCCL/gIB テストを使用します。

次のステップ