A4X Max を使用するカスタム AI 最適化 GKE クラスタを作成する

このドキュメントでは、A4X Max Compute Engine インスタンスを使用して AI と ML のワークロードをサポートする、AI 最適化された Google Kubernetes Engine(GKE)クラスタを作成する方法について説明します。

A4X Max シリーズと A4X シリーズでは、NVIDIA Multi-Node NVLink(MNNVL)システム(GPU の電力とパフォーマンスを向上させるラック規模のソリューション)を使用して、大規模な AI/ML クラスタを実行できます。これらのマシンは、ターゲットを絞ったワークロード配置、トポロジーを考慮したスケジューリング、高度なクラスタ メンテナンス制御などの機能を提供します。詳細については、クラスタ管理機能をご覧ください。A4X Max を使用すると、GKE は自動ネットワーキング設定も提供し、クラスタ構成を簡素化します。

分散トレーニングなどの AI ワークロードと ML ワークロードでは、ジョブの完了時間を短縮してパフォーマンスを最適化するために、強力なアクセラレーションが必要となります。GKE は、組織の多様なワークロードを実行するための単一のプラットフォーム サーフェスを提供し、複数のプラットフォームを管理する運用上の負担を軽減します。高パフォーマンスの分散事前トレーニング、モデルのファインチューニング、モデル推論、アプリケーション サービング、サポート サービスなどのワークロードを実行できます。高性能、高スループット、低レイテンシを必要とするワークロードの場合、GPUDirect RDMA は、GPU 間でペイロードを転送するために必要なネットワーク ホップを削減します。このアプローチでは、利用可能なネットワーク帯域幅をより効率的に使用します。詳細については、GPU ネットワーキング スタックをご覧ください。

このドキュメントでは、ワークロードのニーズに基づいてクラスタを構成する際に最大限の柔軟性を確保するために、Google Cloud CLI を使用して GKE クラスタを作成する方法について説明します。gcloud CLI を使用して他のマシンタイプでクラスタを作成するには、以下をご覧ください。

また、Cluster Toolkit を使用して、多くのユースケースのベスト プラクティスを反映したデフォルト設定でクラスタをすばやくデプロイすることもできます。詳細については、デフォルト構成で AI に最適化された GKE クラスタを作成するをご覧ください。

始める前に

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

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

容量を取得する

将来の予約を作成することで、A4X Max コンピューティング インスタンスの容量を取得できます。将来の予約の詳細については、使用オプションを選択するの表の AI Hypercomputer の将来の予約の列をご覧ください。

将来の予約で容量を取得するには、容量を取得する方法の表の AI Hypercomputer の将来の予約の行をご覧ください。

要件

