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

本頁面說明如何建立 AI 最佳化的 Google Kubernetes Engine (GKE) 叢集,使用 A4X 虛擬機器 (VM) 支援 AI 和 ML 工作負載。如要進一步瞭解 A4X,請參閱 A4X 系列

A4X 機器系列專為執行大規模 AI/機器學習叢集而設計,提供目標工作負載放置、進階叢集維護控制項和拓撲感知排程等功能。詳情請參閱叢集管理總覽

GKE 提供單一平台介面,可為貴機構執行各種工作負載,減少管理多個平台的營運負擔。您可以執行高效能分散式預先訓練、模型微調、模型推論、應用程式服務和支援服務等工作負載。

本頁面說明如何使用 Google Cloud CLI 建立 GKE 叢集,根據工作負載需求彈性設定叢集。或者,您也可以選擇使用 Cluster Toolkit,以預設設定快速部署叢集,這些設定反映了許多應用情境的最佳做法。

使用 GPUDirect RDMA 的叢集設定選項

如要使用 Google Cloud CLI 建立叢集,請選擇下列其中一個叢集設定選項:

  • 如果您打算執行分散式 AI 工作負載:請按照本頁的操作說明,使用 GPUDirect RDMA 建立 GKE 叢集。
  • 如果您不打算執行分散式 AI 工作負載:請建立 GKE 叢集,但不要使用 GPUDirect RDMA。詳情請參閱「建立不含 GPUDirect RDMA 的叢集」。

事前準備

開始之前,請確認您已完成下列工作:

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。

必要的角色

如要取得建立及管理 GKE 叢集所需的權限,請要求管理員在專案中授予您下列 IAM 角色:

如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。

您或許也能透過自訂角色或其他預先定義的角色,取得必要權限。

取得容量

您可以建立未來預留項目,取得 A4X VM 的容量。如要進一步瞭解未來預留項目,請參閱「選擇用量方案」表格中的「AI Hypercomputer 未來預留項目」欄。

如要透過未來預留項目取得容量,請參閱「如何取得容量」表格中的「AI Hypercomputer 中的未來預留項目」列。

需求條件

使用 A4X VM 的 AI 最佳化 GKE 叢集必須符合下列條件:

  • 如果是 A4X,請務必使用 GKE 1.33.4-gke.1036000 以上版本 (適用於 1.33 以上版本)。如果是 1.32,請使用 GKE 1.32.8-gke.1108000 以上版本。這些版本可確保 A4X 使用下列項目:

    • R580,這是 A4X 的最低 GPU 驅動程式版本。
    • 預設啟用的「以驅動程式為基礎的連貫記憶體管理」(CDMM)。NVIDIA 建議 Kubernetes 叢集啟用這個模式,以解決記憶體過度回報的問題。CDMM 可讓驅動程式管理 GPU 記憶體,而非作業系統 (OS)。這種做法可協助您避免 OS 線上化 GPU 記憶體,並將 GPU 記憶體公開為 OS 的非統一記憶體存取 (NUMA) 節點。啟用 CDMM 時,系統不支援多執行個體 GPU。如要進一步瞭解 CDMM,請參閱「硬體和軟體支援」。
    • 建議啟用 GPUDirect RDMA,讓 A4X 節點集區使用 A4X 的網路功能。
  • GKE 節點必須使用 Container-Optimized OS 節點映像檔。系統不支援 Ubuntu 和 Windows 節點映像檔。

  • GKE 工作負載必須使用所有可用的 GPU,且 Pod 必須使用單一 GKE 節點上的所有可用次要 NIC。多個 Pod 無法在單一 GKE 節點上共用 RDMA。

  • 這項設定會執行 NCCL 測試。如要執行這項 NCCL 測試,您必須至少有 2 個 VM 配額 (使用 a4x-highgpu-4ga4x-highgpu-4g-nolssd 時,每個 VM 配備 4 個 GPU)。

  • 您必須使用取決於預留項目的佈建模式,才能建立搭載 A4X 的叢集。系統不支援其他佈建模型。

  • GPUDirect RDMA 與 NCCL Fast Socket 或 GPUDirect TCPX/TCPXO 不相容。如果叢集使用 GPUDirect RDMA,請勿啟用 NCCL Fast Socket,也不要在叢集上安裝 TCPX/TCPXO 外掛程式。

建立叢集時的注意事項

