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


本頁說明如何設定 Google Kubernetes Engine (GKE) 基礎架構,以支援動態資源分配 (DRA)。您可以在這個頁面建立叢集,部署 GPU 或 TPU 工作負載,並手動安裝啟用 DRA 所需的驅動程式。

本頁適用於平台管理員,他們希望減少使用專用硬體裝置設定基礎架構的複雜度和額外負擔。

關於 DRA

DRA 是 Kubernetes 內建功能,可讓您在叢集中,彈性地要求、分配及共用 Pod 和容器之間的硬體。詳情請參閱「關於動態資源分配」。

限制

  • 不支援節點自動佈建。
  • Autopilot 叢集不支援 DRA。
  • DRA 不支援自動安裝 GPU 驅動程式。
  • 您無法使用下列 GPU 共用功能:
    • GPU 分時
    • 多執行個體 GPU
    • 多程序服務 (MPS)

需求條件

如要使用 DRA,GKE 版本必須為 1.32.1-gke.1489001 以上。

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

事前準備

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

  • 啟用 Google Kubernetes Engine API。
  • 啟用 Google Kubernetes Engine API
  • 如要使用 Google Cloud CLI 執行這項工作,請安裝初始化 gcloud CLI。如果您先前已安裝 gcloud CLI,請執行 gcloud components update,取得最新版本。
  • 如果您未使用 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
    

建立 GKE Standard 叢集

建立 Standard 模式叢集,啟用 DRA 的 Kubernetes Beta 版 API:

   gcloud container clusters create CLUSTER_NAME \
       --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
       --cluster-version=GKE_VERSION

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • GKE_VERSION:用於叢集和節點的 GKE 版本。必須為 1.32.1-gke.1489001 以上版本。

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

在 GKE 中,您可以將 DRA 與 GPU 和 TPU 搭配使用。節點集區的設定 (例如機器類型、加速器類型、數量、節點作業系統和節點位置) 視您的需求而定。

GPU

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

  • 使用 gpu-driver-version=disabled 停用自動安裝 GPU 驅動程式。
  • 新增 gke-no-default-nvidia-gpu-device-plugin=true 節點標籤,停用 GPU 裝置外掛程式。
  • 新增 nvidia.com/gpu.present=true 節點標籤,讓 DRA 驅動程式 DaemonSet 在節點上執行。

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

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

    gcloud container node-pools create NODEPOOL_NAME \
        --cluster=CLUSTER_NAME \
        --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:叢集名稱。
  2. 在 Container-Optimized OS 或 Ubuntu 節點上,手動安裝驅動程式。如需詳細操作說明,請參閱「手動安裝 NVIDIA GPU 驅動程式」。

TPU

如要為 TPU 使用 DRA,請新增 gke-no-default-tpu-device-plugin=true 節點標籤,停用 TPU 裝置外掛程式。

建立使用 TPU 的節點集區。以下範例會建立 TPU Trillium 節點集區:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --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:叢集名稱。

安裝 DRA 驅動程式

GPU

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

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  2. 安裝 NVIDIA DRA 驅動程式 (版本 25.3.0-rc.4):

    helm install nvidia-dra-driver-gpu nvidia/nvidia-dra-driver-gpu --version="25.3.0-rc.4" --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

您可以使用提供的 Helm 資訊套件,為 TPU 安裝 DRA 驅動程式。如要存取 Helm 資訊圖表,請完成下列步驟:

  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

確認 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

確認 ResourceSlice 列出您新增的硬體裝置:

kubectl get resourceslices -o yaml

如果您使用前一節的範例,根據所用硬體類型,ResourceSlice 會類似下列內容:

GPU

以下範例會建立具有兩個 L4 GPU 的 g2-standard-24 機器。

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 0
          minor:
            int: 0
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-4d403095-4294-6ddd-66fd-cfe5778ef56e
        capacity:
          memory:
            value: 23034Mi
      name: gpu-0
    - basic:
        attributes:
          architecture:
            string: Ada Lovelace
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 8.9.0
          cudaDriverVersion:
            version: 12.9.0
          driverVersion:
            version: 575.57.8
          index:
            int: 1
          minor:
            int: 1
          productName:
            string: NVIDIA L4
          type:
            string: gpu
          uuid:
            string: GPU-cc326645-f91d-d013-1c2f-486827c58e50
        capacity:
          memory:
            value: 23034Mi
      name: gpu-1
    driver: gpu.nvidia.com
    nodeName: gke-cluster-gpu-pool-9b10ff37-mf70
    pool:
      generation: 1
      name: gke-cluster-gpu-pool-9b10ff37-mf70
      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: ""

後續步驟