為 DRA 工作負載準備 GKE 基礎架構

本文說明如何設定 Google Kubernetes Engine (GKE) 基礎架構,以支援動態資源分配 (DRA)。設定步驟包括建立使用 GPU 或 TPU 的節點集區,以及在叢集中安裝 DRA 驅動程式。本文適用於平台管理員,可協助他們減少設定基礎架構的複雜度和額外負擔,不必使用專用硬體裝置。

限制

  • 不支援節點自動佈建功能。
  • Autopilot 叢集不支援 DRA。
  • DRA 不支援自動安裝 GPU 驅動程式。
  • 您無法使用下列 GPU 共用功能:
    • GPU 分時
    • 多執行個體 GPU
    • 多重程序服務 (MPS)
  • 如果是 TPU,您必須啟用 DRA API 種類的 v1beta1v1beta2 版本。這項限制不適用於 GPU,GPU 可以使用 v1 API 版本。

需求條件

如要使用 DRA,GKE 叢集必須執行 1.34 以上版本。

此外,您也應熟悉下列規定和限制,具體視您想使用的硬體類型而定:

事前準備

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

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update 指令,取得最新版本。較舊的 gcloud CLI 版本可能不支援執行本文中的指令。
  • 擁有執行 1.34 以上版本的 GKE Standard 叢集。您也可以建立地區叢集

  • 如果您未使用 Cloud Shell,請安裝 Helm CLI:

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    
  • 如要使用 TPU 的 DRA,請啟用 DRA API 種類的 v1beta1v1beta2 版本:

    gcloud container clusters update CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices,resource.k8s.io/v1beta2/deviceclasses,resource.k8s.io/v1beta2/resourceclaims,resource.k8s.io/v1beta2/resourceclaimtemplates,resource.k8s.io/v1beta2/resourceslices"
    

建立具有 GPU 或 TPU 的 GKE 節點集區

在 GKE 中,您可以將 DRA 與 GPU 和 TPU 搭配使用。節點集區的設定 (例如機器類型、加速器類型、數量、節點作業系統和節點位置) 取決於您的需求。如要建立支援 DRA 的節點集區,請選取下列任一選項:

GPU

如要使用 GPU 的 DRA,請在建立節點集區時執行下列操作:

  • 如要停用自動安裝 GPU 驅動程式的功能,請在為節點集區設定 GPU 時,在 --accelerator 旗標中指定 gpu-driver-version=disabled 選項。
  • 新增 gke-no-default-nvidia-gpu-device-plugin=true 節點標籤,停用 GPU 裝置外掛程式。
  • 新增 nvidia.com/gpu.present=true 節點標籤,讓 DRA 驅動程式 DaemonSet 在節點上執行。

如要為 DRA 建立 GPU 節點集區,請按照下列步驟操作:

  1. 使用所需硬體建立節點集區。以下範例會建立節點集區,其中包含 Container-Optimized OS 上的 g2-standard-24 執行個體,以及兩個 L4 GPU。

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --location=CONTROL_PLANE_LOCATION \
        --machine-type "g2-standard-24" \
        --accelerator "type=nvidia-l4,count=2,gpu-driver-version=disabled" \
        --num-nodes "1" \
        --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
    

    更改下列內容:

    • NODEPOOL_NAME:節點集區的名稱。
    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的區域或可用區,例如 us-central1us-central1-a
  2. 在 Container-Optimized OS 或 Ubuntu 節點上,手動安裝驅動程式。如需詳細操作說明,請參閱「手動安裝 NVIDIA GPU 驅動程式」。

TPU

如要對 TPU 使用 DRA,請新增 gke-no-default-tpu-device-plugin=true 節點標籤,停用 TPU 裝置外掛程式。以下範例會建立支援 DRA 的 TPU Trillium 節點集區:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --location=CONTROL_PLANE_LOCATION \
    --node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
    --machine-type=ct6e-standard-8t

更改下列內容:

  • NODEPOOL_NAME:節點集區的名稱。
  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的區域或可用區,例如 us-central1us-central1-a

安裝 DRA 驅動程式