建立叢集時,請注意下列資訊:

  • 選擇叢集位置
    • 確認您使用的位置可提供所選機器類型。詳情請參閱「GPU 位置」。
    • 如要使用密集預留項目,可以建立可用區叢集。在本例中,請將 --region 標記替換為 --zone=COMPUTE_ZONE 標記,其中 COMPUTE_ZONE 是控制層的區域。
    • 在地區叢集中建立節點集區時,您可以使用 --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:預訂中的特定區塊名稱。

      如要使用以子區塊為目標的預留項目,讓 VM 放置在 BLOCK_NAME 內的單一子區塊中,請在路徑結尾新增下列內容:

      /reservationSubBlocks/SUB_BLOCK_NAME
      

      SUB_BLOCK_NAME 替換為子區塊的名稱。

建立使用 A4X 和 GPUDirect RDMA 的 AI 適用 GKE 叢集

對於分散式 AI 工作負載,通常會將多個 GPU 節點連結在一起,當做單一電腦運作。A4X 是以 NVIDIA GB200 NVL72 機架式架構為基礎的百億級平台。這種機器類型可為 AI 工作負載提供高效能雲端體驗,讓您在多個 GPU 之間進行擴充及協作。如要進一步瞭解 A4X 的網路架構,包括網路頻寬和 NIC 配置,請參閱 A4X 機器類型

如要使用 A4X 和 GPUDirect RDMA 建立 GKE Standard 叢集,請完成下列步驟 (詳情請參閱下幾節):

  1. 建立虛擬私有雲和子網路
  2. 建立具備多重網路功能的 GKE 叢集
  3. 建立 GKE 網路物件
  4. 建立工作負載政策
  5. 建立具有 A4X 的節點集區
  6. 安裝 RDMA 二進位檔並設定 NCCL
  7. 安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式

建立虛擬私有雲和子網路

A4X VM 的設定如下:

  • 每個虛擬機器有四個 NVIDIA B200 GPU,並透過 NVLink 連線
  • 兩個以 Arm 為基礎的 NVIDIA Grace CPU
  • 四張 400 Gbps CX-7 網路介面卡 (NIC),用於 GPU 對 GPU 的網路
  • 兩張 200 Gbps 的 Google Titanium 網路介面卡 (NIC),適用於外部服務

AI 和機器學習工作負載 (例如分散式訓練) 需要強大的加速功能,才能縮短作業完成時間,進而提升效能。對於需要高效能、高處理量和低延遲的工作負載,GPUDirect RDMA 可減少將酬載傳輸至 GPU 和從 GPU 傳輸酬載時所需的網路躍點。這種做法可更有效率地使用可用網路頻寬。

與 CPU 相關聯的其中一個 Google Titanium NIC 會使用 GKE 中的預設網路,因此只要預設網路有足夠的 IP 位址範圍,您就不必為這個 NIC 建立新的 VPC。

您可以使用下列指令,為第二個 CPU Titanium NIC (gVNIC) 建立一個 VPC,並為四個 CX-7 RDMA NIC 建立另一個 VPC。

為盡量提高網路頻寬,建立額外 GVNIC 的虛擬私有雲指令會將最大傳輸單元 (MTU) 設為 8896。RDMA 虛擬私有雲預設為建議設定 8896。詳情請參閱「MTU 設定和 GPU 機器類型」。

  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:GVNIC 網路前置字串 (例如 a4x-gvnic)。
    • RDMA_NETWORK_PREFIX:RDMA 網路前置字串 (例如 a4x-rdma)。
  2. 建立兩個虛擬私有雲網路:

    # Create a VPC for the additional GVNIC
    gcloud compute --project=${PROJECT} \
      networks create \
      GVNIC_NETWORK_PREFIX-net \
      --subnet-mode=custom \
      --mtu=8896
    
    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 4 subnets.
    gcloud 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 3); 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 叢集

  1. 建立具備多重網路功能的 GKE Standard 叢集:

    gcloud container clusters create CLUSTER_NAME \
        --enable-dataplane-v2 --enable-ip-alias --location=COMPUTE_REGION \
        --enable-multi-networking --cluster-version=CLUSTER_VERSION \
        --enable-kubernetes-unstable-apis=resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices \
        [--services-ipv4-cidr=SERVICE_CIDR \
        --cluster-ipv4-cidr=POD_CIDR]
    

    準備這項指令時,請執行下列操作:

    • 建立執行 GKE 1.34 以上版本的叢集時,請移除 --enable-kubernetes-unstable-apis 旗標,這個旗標用於啟用 DRA。只有在建立執行 1.32 或 1.33 版的叢集時,才需要使用這個旗標。啟用 Beta 版 API 後,您必須在 Beta 版 API 淘汰並隨後續 Kubernetes 次要版本移除時,從 Beta 版 API 遷移。詳情請參閱「Beta 版 API 淘汰」一文。
    • 更改下列內容:

      • 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 位址範圍」。