A4X Max コンピューティング インスタンスを使用する AI 最適化 GKE クラスタには、次の要件が適用されます。

  • A4X Max の場合は、次のいずれかのバージョンを使用する必要があります。

    • 1.35 以降の場合は、GKE バージョン 1.35.0-gke.2745000 以降を使用します。
    • 1.34 の場合は、GKE バージョン 1.34.3-gke.1318000 以降を使用します。

    これらのバージョンにより、A4X Max で次のものが使用されるようになります。

    • R580.95.05(A4X Max の最小 GPU ドライバ バージョン)。デフォルトで有効になっています。
    • デフォルトで有効になっている Coherent Driver-based Memory Management(CDMM)。NVIDIA は、メモリの過剰なレポートを解決するために、Kubernetes クラスタでこのモードを有効にすることを推奨しています。CDMM を使用すると、オペレーティング システム(OS)ではなくドライバを介して GPU メモリを管理できます。このアプローチにより、GPU メモリの OS オンライン化を回避し、GPU メモリを不均一メモリアクセス(NUMA)ノードとして OS に公開できます。CDMM が有効になっている場合、マルチインスタンス GPU はサポートされていません。CDMM について詳しくは、ハードウェアとソフトウェアのサポートをご覧ください。
    • GPUDirect RDMA と MNNVL。A4X Max ノードプールで A4X Max のネットワーキング機能を使用できるようにするために有効にすることをおすすめします。
  • GKE ノードで Container-Optimized OS ノードイメージが使用されている必要があります。Ubuntu と Windows のノードイメージはサポートされません。

  • GKE ワークロードでは、使用可能なすべての GPU を使用し、Pod では単一の GKE ノードで使用可能なすべてのセカンダリ NIC を使用する必要があります。複数の Pod が単一の GKE ノードで RDMA を共有することはできません。

  • A4X Max を使用してクラスタを作成するには、予約バインド プロビジョニング モデルを使用する必要があります。他のプロビジョニング モデルはサポートされていません。

  • 次の手順では、DRANET を使用して、A4X Max で AI 最適化 GKE クラスタを構成します。a4x-maxgpu-4g-metal マシンタイプではマルチ ネットワーキングはサポートされていません。

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

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

  • クラスタのロケーションを選択する:
    • 選択したマシンタイプが利用可能なロケーションを使用していることを確認します。詳細については、アクセラレータの可用性をご覧ください。
    • 本番環境のワークロードに推奨されるリージョン クラスタにノードプールを作成する場合は、--node-locations フラグを使用して GKE ノードのゾーンを指定できます。
  • ドライバのバージョンを選択する:
    • ドライバのバージョンは、次のいずれかの値になります。
      • default: GKE ノード バージョンのデフォルト ドライバ バージョンをインストールします。デフォルトのドライバ バージョンの要件について詳しくは、要件セクションをご覧ください。
      • latest: GKE バージョンに対応する最新のドライバ バージョンをインストールします。このオプションは、Container-Optimized OS を使用するノードでのみ使用できます。
      • disabled: ドライバの自動インストールをスキップします。ノードプールの作成後に、ドライバを手動でインストールする必要があります。
    • GKE ノード バージョンのデフォルトの GPU ドライバ バージョンと最新の 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: 予約内の特定のブロックの名前。

      また、コンピューティング インスタンスが BLOCK_NAME 内の単一のサブブロックに配置されるように、サブブロックをターゲットとする予約を使用することをおすすめします。パスの末尾に以下を追加します。

      /reservationSubBlocks/SUB_BLOCK_NAME
      

      SUB_BLOCK_NAME は、サブブロックの名前に置き換えます。

A4X Max と GPUDirect RDMA を使用する AI 最適化 GKE クラスタを作成する

分散 AI ワークロードの場合、複数の GPU ノードがリンクされて 1 台のコンピュータとして動作することがよくあります。A4X Max は、NVIDIA GB300 NVL72 ラックスケール アーキテクチャに基づくエクサスケール プラットフォームです。A4X Max コンピューティング インスタンスは、レール整列型の設計による階層型ネットワーキング アーキテクチャを使用して、さまざまな通信タイプのパフォーマンスを最適化します。このマシンタイプは、AI ワークロードに高性能なクラウド エクスペリエンスを提供することで、複数の GPU 間でのスケーリングとコラボレーションを可能にします。ネットワーク帯域幅や NIC の配置など、A4X Max のネットワーク アーキテクチャの詳細については、A4X Max マシンタイプ(ベアメタル)をご覧ください。

GPUDirect RDMA と MNNVL を使用する A4X Max を使用して GKE Standard クラスタを作成するには、次のセクションで説明する手順を完了します。

  1. GKE クラスタを作成する
  2. ワークロード ポリシーを作成する
  3. A4X Max を使用してノードプールを作成する
  4. asapd-lite を使用して MRDMA NIC を構成する
  5. NVIDIA コンピューティング ドメイン CRD と DRA ドライバをインストールする
  6. RDMA と IMEX ドメイン用にワークロード マニフェストを構成する

この手順では、アクセラレータ ネットワーク プロファイルを使用して、A4X Max ノードの VPC ネットワークとサブネットを自動的に構成します。または、VPC ネットワークとサブネットを明示的に指定することもできます。