GPU

  1. 提取並更新內含 NVIDIA DRA 驅動程式的 Helm 資訊套件:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. 安裝 NVIDIA DRA 驅動程式,版本為 25.3.2

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu \
        --version="25.3.2" --create-namespace --namespace=nvidia-dra-driver-gpu \
        --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
        --set gpuResourcesEnabledOverride=true \
        --set resources.computeDomains.enabled=false \
        --set kubeletPlugin.priorityClassName="" \
        --set 'kubeletPlugin.tolerations[0].key=nvidia.com/gpu' \
        --set 'kubeletPlugin.tolerations[0].operator=Exists' \
        --set 'kubeletPlugin.tolerations[0].effect=NoSchedule'
    

    如果是 Ubuntu 節點,請使用 nvidiaDriverRoot="/opt/nvidia" 目錄路徑。

TPU

  1. 複製 ai-on-gke 存放區,存取包含 GPU 和 TPU 的 DRA 驅動程式的 Helm 資訊圖表:

    git clone https://github.com/ai-on-gke/common-infra.git
    
  2. 前往內含圖表的目錄:

    cd common-infra/common/charts
    
  3. 安裝 TPU DRA 驅動程式:

    ./tpu-dra-driver/install-tpu-dra-driver.sh
    

確認基礎架構已準備好支援 DRA

  1. 如要確認 DRA 驅動程式 Pod 是否正在執行,請選取下列其中一個選項:

    GPU

    kubectl get pods -n nvidia-dra-driver-gpu
    

    輸出結果會與下列內容相似:

    NAME                                         READY   STATUS    RESTARTS   AGE
    nvidia-dra-driver-gpu-kubelet-plugin-52cdm   1/1     Running   0          46s
    

    TPU

    kubectl get pods -n tpu-dra-driver
    
    

    輸出結果會與下列內容相似:

    NAME                                         READY   STATUS    RESTARTS   AGE
    tpu-dra-driver-kubeletplugin-h6m57           1/1     Running   0          30s
    
  2. 確認 ResourceSlice 列出您新增的硬體裝置:

    kubectl get resourceslices -o yaml
    

    如果您使用上一節的範例,輸出內容會類似於下列內容,具體取決於您是否設定 GPU 或 TPU:

    GPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1
      kind: ResourceSlice
      metadata:
      # Multiple lines are omitted here.
      spec:
        devices:
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 0
            minor:
              int: 0
            pcieBusID:
              string: "0000:00:03.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-ccc19e5e-e3cd-f911-65c8-89bcef084e3f
          capacity:
            memory:
              value: 23034Mi
          name: gpu-0
        - attributes:
            architecture:
              string: Ada Lovelace
            brand:
              string: Nvidia
            cudaComputeCapability:
              version: 8.9.0
            cudaDriverVersion:
              version: 13.0.0
            driverVersion:
              version: 580.65.6
            index:
              int: 1
            minor:
              int: 1
            pcieBusID:
              string: "0000:00:04.0"
            productName:
              string: NVIDIA L4
            resource.kubernetes.io/pcieRoot:
              string: pci0000:00
            type:
              string: gpu
            uuid:
              string: GPU-f783198d-42f9-7cef-9ea1-bb10578df978
          capacity:
            memory:
              value: 23034Mi
          name: gpu-1
        driver: gpu.nvidia.com
        nodeName: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
        pool:
          generation: 1
          name: gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

    TPU

    apiVersion: v1
    items:
    - apiVersion: resource.k8s.io/v1beta1
      kind: ResourceSlice
      metadata:
        # lines omitted for clarity
      spec:
        devices:
        - basic:
            attributes:
              index:
                int: 0
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "0"
        - basic:
            attributes:
              index:
                int: 1
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "1"
        - basic:
            attributes:
              index:
                int: 2
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "2"
        - basic:
            attributes:
              index:
                int: 3
              tpuGen:
                string: v6e
              uuid:
                string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
          name: "3"
        driver: tpu.google.com
        nodeName: gke-tpu-b4d4b61b-fwbg
        pool:
          generation: 1
          name: gke-tpu-b4d4b61b-fwbg
          resourceSliceCount: 1
    kind: List
    metadata:
      resourceVersion: ""
    

後續步驟