建立 GKE 網路物件

您必須透過 GKE 網路參數集,設定上一節中建立的虛擬私有雲網路。具體來說,第二個 CPU Titanium NIC (gVNIC) 必須以 NetDevice 模式設定,而四個 CX-7 RDMA NIC 則必須以 RDMA 模式設定。

這個指令會使用下列名稱:

  • CPU Titanium NIC (gVNIC) 虛擬私有雲命名為 GVNIC_NETWORK_PREFIX-net,子網路命名為 GVNIC_NETWORK_PREFIX-sub
  • CX-7 RDMA NIC 的虛擬私有雲名為 RDMA_NETWORK_PREFIX-net,子網路名為 RDMA_NETWORK_PREFIX-sub-[0…3]

執行下列指令,建立 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
EOF

建立工作負載政策

您必須先建立工作負載政策,才能建立分區。詳情請參閱「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 建立節點集區

建議您建立使用 GKE GPU 裝置外掛程式的節點集區。這個外掛程式提供 GKE 代管的 GPU 資源管理功能。這種做法有以下優點:

  • 輕鬆部署及升級
  • 自動安裝驅動程式
  • GKE 管理的 GPU 功能,例如指標和分割 GPU
  • 修正重大安全漏洞

或者,如果您的用途需要,也可以使用 NVIDIA GPU 運算子。詳情請參閱「為何要使用 NVIDIA GPU 運算子?」。

使用 GKE GPU 裝置外掛程式建立 A4X 節點集區

建立使用 GKE GPU 裝置外掛程式的 A4X 節點集區:

gcloud container node-pools create NODE_POOL_NAME \
    --location COMPUTE_REGION \
    --node-locations COMPUTE_ZONE \
    --cluster CLUSTER_NAME \
    --num-nodes=NODE_COUNT \
    --machine-type MACHINE_TYPE \
    --accelerator type=nvidia-gb200,count=4,gpu-driver-version=DRIVER_VERSION \
    --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 \
    --scopes "https://www.googleapis.com/auth/cloud-platform" \
    --reservation-affinity=specific \
    --reservation=RESERVATION_NAME/reservationBlocks/BLOCK_NAME \
    --placement-policy=WORKLOAD_POLICY_NAME

更改下列內容:

  • NODE_POOL_NAME:節點集區的名稱。
  • COMPUTE_REGION:叢集所在的區域。
  • COMPUTE_ZONE:節點集區的可用區。
  • CLUSTER_NAME:叢集名稱。
  • NODE_COUNT:節點集區的節點數量,必須為 18 個節點以下。建議使用 18 個節點,透過 NVLink 網域在一個子區塊中取得 GPU 拓撲。1x72
  • MACHINE_TYPEa4x-highgpu-4ga4x-highgpu-4g-nolssd,視您是否需要本機 SSD 而定。
  • DRIVER_VERSION:要安裝的 NVIDIA 驅動程式版本。可能的值包括:defaultlatestdisabled
  • RESERVATION_NAME:預訂名稱。如要找出這個值,請參閱「查看未來預留項目要求」。
  • BLOCK_NAME:預訂中的特定區塊名稱。如要找出這個值,請參閱「查看未來預留項目要求」。
  • WORKLOAD_POLICY_NAME:先前建立的工作負載政策名稱。

使用 NVIDIA GPU 運算子建立 A4X 節點集區