GKE クラスタを作成する

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

    gcloud container clusters create CLUSTER_NAME \
      --enable-dataplane-v2 \
      --enable-ip-alias \
      --location=COMPUTE_REGION \
      --cluster-version=CLUSTER_VERSION \
      --no-enable-shielded-nodes [\
      --services-ipv4-cidr=SERVICE_CIDR \
      --cluster-ipv4-cidr=POD_CIDR \
      --addons=GcpFilestoreCsiDriver=ENABLED]
    

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

    • CLUSTER_NAME: クラスタの名前。
    • CLUSTER_VERSION: 新しいクラスタのバージョン。GKE のどのバージョンが構成をサポートしているかについては、このドキュメントの要件をご覧ください。
    • COMPUTE_REGION: コンピューティング リージョンの名前。
    • 必要に応じて、サービスと Pod のセカンダリ CIDR 範囲を明示的に指定できます。これらのオプション フラグを使用する場合は、次の変数を置き換えます。

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

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

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

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

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

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

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

ワークロード ポリシーの作成

パーティションを作成するには、ワークロード ポリシーが必要です。詳細については、MIG のワークロード ポリシーをご覧ください。

accelerator_topology フィールドが 1x72 に設定された HIGH_THROUGHPUT ワークロード ポリシーを作成します。

gcloud beta compute resource-policies create workload-policy WORKLOAD_POLICY_NAME \
    --type HIGH_THROUGHPUT \
    --accelerator-topology 1x72 \
    --project PROJECT \
    --region COMPUTE_REGION

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

  • WORKLOAD_POLICY_NAME: ワークロード ポリシーの名前。
  • PROJECT: プロジェクトの名前。
  • COMPUTE_REGION: コンピューティング リージョンの名前。

A4X Max を使用してノードプールを作成する

  1. 次の構成ファイルを作成して、ノードプールで hugepage を事前割り当てします。

    cat > node_custom.yaml <<EOF
    linuxConfig:
      hugepageConfig:
        hugepage_size2m: 4096
    EOF
    
    export NODE_CUSTOM=node_custom.yaml
    
  2. A4X Max ノードプールを作成します。

    gcloud container node-pools create NODE_POOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=COMPUTE_REGION \
        --node-locations=COMPUTE_ZONE \
        --num-nodes=NODE_COUNT \
        --placement-policy=WORKLOAD_POLICY_NAME \
        --machine-type=a4x-maxgpu-4g-metal \
        --accelerator=type=nvidia-gb300,count=4,gpu-driver-version=latest \
        --system-config-from-file=${NODE_CUSTOM} \
        --accelerator-network-profile=auto \
        --node-labels=cloud.google.com/gke-networking-dra-driver=true,cloud.google.com/gke-dpv2-unified-cni=cni-migration \
        --reservation-affinity=specific \
        --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME/reservationSubBlocks/SUB_BLOCK_NAME
    

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

    • NODE_POOL_NAME: ノードプールの名前。
    • CLUSTER_NAME: クラスタの名前。
    • COMPUTE_REGION: クラスタのコンピューティング リージョン。
    • COMPUTE_ZONE: ノードプールのゾーン。
    • NODE_COUNT: ノードプールのノード数。18 個以下のノードにする必要があります。NVLink ドメインを使用して 1 つのサブブロックで 1x72 の GPU トポロジを取得するには、18 個のノードを使用することをおすすめします。
    • WORKLOAD_POLICY_NAME: 以前に作成したワークロード ポリシーの名前。
    • RESERVATION_NAME: 予約の名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。
    • BLOCK_NAME: 予約内の特定のブロックの名前。この値を確認するには、将来の予約リクエストを表示するをご覧ください。

    このコマンドは、auto アクセラレータ ネットワーク プロファイルを使用して、単一ゾーン内のすべての A4X Max ノードを接続するネットワークを自動的に作成します。--accelerator-network-profile=auto フラグを使用してノードプールを作成すると、GKE はノードに gke.networks.io/accelerator-network-profile: auto ラベルを自動的に追加します。これらのノードでワークロードをスケジュールするには、ワークロードの nodeSelector フィールドにこのラベルを含める必要があります。

