建立使用 A4X Max 的自訂 AI 適用 GKE 叢集

本文說明如何建立 AI 最佳化的 Google Kubernetes Engine (GKE) 叢集,使用 A4X Max Compute Engine 執行個體支援 AI 和 ML 工作負載。

A4X Max 和 A4X 系列可透過 NVIDIA 多節點 NVLink (MNNVL) 系統執行大規模 AI/ML 集群,這項機架規模的解決方案可提升 GPU 效能和效力。這些機器提供目標工作負載放置、拓撲感知排程和進階叢集維護控制等功能。詳情請參閱「叢集管理功能」。透過 A4X Max,GKE 還能自動設定網路,簡化叢集設定。

AI 和機器學習工作負載 (例如分散式訓練) 需要強大的加速功能,才能縮短作業完成時間,進而提升效能。GKE 提供單一平台介面,可為貴機構執行各種工作負載,減少管理多個平台的營運負擔。您可以執行高效能分散式預先訓練、模型微調、模型推論、應用程式服務和支援服務等工作負載。對於需要高效能、高處理量和低延遲的工作負載,GPUDirect RDMA 可減少將酬載傳輸至 GPU 和從 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 驅動程式版本,預設為啟用。
    • 預設啟用的「以驅動程式為基礎的連貫記憶體管理」(CDMM)。NVIDIA 建議 Kubernetes 叢集啟用這個模式,解決記憶體過度回報的問題。CDMM 可讓驅動程式管理 GPU 記憶體,而非作業系統 (OS)。這種做法可協助您避免 OS 線上處理 GPU 記憶體,並將 GPU 記憶體公開為 OS 的非統一記憶體存取 (NUMA) 節點。啟用 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 驅動程式版本,請參閱「手動安裝 NVIDIA GPU 驅動程式」一節中的表格。
  • 選擇預留項目相依性

    • 你可以查看預訂資訊,例如預訂名稱或預訂中的特定區塊名稱。如要尋找這些值,請參閱「查看未來預留項目要求」。
    • --reservation-affinity 旗標可採用 specificany 值。不過,對於高效能分散式 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 節點連結在一起,當做單一電腦運作。A4X Max 是以 NVIDIA GB300 NVL72 機架式架構為基礎的百億級平台。A4X Max 運算執行個體採用多層次、階層式網路架構,並以符合軌道 (rail-aligned) 設計為基礎,可針對各種通訊類型最佳化效能。這個機型可為 AI 工作負載提供高效能雲端體驗,讓您在多個 GPU 之間進行擴充及協作。如要進一步瞭解 A4X Max 的網路架構,包括網路頻寬和 NIC 配置,請參閱A4X Max 機型 (裸機)

如要建立使用 GPUDirect RDMA 和 MNNVL 的 A4X Max GKE Standard 叢集,請完成下列各節所述的步驟:

  1. 建立 GKE 叢集
  2. 建立工作負載政策
  3. 使用 A4X Max 建立節點集區
  4. 使用 asapd-lite 設定 MRDMA NIC
  5. 安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式
  6. 為 RDMA 和 IMEX 網域設定工作負載資訊清單

這些操作說明會使用加速器網路設定檔,為 A4X Max 節點自動設定虛擬私有雲網路和子網路。或者,您也可以明確指定虛擬私有雲網路和子網路

建立 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:服務的次要 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 的工作負載政策

建立 HIGH_THROUGHPUT 工作負載政策,並將 accelerator_topology 欄位設為 1x72

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. 建立下列設定檔,以便使用節點集區預先配置巨頁

    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 個節點以下。建議使用 18 個節點,透過 NVLink 網域取得一個子區塊中 1x72 的 GPU 拓撲。
    • 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 Compute Domain CRD 和 DRA 驅動程式

下列步驟會安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式,以啟用 MNNVL。詳情請參閱「NVIDIA DRA Driver for GPUs」。

  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. 在 Pod 規格中新增下列磁碟區:

    spec:
      volumes:
        - name: library-dir-host
          hostPath:
            path: /home/kubernetes/bin/nvidia
    
  3. 將下列磁碟區掛接、環境變數和資源新增至要求 GPU 的容器。工作負載容器必須要求所有四個 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. 建立 ResourceClaimTemplate,透過 DRANET 分配網路資源,並為 Pod 要求 RDMA 裝置:

    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. 在容器映像檔中安裝最新的使用者空間程式庫:

    Debian 12 以上版本/Ubuntu 20.04 以上版本 (.deb 封裝)

    apt update
    apt install curl
    
    # Fetch DOCA OFED userspace libraries
    export DOCA_URL="https://linux.mellanox.com/public/repo/doca/latest/ubuntu22.04/arm64-sbsa/"
    export BASE_URL="https://linux.mellanox.com/public/repo/doca"
    curl "${BASE_URL}/GPG-KEY-Mellanox.pub" | gpg --dearmor -o /etc/apt/trusted.gpg.d/GPG-KEY-Mellanox.pub
    echo "deb [signed-by=/etc/apt/trusted.gpg.d/GPG-KEY-Mellanox.pub] ${DOCA_URL} ./" | tee /etc/apt/sources.list.d/doca.list
    
    apt update
    apt install doca-ofed-userspace
    
    # Upgrade to latest NCCL for best compatibility
    apt install --only-upgrade --allow-change-held-packages 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

測試網路效能

建議您驗證已佈建叢集的功能。如要進行這項操作,請使用 NCCL/gIB 測試,也就是針對 Google 環境最佳化的 NVIDIA Collective Communications Library (NCCL) 測試

詳情請參閱「在採用 A4X Max 的自訂 GKE 叢集上執行 NCCL」。

後續步驟