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


本頁說明如何在 Google Kubernetes Engine 叢集上部署動態資源分配 (DRA) 工作負載。在本頁面中,您將建立 ResourceClaimTemplate,透過 DRA 要求硬體,然後部署基本工作負載,示範 Kubernetes 如何在 Pod 上彈性分配硬體。

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

關於動態資源分配

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

關於使用 DRA 要求裝置

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

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

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

如要進一步瞭解 ResourceClaimResourceClaimTemplate 物件,請參閱「何時使用 ResourceClaimsResourceClaimTemplates」。

本頁面的範例會使用基本 ResourceClaimTemplate 要求指定的裝置設定。如需詳細資訊,請參閱 ResourceClaimTemplateSpec Kubernetes 說明文件

限制

  • 不支援節點自動佈建。
  • Autopilot 叢集不支援 DRA。
  • 您無法使用下列 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,取得最新版本。

使用 DRA 部署工作負載

如要要求每個 Pod 的裝置分配,請先建立 ResourceClaimTemplate,產生 ResourceClaim 來描述 GPU 或 TPU 的要求,Kubernetes 會將其做為範本,為工作負載中的每個 Pod 建立新的 ResourceClaim 物件。在工作負載中指定 ResourceClaimTemplate 時,Kubernetes 會分配要求的資源,並在對應節點上排程 Pod。

GPU

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

    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaimTemplate
    metadata:
      name: gpu-claim-template
    spec:
      spec:
        devices:
          requests:
          - name: single-gpu
            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: ["while [ 1 ]; do date; echo $(nvidia-smi -L || echo Waiting...); sleep 60; done"]
            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/v1beta1
    kind: ResourceClaimTemplate
    metadata:
      name: tpu-claim-template
    spec:
      spec:
        devices:
          requests:
          - name: all-tpus
            deviceClassName: tpu.google.com
            allocationMode: All
    

    這項 ResourceClaimTemplate 要求 GKE 將整個 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

  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-64b75dc6b-x8bd6-single-gpu-jwwdh
    Namespace:    default
    Labels:       <none>
    Annotations:  resource.kubernetes.io/pod-claim-name: single-gpu
    API Version:  resource.k8s.io/v1beta1
    Kind:         ResourceClaim
    Metadata:
      Creation Timestamp:  2025-03-31T17:11:37Z
      Finalizers:
        resource.kubernetes.io/delete-protection
      Generate Name:  dra-gpu-example-64b75dc6b-x8bd6-single-gpu-
      Owner References:
        API Version:           v1
        Block Owner Deletion:  true
        Controller:            true
        Kind:                  Pod
        Name:                  dra-gpu-example-64b75dc6b-x8bd6
        UID:                   cb3cb1db-e62a-4961-9967-cdc7d599105b
      Resource Version:        12953269
      UID:                     3e0c3925-e15a-40e9-b552-d03610fff040
    Spec:
      Devices:
        Requests:
          Allocation Mode:    ExactCount
          Count:              1
          Device Class Name:  gpu.nvidia.com
          Name:               single-gpu
    Status:
      Allocation:
        Devices:
          Results:
            Admin Access:  <nil>
            Device:        gpu-0
            Driver:        gpu.nvidia.com
            Pool:          gke-cluster-gpu-pool-11026a2e-zgt1
            Request:       single-gpu
        Node Selector:
          # lines omitted for clarity
      Reserved For:
        Name:      dra-gpu-example-64b75dc6b-x8bd6
        Resource:  pods
        UID:       cb3cb1db-e62a-4961-9967-cdc7d599105b
    Events:        <none>
    
  3. 如要取得已部署工作負載的記錄,請執行下列指令:

    kubectl logs deployment/dra-gpu-example --all-pods=true | grep "GPU"
    

    輸出應會如下所示:

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

    這些步驟的輸出內容會顯示 GKE 將一個 GPU 分配給 Pod。

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。

後續步驟