asapd-lite を使用して MRDMA NIC を構成する

asapd-lite DaemonSet は MRDMA NIC を構成します。asapd-lite DaemonSet が異常な場合は、RDMA 接続がない可能性があります。

  1. DaemonSet をインストールします。

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/asapd-lite-installer/asapd-lite-installer-a4x-max-bm-cos.yaml
    
  2. asapd-lite DaemonSet のレプリカを検証します。

    kubectl get daemonset -n kube-system asapd-lite
    

    出力は次のようになります。

    NAME         DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    asapd-lite   18        18        18      18           18          <none>          5m
    

    READY レプリカの数は、ノードプールで作成され、正常な状態のノードの数と一致している必要があります。

NVIDIA コンピューティング ドメイン CRD と DRA ドライバをインストールする

次の手順では、NVIDIA Compute Domain CRD と DRA ドライバをインストールして、MNNVL を使用できるようにします。詳細については、GPU 用の NVIDIA DRA ドライバをご覧ください。

  1. 開発環境に Helm がインストールされていることを確認します。Helm は Cloud Shell に事前にインストールされています。

    特定の Helm バージョンの要件はありませんが、次のコマンドを使用すると、Helm がインストールされていることを確認できます。

    helm version
    

    出力が Command helm not found のようになる場合は、Helm CLI をインストールできます。

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 \
      && chmod 700 get_helm.sh \
      && ./get_helm.sh
    
  2. NVIDIA Helm リポジトリを追加します。

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
      && helm repo update
    
  3. DRA ドライバの ResourceQuota オブジェクトを作成します。

    export POD_QUOTA=POD_QUOTA
    
    kubectl create ns nvidia-dra-driver-gpu
    
    kubectl apply -n nvidia-dra-driver-gpu -f - << EOF
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: nvidia-dra-driver-gpu-quota
    spec:
      hard:
        pods: ${POD_QUOTA}
      scopeSelector:
        matchExpressions:
        - operator: In
          scopeName: PriorityClass
          values:
            - system-node-critical
            - system-cluster-critical
    EOF
    

    POD_QUOTA は、クラスタ内の A4X Max ノード数の 2 倍に 1 を加えた数以上に置き換えます。たとえば、クラスタに 18 個の A4X Max ノードがある場合は、変数を 37 以上に設定する必要があります。

  4. ComputeDomain CRD と DRA ドライバをインストールします。

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --set controller.args.v=4 --set kubeletPlugin.args.v=4 \
        --version="25.8.0" \
        --create-namespace \
        --namespace nvidia-dra-driver-gpu \
        -f <(cat <<EOF
    nvidiaDriverRoot: /home/kubernetes/bin/nvidia
    resources:
      gpus:
        enabled: false
    
    controller:
      affinity:
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: "nvidia.com/gpu"
                  operator: "DoesNotExist"
    
    kubeletPlugin:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
              - matchExpressions:
                  - key: cloud.google.com/gke-accelerator
                    operator: In
                    values:
                      - nvidia-gb300
                  - key: kubernetes.io/arch
                    operator: In
                    values:
                      - arm64
    
      tolerations:
        - key: nvidia.com/gpu
          operator: Equal
          value: present
          effect: NoSchedule
        - key: kubernetes.io/arch
          operator: Equal
          value: arm64
          effect: NoSchedule
    EOF
    )
    

