使用 DRA 將裝置動態分配給工作負載

您可以使用動態資源分配 (DRA),彈性要求 Google Kubernetes Engine (GKE) 工作負載的裝置。本文說明如何建立 ResourceClaimTemplate 來要求裝置,然後建立工作負載,觀察 Kubernetes 如何彈性地將裝置分配給 Pod。

本文件適用於執行 AI/機器學習或高效能運算 (HPC) 等工作負載的應用程式運算子資料工程師

關於使用 DRA 要求裝置

為 DRA 設定 GKE 基礎架構時,節點上的 DRA 驅動程式會在叢集中建立 DeviceClass 物件。DeviceClass 定義可供工作負載要求的裝置類別,例如 GPU。平台管理員可以視需要部署其他 DeviceClass,限制您在特定工作負載中可要求的裝置。

如要在 DeviceClass 中要求裝置,請建立下列其中一個物件:

  • ResourceClaim: Pod 或使用者可透過 ResourceClaim,在 DeviceClass 中依特定參數篩選硬體資源。
  • ResourceClaimTemplate: ResourceClaimTemplate 定義 Pod 可用來自動建立每個 Pod 的新 ResourceClaim 的範本。

如要進一步瞭解 ResourceClaim 和 ResourceClaimTemplate,請參閱「何時使用 ResourceClaim 和 ResourceClaimTemplate」。

本頁的範例使用基本 ResourceClaimTemplate 要求指定的裝置設定。如要進一步瞭解可指定的所有欄位,請參閱 ResourceClaimTemplate API 參考資料

限制

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

需求條件

如要使用 DRA,GKE 版本必須為 1.34 以上。

此外,您也應熟悉下列規定和限制:

事前準備

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

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

使用 DRA 部署工作負載

如要要求為每個 Pod 分配裝置,請建立 ResourceClaimTemplate,其中包含您要求的裝置設定,例如特定類型的 GPU。部署參照 ResourceClaimTemplate 的工作負載時,Kubernetes 會根據 ResourceClaimTemplate,為工作負載中的每個 Pod 建立 ResourceClaim。Kubernetes 會分配要求的資源,並在對應節點上排程 Pod。

如要在使用 DRA 的工作負載中要求裝置,請選取下列其中一個選項:

GPU

  1. 將下列資訊清單儲存為 claim-template.yaml

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: gpu-claim-template
    spec:
      spec:
        devices:
          requests:
          - name: single-gpu
            exactly:
              deviceClassName: gpu.nvidia.com
              allocationMode: ExactCount
              count: 1
    
  2. 建立 ResourceClaimTemplate:

    kubectl create -f claim-template.yaml
    
  3. 如要建立參照 ResourceClaimTemplate 的工作負載,請將下列資訊清單儲存為 dra-gpu-example.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dra-gpu-example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: dra-gpu-example
      template:
        metadata:
          labels:
            app: dra-gpu-example
        spec:
          containers:
          - name: ctr
            image: ubuntu:22.04
            command: ["bash", "-c"]
            args: ["echo $(nvidia-smi -L || echo Waiting...)"]
            resources:
              claims:
              - name: single-gpu
          resourceClaims:
          - name: single-gpu
            resourceClaimTemplateName: gpu-claim-template
          tolerations:
          - key: "nvidia.com/gpu"
            operator: "Exists"
            effect: "NoSchedule"
    
  4. 部署工作負載:

    kubectl create -f dra-gpu-example.yaml
    

TPU

  1. 將下列資訊清單儲存為 claim-template.yaml

    apiVersion: resource.k8s.io/v1
    kind: ResourceClaimTemplate
    metadata:
      name: tpu-claim-template
    spec:
      spec:
        devices:
          requests:
          - name: all-tpus
            exactly:
              deviceClassName: tpu.google.com
              allocationMode: All
    

    這個 ResourceClaimTemplate 會要求所有 TPU,因此節點上的所有 TPU 都會分配給每個產生的 ResourceClaim。

  2. 建立 ResourceClaimTemplate:

    kubectl create -f claim-template.yaml
    
  3. 如要建立參照 ResourceClaimTemplate 的工作負載,請將下列資訊清單儲存為 dra-tpu-example.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dra-tpu-example
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: dra-tpu-example
      template:
        metadata:
          labels:
            app: dra-tpu-example
        spec:
          containers:
          - name: ctr
            image: ubuntu:22.04
            command:
              - /bin/sh
              - -c
              - |
                echo "Environment Variables:"
                env
                echo "Sleeping indefinitely..."
                sleep infinity
            resources:
              claims:
              - name: all-tpus
          resourceClaims:
          - name: all-tpus
            resourceClaimTemplateName: tpu-claim-template
          tolerations:
          - key: "google.com/tpu"
            operator: "Exists"
            effect: "NoSchedule"
    
  4. 部署工作負載:

    kubectl create -f dra-tpu-example.yaml
    

驗證硬體分配

您可以檢查 ResourceClaim 或查看 Pod 的記錄,確認工作負載是否已分配到硬體。如要驗證 GPU 或 TPU 的分配情形,請選取下列其中一個選項:

