透過動態資源分配管理 GPU 裝置

本頁說明如何設定 GPU 工作負載,以便在 Google Distributed Cloud Bare Metal 叢集中使用動態資源分配功能。動態資源分配是 Kubernetes API,可讓您在 Pod 和容器之間要求及共用 GPU 等一般資源。這些資源是由第三方驅動程式管理。

透過動態資源分配,Kubernetes 會根據參照的裝置設定排程 Pod。應用程式運算子不需要在工作負載中選取特定節點,也不需要確保每個 Pod 要求的裝置數量與這些節點附加的裝置數量完全相同。這項程序與分配儲存空間的磁碟區類似。

這項功能可動態且精確地分配裸機叢集內的 GPU 資源,協助您執行 AI 工作負載,進而提升資源用量和高需求工作負載的效能。

本文適用於管理基礎技術架構生命週期的管理員、架構師和營運人員。如要進一步瞭解內容中提及的常見角色和範例工作,請參閱「常見的 GKE 使用者角色和工作」。 Google Cloud

事前準備

設定 GPU 工作負載以使用動態資源分配功能前,請確認符合下列必要條件:

  • 裸機叢集為 1.33.0 以上版本。
  • 作業系統為 Ubuntu 22.04 或 Red Hat Enterprise Linux (RHEL) 9.4。
  • 您已更新叢集,啟用動態資源分配功能,如「啟用動態資源分配」一文所述。
  • 您至少有一部節點機器連接 GPU,並已安裝 NVIDIA GPU 驅動程式。詳情請參閱「安裝或解除安裝隨附的 NVIDIA GPU 運算子」。
  • 如果您使用隨附的 NVIDIA GPU 運算子,1.33.0 以上版本會預設啟用 Container Device Interface (CDI)。如果您使用手動安裝的 GPU 運算子,請確保 ClusterPolicy 中已啟用 CDI。
  • 您已按照「GPU 專用的 NVIDIA DRA 驅動程式」中的操作說明,在所有已連結 GPU 的節點上安裝 NVIDIA DRA 驅動程式。

建立使用動態資源配置的 GPU 工作負載

如要讓 GPU 工作負載利用動態資源分配功能要求 GPU,工作負載必須與 ResourceClaim 位於共用命名空間,且 ResourceClaim 說明 GPU 裝置分配要求。工作負載必須參照 Kubernetes 的 ResourceClaim,才能指派 GPU 資源。

下列步驟會設定環境,讓工作負載使用動態資源分配功能要求 GPU 資源:

  1. 如要建立與動態資源分配相關的資源,請在叢集中建立新的 Namespace

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: NAMESPACE_NAME
    EOF
    

    更改下列內容:

    • CLUSTER_KUBECONFIG:使用者叢集 kubeconfig 檔案的路徑。

    • NAMESPACE_NAME 替換為動態資源分配命名空間的名稱。

  2. 建立 ResourceClaim,說明 GPU 存取權要求:

    cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
    apiVersion: resource.k8s.io/v1beta1
    kind: ResourceClaim
    metadata:
      namespace: NAMESPACE_NAME
      name: RESOURCE_CLAIM_NAME
    spec:
        devices:
          requests:
          - name: gpu
            deviceClassName: gpu.nvidia.com
    EOF
    

    RESOURCE_CLAIM_NAME 替換為 GPU 要求的資源聲明名稱。

  3. 建立參照上一個步驟中建立的 ResourceClaim 的工作負載。

    下列工作負載範例說明如何在 dra-test 命名空間中,參照名為 gpu-claimResourceClaimpod1 Pod 中的容器是 NVIDIA 計算統一設備架構 (CUDA) 範例, 用於在 GPU 上執行 CUDA 工作負載。如果 pod1 Pod 順利完成,表示動態資源分配功能運作正常,且動態資源分配功能已準備好管理叢集中的 GPU 資源。

    Ubuntu

    1. 使用下列指令將資訊清單套用至叢集:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

    RHEL

    1. 使用下列指令將資訊清單套用至叢集:

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
      
        resourceClaims:
          - name: gpu
            resourceClaimName: gpu-claim
        containers:
          - name: ctr0
            image: nvcr.io/nvidia/k8s/cuda-sample:vectoradd-cuda12.5.0
            resources:
              claims:
                - name: gpu
          - name: ctr1
            image: nvcr.io/nvidia/k8s/cuda-sample:devicequery
            resources:
              claims:
                - name: gpu
      EOF
      

限制

使用動態資源分配時,請注意下列限制:

  • 使用 RHEL OS 和支援版本的 NVIDIA GPU 運算子時,容器裝置介面 (CDI) 會自動處理裝置插入和 SELinux 標籤作業。您不需要使用手動 SELinux 政策設定或設定 Pod securityContext

  • 這項功能使用 resource.k8s.io/v1beta1 API 群組,與這項功能的 Kubernetes 開放原始碼 API 群組 resource.k8s.io/v1 不同。v1 開放原始碼 API 群組提供的功能更多,穩定性也優於 v1beta1 API 群組。

後續步驟