RDMA と IMEX ドメイン用にワークロード マニフェストを構成する

  1. Arm ノードでワークロードをスケジュールするノード アフィニティ ルールを追加します。

    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            -   matchExpressions:
              -   key: kubernetes.io/arch
                operator: In
                values:
                -   arm64
    
  2. 次の Volume を Pod 仕様に追加します。

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

    containers:
      - name: my-container
        volumeMounts:
          - name: library-dir-host
            mountPath: /usr/local/nvidia
    
        env:
          - name: LD_LIBRARY_PATH
            value: /usr/local/nvidia/lib64
        resources:
          limits:
            nvidia.com/gpu: 4
    
  4. ワークロードの ComputeDomain リソースを作成します。

    apiVersion: resource.nvidia.com/v1beta1
    kind: ComputeDomain
    metadata:
      name: a4x-max-compute-domain
    spec:
      numNodes: NUM_NODES
      channel:
        resourceClaimTemplate:
          name: a4x-max-compute-domain-channel
    

    NUM_NODES は、ワークロードに必要なノードの数に置き換えます。

  5. DRANET を使用してネットワーク リソースを割り当て、Pod の RDMA デバイスをリクエストする ResourceClaimTemplate を作成します。

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: all-mrdma
    spec:
      spec:
        devices:
          requests:
          - name: req-mrdma
            exactly:
              deviceClassName: mrdma.google.com
              allocationMode: ExactCount
              count: 8
    
  6. Pod が使用する ResourceClaimTemplate を指定します。

    spec:
      ...
      volumes:
        ...
      containers:
        - name: my-container
          ...
          resources:
            limits:
              nvidia.com/gpu: 4
      claims:
              - name: compute-domain-channel
              - name: rdma
            ...
    resourceClaims:
      - name: compute-domain-channel
        resourceClaimTemplateName: a4x-max-compute-domain-channel
      - name: rdma
        resourceClaimTemplateName: all-mrdma
    
  7. ユーザー コンテナ イメージに userspace ライブラリと libnccl パッケージがインストールされていることを確認します。

    apt update -y
    apt install -y curl
    export DOCA_URL="https://linux.mellanox.com/public/repo/doca/3.1.0/ubuntu22.04/arm64-sbsa/"
    BASE_URL=$([ "${DOCA_PREPUBLISH:-false}" = "true" ] && echo https://doca-repo-prod.nvidia.com/public/repo/doca || echo https://linux.mellanox.com/public/repo/doca)
    DOCA_SUFFIX=${DOCA_URL#*public/repo/doca/}; DOCA_URL="$BASE_URL/$DOCA_SUFFIX"
    curl $BASE_URL/GPG-KEY-Mellanox.pub | gpg --dearmor > /etc/apt/trusted.gpg.d/GPG-KEY-Mellanox.pub
    echo "deb [signed-by=/etc/apt/trusted.gpg.d/GPG-KEY-Mellanox.pub] $DOCA_URL ./" > /etc/apt/sources.list.d/doca.list
    apt update
    apt -y install doca-ofed-userspace
    # The installed libnccl2 is 2.27.7, to upgrade to 2.28.9 as we recommend
    apt install --only-upgrade --allow-change-held-packages -y libnccl2 libnccl-dev
    

完成した Pod 仕様は次のようになります。

apiVersion: resource.nvidia.com/v1beta1
kind: ComputeDomain
metadata:
  name: a4x-max-compute-domain
spec:
  numNodes:  NUM_NODES
  channel:
    resourceClaimTemplate:
      name: a4x-max-compute-domain-channel
---
apiVersion: apps/v1
kind: Pod
metadata:
  name: my-pod
  labels:
    k8s-app: my-pod
spec:
  ...
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/arch
            operator: In
            values:
            - arm64
  volumes:
    - name: library-dir-host
      hostPath:
        path: /home/kubernetes/bin/nvidia
  hostNetwork: true
  containers:
    - name: my-container
      volumeMounts:
        - name: library-dir-host
          mountPath: /usr/local/nvidia
      env:
        - name: LD_LIBRARY_PATH
          value: /usr/local/nvidia/lib64
      resources:
        limits:
          nvidia.com/gpu: 4
        claims:
          - name: compute-domain-channel
          - name: rdma
        ...
  resourceClaims:
    - name: compute-domain-channel
      resourceClaimTemplateName: a4x-max-compute-domain-channel
    - name: rdma
      resourceClaimTemplateName: all-mrdma

ネットワーク パフォーマンスをテストする

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

詳細については、A4X Max を使用するカスタム GKE クラスタで NCCL を実行するをご覧ください。

次のステップ