或者,如要使用 NVIDIA GPU Operator,請執行下列步驟:

  1. 執行上一節中的 gcloud container node-pools create 指令,並進行下列變更:

    • gpu-driver-version=latest 變更為 gpu-driver-version=disabled。 這項修改會略過自動安裝 GPU 驅動程式的程序,因為使用 NVIDIA GPU 運算子時,系統不支援這項功能。
    • --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" 設為停用 GKE 代管的 GPU 裝置外掛程式 DaemonSet。
  2. 套用 GKE GPU 驅動程式安裝程式 DaemonSet 資訊清單。這份資訊清單會在每個 A4X 節點上部署 GPU 驅動程式安裝程式 Pod:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/refs/heads/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
    
  3. 使用 NVIDIA GPU 運算子在 Google Kubernetes Engine (GKE) 上管理 GPU 堆疊

    1. 在「建立及設定 GPU 節點集區」部分中,按照操作說明從取得驗證憑證的步驟開始操作。
    2. 安裝 NVIDIA GPU 運算子。 完成所有步驟,但請使用下列指令取代參考章節中,透過 Helm 安裝 NVIDIA GPU 運算子的指令。請改用下列指令:

      helm install --wait --generate-name \
        -n gpu-operator \
        nvidia/gpu-operator \
        --version="25.3.0" \
        -f <(cat <<EOF
      hostPaths:
        driverInstallDir: /home/kubernetes/bin/nvidia
      toolkit:
        installDir: /home/kubernetes/bin/nvidia
      cdi:
        enabled: true
        default: true
      driver:
        enabled: false
      
      daemonsets:
        tolerations:
          - key: nvidia.com/gpu
            operator: Equal
            value: present
            effect: NoSchedule
          - key: kubernetes.io/arch
            operator: Equal
            value: arm64
            effect: NoSchedule
      
      node-feature-discovery:
        worker:
          tolerations:
            - key: kubernetes.io/arch
              operator: Equal
              value: arm64
              effect: NoSchedule
            - key: "node-role.kubernetes.io/master"
              operator: "Equal"
              value: ""
              effect: "NoSchedule"
            - key: "node-role.kubernetes.io/control-plane"
              operator: "Equal"
              value: ""
              effect: "NoSchedule"
            - key: nvidia.com/gpu
              operator: Exists
              effect: NoSchedule
      EOF
      )
      

安裝 RDMA 二進位檔並設定 NCCL

套用下列 DaemonSet,在每個節點上安裝 RDMA 二進位檔和 NCCL 程式庫。在每個基礎 VM 上,RDMA 二進位檔會安裝在 /home/kubernetes/bin/gib 目錄中,NCCL 程式庫則會安裝在 /home/kubernetes/bin/nvidia/lib64 目錄中。

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

安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式

安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式。詳情請參閱「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 節點數量的 2 倍加 1。舉例來說,如果叢集有 18 個 A4X 節點,您必須將變數設為至少 37。

  4. 安裝 DRA 驅動程式:

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="DRA_DRIVER_VERSION" \
        --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-gb200
                  - 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
    )
    

    DRA_DRIVER_VERSION 替換為 25.3.1 以上版本。如要查看可用的 NVIDIA DRA 驅動程式版本清單,請執行 helm search repo nvidia/nvidia-dra-driver-gpu --versions 指令。或者,查看 GitHub 版本資訊,瞭解可用的版本。

設定工作負載資訊清單,以支援多重網路、RDMA 和 IMEX 網域

  1. 在 Pod 中繼資料中新增下列註解:

    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"}
          ]
    
  2. 新增節點相依性規則,在 Arm 節點上排程:

    spec:
    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/arch
              operator: In
              values:
              - arm64
    

    詳情請參閱「將工作負載排程至單一架構」。

  3. 在 Pod 規格中新增下列磁碟區:

    spec:
    volumes:
      - name: library-dir-host
        hostPath:
          path: /home/kubernetes/bin/nvidia
      - name: gib
        hostPath:
          path: /home/kubernetes/bin/gib
    
  4. 將下列磁碟區掛接、環境變數和資源新增至要求 GPU 的容器。工作負載容器必須要求所有四個 GPU:

    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: 4
    
  5. 為工作負載建立 ComputeDomain 資源:

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

    請將 NUM_NODES 改成工作負載所需的節點數量。

  6. 指定 Pod 要使用的 resourceClaimTemplate:

    spec:
      ...
      volumes:
        ...
      containers:
        - name: my-container
          ...
          resources:
            limits:
              nvidia.com/gpu: 4
      claims:
              - name: compute-domain-channel
            ...
    resourceClaims:
      - name: compute-domain-channel
        resourceClaimTemplateName: a4x-compute-domain-channel
    
  7. 設定所有必要的環境變數,以設定 NCCL。從工作負載容器使用下列殼層指令碼:

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

完成的 Pod 規格如下所示:

apiVersion: resource.nvidia.com/v1beta1
kind: ComputeDomain
metadata:
  name: a4x-compute-domain
spec:
  numNodes: NUM_NODES
  channel:
    resourceClaimTemplate:
      name: a4x-compute-domain-channel
---
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"},
      ]
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
    - 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: 4
        claims:
          - name: compute-domain-channel
        ...
resourceClaims:
  - name: compute-domain-channel
    resourceClaimTemplateName: a4x-compute-domain-channel

測試網路效能

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

後續步驟