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

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

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

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

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

事前準備

設定 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-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. 下載並安裝 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」。

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

後續步驟