本文說明如何建立 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 建立叢集,並搭配其他機型,請參閱下列說明:
- A4X:建立使用 A4X 的 AI 最佳化 GKE 叢集。
- A4 或 A3 Ultra:如要建立使用 A4 或 A3 Ultra 的叢集,請參閱「建立使用 A4 或 A3 Ultra 的 AI 最佳化 GKE 叢集」。您可以使用這些機器系列執行工作負載,無論是否使用 GPUDirect RDMA 皆可。
或者,您也可以選擇使用 Cluster Toolkit,以預設設定快速部署叢集,這些設定反映了許多用途的最佳做法。詳情請參閱「使用 Cluster Toolkit 建立 AI 適用 GKE 叢集」。
事前準備
開始之前,請務必先完成下列工作:
- 啟用 Google Kubernetes Engine API。 啟用 Google Kubernetes Engine API
- 如要使用 Google Cloud CLI 執行這項工作,請安裝並初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行
gcloud components update指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文件中的指令。
必要的角色
如要取得建立及管理 GKE 叢集所需的權限,請要求管理員授予您下列 IAM 角色:
- Kubernetes Engine 管理員 (
roles/container.admin) 專案 - 專案的 Cloud Build 編輯者 (
roles/cloudbuild.builds.editor) - 專案的 Compute 管理員 (
roles/compute.admin) - 專案的專案 IAM 管理員 (
roles/resourcemanager.projectIamAdmin) - 專案的服務帳戶管理員 (
roles/iam.serviceAccountAdmin) - 專案的服務帳戶使用者 (
roles/iam.serviceAccountUser) - 專案的服務使用情形消費者 (
roles/serviceusage.serviceUsageConsumer) -
如要使用單一專案預留項目:
在專案中具備「Compute 執行個體管理員 (v1) 」(
roles/compute.instanceAdmin.v1) 角色。 -
如要使用共用預留項目:
在擁有者專案和要使用預留項目的任何消費者專案中,都必須具備 Compute 執行個體管理員 (v1) (
roles/compute.instanceAdmin.v1) 角色。
如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
取得容量
您可以建立未來預留項目,取得 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機型不支援多重網路。
建立叢集時的注意事項
建立叢集時,請注意下列事項:
- 選擇叢集位置:
- 選擇驅動程式版本:
- 驅動程式版本可以是下列其中一個值:
- 如要進一步瞭解 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:預訂內特定區塊的名稱。
此外,我們也建議您使用以子區塊為目標的預留資源,將運算執行個體放置在
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 叢集,請完成下列各節所述的步驟:
- 建立 GKE 叢集
- 建立工作負載政策
- 使用 A4X Max 建立節點集區
- 使用
asapd-lite設定 MRDMA NIC - 安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式
- 為 RDMA 和 IMEX 網域設定工作負載資訊清單
這些操作說明會使用加速器網路設定檔,為 A4X Max 節點自動設定虛擬私有雲網路和子網路。或者,您也可以明確指定虛擬私有雲網路和子網路。
建立 GKE 叢集
建立 GKE Standard 叢集:
gcloud container clusters create CLUSTER_NAME \ --enable-dataplane-v2 \ --enable-ip-alias \ --location=COMPUTE_REGION \ --cluster-version=CLUSTER_VERSION [\ --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/19和POD_CIDR=10.64.0.0/19。詳情請參閱「新增 Pod IPv4 位址範圍」。
如要在接下來的章節中執行
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 建立節點集區
建立下列設定檔,預先配置巨頁給節點集區:
cat > node_custom.yaml <<EOF linuxConfig: hugepageConfig: hugepage_size2m: 4096 EOF export NODE_CUSTOM=node_custom.yaml建立 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 個節點,在一個子區塊中取得1x72的 GPU 拓撲,並使用 NVLink 網域。WORKLOAD_POLICY_NAME:先前建立的工作負載政策名稱。RESERVATION_NAME:預訂名稱。如要找出這個值,請參閱「查看未來預留項目要求」。BLOCK_NAME:預留項目中的特定區塊名稱。如要找出這個值,請參閱「查看未來預留項目要求」。
這個指令會使用
auto加速晶片 VM 網路設定檔,自動建立網路來連線單一可用區內的所有 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 連線。
安裝 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驗證
asapd-liteDaemonSet 中的副本: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> 5mREADY副本數量應與節點集區中建立且運作正常的節點數量相符。
安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式
下列步驟會安裝 NVIDIA Compute Domain CRD 和 DRA 驅動程式,以便使用 MNNVL。詳情請參閱「NVIDIA DRA Driver for GPUs」。
確認開發環境已安裝 Helm。Cloud Shell 已預先安裝 Helm。
雖然沒有特定的 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新增 NVIDIA Helm 存放區:
helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \ && helm repo update為 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。安裝 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 網域設定工作負載資訊清單
新增節點親和性規則,在 Arm 節點上排定工作負載:
spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/arch operator: In values: - arm64在 Pod 規格中新增下列磁碟區:
spec: volumes: - name: library-dir-host hostPath: path: /home/kubernetes/bin/nvidia將下列磁碟區掛接、環境變數和資源新增至要求 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為工作負載建立
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替換為工作負載所需的節點數量。建立 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指定 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在容器映像檔中安裝最新的使用者空間程式庫:
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」。
後續步驟
- 如要瞭解如何使用 TAS 和 Kueue 在 GKE 叢集上安排工作負載,請參閱「使用 Topology Aware Scheduling 安排 GKE 工作負載時程」。
- 如要瞭解如何管理與 GKE 叢集和 AI 工作負載相關的常見事件,請參閱「管理 AI 最佳化 GKE 叢集」。