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

動態資源分配是一項 Kubernetes API,可讓您在 Google Distributed Cloud 裸機叢集的 Pod 和容器之間,要求及共用 GPU 等資源。這些裝置由第三方驅動程式管理,Kubernetes 則會動態分配,就像儲存空間磁碟區一樣。AI 工作負載不需指定特定節點,或要求確切數量的連接裝置。本文說明如何設定 GPU 工作負載,以使用動態資源分配功能。

事前準備

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

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

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

如要讓 GPU 工作負載利用動態資源分配功能要求 GPU,工作負載必須位於共用命名空間,且該命名空間須有 ResourceClaim,用於描述 GPU 裝置分配要求。工作負載必須參照 ResourceClaim,Kubernetes 才能指派 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-claim 的 ResourceClaim。pod1 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 運算子版本,Container Device Interface (CDI) 會自動處理裝置插入和 SELinux 標籤。您不必手動設定 SELinux 政策或設定 Pod securityContext。

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

後續步驟