GPU

  1. 取得與您部署的工作負載相關聯的 ResourceClaim:

    kubectl get resourceclaims
    

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

    NAME                                               STATE                AGE
    dra-gpu-example-64b75dc6b-x8bd6-single-gpu-jwwdh   allocated,reserved   9s
    
  2. 進一步瞭解指派給 Pod 的硬體:

    kubectl describe resourceclaims RESOURCECLAIM
    

    RESOURCECLAIM 替換為上一步輸出內容中的 ResourceClaim 全名。

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

       Name:         dra-gpu-example-68f595d7dc-prv27-single-gpu-qgjq5
       Namespace:    default
       Labels:       <none>
       Annotations:  resource.kubernetes.io/pod-claim-name: single-gpu
       API Version:  resource.k8s.io/v1
       Kind:         ResourceClaim
       Metadata:
       # Multiple lines are omitted here.
       Spec:
         Devices:
           Requests:
             Exactly:
               Allocation Mode:    ExactCount
               Count:              1
               Device Class Name:  gpu.nvidia.com
             Name:                 single-gpu
       Status:
         Allocation:
           Devices:
             Results:
               Device:   gpu-0
               Driver:   gpu.nvidia.com
               Pool:     gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
               Request:  single-gpu
           Node Selector:
             Node Selector Terms:
               Match Fields:
                 Key:       metadata.name
                 Operator:  In
                 Values:
                   gke-cluster-1-dra-gpu-pool-b56c4961-7vnm
         Reserved For:
           Name:      dra-gpu-example-68f595d7dc-prv27
           Resource:  pods
           UID:       e16c2813-08ef-411b-8d92-a72f27ebf5ef
       Events:        <none>
       ```
    
  3. 取得已部署工作負載的記錄:

    kubectl logs deployment/dra-gpu-example --all-pods=true
    

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

    [pod/dra-gpu-example-64b75dc6b-x8bd6/ctr] GPU 0: Tesla T4 (UUID: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef)
    

    這些步驟的輸出內容會顯示 GKE 為容器分配了一個 GPU。

TPU

  1. 取得與您部署的工作負載相關聯的 ResourceClaim:

    kubectl get resourceclaims | grep dra-tpu-example
    

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

    NAME                                               STATE                AGE
    dra-tpu-example-64b75dc6b-x8bd6-all-tpus-jwwdh     allocated,reserved   9s
    
  2. 進一步瞭解指派給 Pod 的硬體:

    kubectl describe resourceclaims RESOURCECLAIM -o yaml
    

    RESOURCECLAIM 替換為上一步輸出內容中的 ResourceClaim 全名。

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

    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      annotations:
        resource.kubernetes.io/pod-claim-name: all-tpus
      creationTimestamp: "2025-03-04T21:00:54Z"
      finalizers:
      - resource.kubernetes.io/delete-protection
      generateName: dra-tpu-example-59b8785697-k9kzd-all-gpus-
      name: dra-tpu-example-59b8785697-k9kzd-all-gpus-gnr7z
      namespace: default
      ownerReferences:
      - apiVersion: v1
        blockOwnerDeletion: true
        controller: true
        kind: Pod
        name: dra-tpu-example-59b8785697-k9kzd
        uid: c2f4fe66-9a73-4bd3-a574-4c3eea5fda3f
      resourceVersion: "12189603"
      uid: 279b5014-340b-4ef6-9dda-9fbf183fbb71
    spec:
      devices:
        requests:
        - allocationMode: All
          deviceClassName: tpu.google.com
          name: all-tpus
    status:
      allocation:
        devices:
          results:
          - adminAccess: null
            device: "0"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
          - adminAccess: null
            device: "1"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
          - adminAccess: null
            device: "2"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
          - adminAccess: null
            device: "3"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
          - adminAccess: null
            device: "4"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
          - adminAccess: null
            device: "5"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
          - adminAccess: null
            device: "6"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
          - adminAccess: null
            device: "7"
            driver: tpu.google.com
            pool: gke-tpu-2ec29193-bcc0
            request: all-tpus
        nodeSelector:
          nodeSelectorTerms:
          - matchFields:
            - key: metadata.name
              operator: In
              values:
              - gke-tpu-2ec29193-bcc0
      reservedFor:
      - name: dra-tpu-example-59b8785697-k9kzd
        resource: pods
        uid: c2f4fe66-9a73-4bd3-a574-4c3eea5fda3f
    
  3. 取得已部署工作負載的記錄:

    kubectl logs deployment/dra-tpu-example --all-pods=true | grep "TPU"
    

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

    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_CHIPS_PER_HOST_BOUNDS=2,4,1
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_TOPOLOGY_WRAP=false,false,false
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_SKIP_MDS_QUERY=true
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_RUNTIME_METRICS_PORTS=8431,8432,8433,8434,8435,8436,8437,8438
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_WORKER_ID=0
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_WORKER_HOSTNAMES=localhost
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_TOPOLOGY=2x4
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_ACCELERATOR_TYPE=v6e-8
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_HOST_BOUNDS=1,1,1
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_TOPOLOGY_ALT=false
    [pod/dra-tpu-example-59b8785697-tm2lc/ctr] TPU_DEVICE_0_RESOURCE_CLAIM=77e68f15-fa2f-4109-9a14-6c91da1a38d3
    

    這些步驟的輸出內容表示節點集區中的所有 TPU 都已分配給 Pod。

後續步驟