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

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

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

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

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

事前準備

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

建立使用動態資源配置的 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-claimResourceClaim。Pod 中的容器是 NVIDIA 計算統一設備架構 (CUDA) 範例,專門用於在 GPU 上執行 CUDA 工作負載。pod1如果 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. 下載並安裝 SELinux 政策模組 nvidia_container_t,這是存取 GPU 的必要條件。

      詳情請參閱 NVIDIA dgx-selinux 存放區。

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

      cat <<EOF | kubectl apply --kubeconfig=CLUSTER_KUBECONFIG -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: pod1
        namespace: dra-test
      spec:
        restartPolicy: OnFailure
        securityContext:
          seLinuxOptions:
            type: nvidia_container_t
        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 時,SELinux 政策可能會干擾嘗試存取 GPU 的容器。詳情請參閱「How to use GPUs in containers on bare metal RHEL 8」(如何在裸機 RHEL 8 上使用容器中的 GPU)。

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

後續步驟