為 DRA 工作負載準備 GKE 基礎架構


本頁說明如何設定 Google Kubernetes Engine (GKE) 基礎架構,以支援動態資源分配 (DRA)。您可以在這個頁面建立叢集,部署 GPU 或 TPU 工作負載,並手動安裝啟用 DRA 所需的驅動程式。

本頁適用於平台管理員,他們希望減少使用專用硬體裝置設定基礎架構的複雜度和額外負擔。

關於 DRA

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

限制

  • 不支援節點自動佈建。
  • 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,取得最新版本。
  • 如果您未使用 Cloud Shell,請安裝 Helm CLI:

    curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
    chmod 700 get_helm.sh
    ./get_helm.sh
    

建立 GKE Standard 叢集

建立 Standard 模式叢集,啟用 DRA 的 Kubernetes Beta 版 API:

gcloud container clusters create CLUSTER_NAME \
    --quiet \
    --enable-kubernetes-unstable-apis="resource.k8s.io/v1beta1/deviceclasses,resource.k8s.io/v1beta1/resourceclaims,resource.k8s.io/v1beta1/resourceclaimtemplates,resource.k8s.io/v1beta1/resourceslices" \
    --release-channel=rapid \
    --enable-autoupgrade \
    --location CONTROL_PLANE_LOCATION \
    --num-nodes "1" \
    --cluster-version GKE_VERSION \
    --workload-pool="PROJECT_ID.svc.id.goog"

更改下列內容:

  • CLUSTER_NAME:叢集名稱。
  • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。
  • GKE_VERSION:用於叢集和節點的 GKE 版本。必須為 1.32.1-gke.1489001 以上版本。
  • PROJECT_ID:您的專案 ID。

準備 GKE 環境以支援 DRA

在 GKE 中,您可以將 DRA 與 GPU 和 TPU 搭配使用。建立節點集區時,必須使用下列設定,才能在預先發布版期間搭配 DRA 使用:

  • 如果是 GPU,請停用自動安裝 GPU 驅動程式。
  • 為節點新增必要的存取範圍。
  • 新增節點標籤,確保節點只執行 DRA 工作負載。
  • 啟用叢集自動調度資源功能。

其他節點集區設定 (例如機器類型、加速器類型、數量、節點作業系統和節點位置) 則取決於您的需求。

準備 GPU 環境

  1. 建立具有所需硬體的節點集區:

    gcloud beta container node-pools create "gpu-pool" \
        --quiet \
        --project PROJECT_ID \
        --cluster CLUSTER_NAME \
        --location CONTROL_PLANE_LOCATION \
        --node-version KUBERNETES_VERSION \
        --machine-type "n1-standard-8" \
        --accelerator "type=nvidia-tesla-t4,count=2,gpu-driver-version=disabled" \
        --image-type "UBUNTU_CONTAINERD" \
        --disk-type "pd-standard" \
        --disk-size "100" \
        --scopes "https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write","https://www.googleapis.com/auth/monitoring","https://www.googleapis.com/auth/servicecontrol","https://www.googleapis.com/auth/service.management.readonly","https://www.googleapis.com/auth/trace.append" \
        --num-nodes "1" \
        --enable-autoscaling \
        --min-nodes "1" \
        --max-nodes "6" \
        --location-policy "ANY" \
        --max-surge-upgrade 1 \
        --max-unavailable-upgrade 0 \
        --node-locations ZONE \
        --node-labels=gke-no-default-nvidia-gpu-device-plugin=true,nvidia.com/gpu.present=true
    

    更改下列內容:

    • CLUSTER_NAME:叢集名稱。
    • CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。請確認所選位置與您指定的 GPU 位於相同區域。
    • ZONE:提供您指定 GPU 的區域。
  2. 在 Container-Optimized OS 或 Ubuntu 節點上,手動安裝驅動程式。如需詳細操作說明,請參閱「手動安裝 NVIDIA GPU 驅動程式」。

    • 如果使用 COS,請執行下列指令來部署安裝 DaemonSet,並安裝預設的 GPU 驅動程式版本:

      kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
      
    • 如果使用 Ubuntu,您部署的安裝 DaemonSet 會依據 GPU 類型和 GKE 節點版本而異,詳情請參閱操作說明的 Ubuntu 專區

  3. 提取並更新包含 GPU 運算子的 Helm Chart:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  4. 為 GPU 運算子建立命名空間:

    kubectl create namespace gpu-operator
    
  5. gpu-operator 命名空間中建立 ResourceQuota。ResourceQuota 可讓 GPU 運算子部署與 Kubernetes 系統 Pod 具有相同優先順序的 Pod。

    kubectl apply -n gpu-operator -f - << EOF
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: gpu-operator-quota
    spec:
      hard:
        pods: 100
      scopeSelector:
        matchExpressions:
        - operator: In
          scopeName: PriorityClass
          values:
            - system-node-critical
            - system-cluster-critical
    EOF
    
  6. 使用 Helm 指令碼安裝 GPU 運算子:

    helm install --wait --generate-name -n gpu-operator nvidia/gpu-operator \
        --set driver.enabled=false \
        --set operator.repository=ghcr.io/nvidia \
        --set operator.version=6171a52d \
        --set validator.repository=ghcr.io/nvidia/gpu-operator \
        --set validator.version=6171a52d \
        --set toolkit.repository=ghcr.io/nvidia \
        --set toolkit.version=5d9b27f1-ubuntu20.04 \
        --set gfd.repository=ghcr.io/nvidia \
        --set gfd.version=f171c926-ubi9 \
        --set cdi.enabled=true \
        --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \
        --set toolkit.installDir=/home/kubernetes/bin/nvidia
    

準備 TPU 環境

建立使用 TPU 的節點集區。以下範例會建立 TPU Trillium 節點集區:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster CLUSTER_NAME --num-nodes 1 \
    --location CONTROL_PLANE_LOCATION \
    --node-labels "gke-no-default-tpu-device-plugin=true,gke-no-default-tpu-dra-plugin=true" \
    --machine-type=ct6e-standard-8t \
    --enable-autoupgrade

請替換下列項目: * NODEPOOL_NAME:節點集區的名稱。 * CLUSTER_NAME:叢集名稱。 * CONTROL_PLANE_LOCATION:叢集控制層的 Compute Engine 位置。為地區叢集提供地區,或為區域叢集提供區域。

存取及安裝 DRA 驅動程式

下列各節說明如何安裝 GPU 和 TPU 的 DRA 驅動程式。DRA 驅動程式可讓 Kubernetes 動態將附加裝置分配給工作負載。您可以使用提供的 Helm 資訊套件,為 GPU 和 TPU 安裝 DRA 驅動程式。如要存取 Helm 資訊圖表,請完成下列步驟:

  1. 複製 ai-on-gke 存放區,存取包含 GPU 和 TPU 適用的 DRA 驅動程式的 Helm 資訊圖表:

    git clone https://github.com/GoogleCloudPlatform/ai-on-gke/common-infra.git
    
  2. 前往內含圖表的目錄:

    cd common-infra/common/charts
    

在 GPU 上安裝 DRA 驅動程式

取得包含 DRA 驅動程式的 Helm 圖表後,請完成下列步驟,安裝 GPU 的 DRA 驅動程式:

COS

helm upgrade -i --create-namespace --namespace nvidia nvidia-dra-driver-gpu nvidia-dra-driver-gpu/ \
    --set image.repository=ghcr.io/nvidia/k8s-dra-driver-gpu \
    --set image.tag=d1fad7ed-ubi9 \
    --set image.pullPolicy=Always \
    --set controller.priorityClassName="" \
    --set kubeletPlugin.priorityClassName="" \
    --set nvidiaDriverRoot="/home/kubernetes/bin/nvidia/" \
    --set nvidiaCtkPath=/home/kubernetes/bin/nvidia/toolkit/nvidia-ctk \
    --set deviceClasses="{gpu}" \
    --set gpuResourcesEnabledOverride=true \
    --set resources.computeDomains.enabled=false \
    --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
    --set kubeletPlugin.tolerations[0].operator=Exists \
    --set kubeletPlugin.tolerations[0].effect=NoSchedule \
    --set kubeletPlugin.tolerations[1].key=cloud.google.com/compute-class \
    --set kubeletPlugin.tolerations[1].operator=Exists \
    --set kubeletPlugin.tolerations[1].effect=NoSchedule

Ubuntu

helm upgrade -i --create-namespace --namespace nvidia nvidia-dra-driver-gpu nvidia-dra-driver-gpu/ \
    --set image.repository=ghcr.io/nvidia/k8s-dra-driver-gpu \
    --set image.tag=d1fad7ed-ubi9 \
    --set image.pullPolicy=Always \
    --set controller.priorityClassName="" \
    --set kubeletPlugin.priorityClassName="" \
    --set nvidiaDriverRoot="/opt/nvidia" \
    --set nvidiaCtkPath=/home/kubernetes/bin/nvidia/toolkit/nvidia-ctk \
    --set deviceClasses="{gpu}" \
    --set gpuResourcesEnabledOverride=true \
    --set resources.computeDomains.enabled=false \
    --set kubeletPlugin.tolerations[0].key=nvidia.com/gpu \
    --set kubeletPlugin.tolerations[0].operator=Exists \
    --set kubeletPlugin.tolerations[0].effect=NoSchedule \
    --set kubeletPlugin.tolerations[1].key=cloud.google.com/compute-class \
    --set kubeletPlugin.tolerations[1].operator=Exists \
    --set kubeletPlugin.tolerations[1].effect=NoSchedule

在 TPU 上安裝 DRA 驅動程式

取得包含驅動程式的 Helm 圖表後,請完成下列步驟來安裝 TPU 驅動程式:

./tpu-dra-driver/install-tpu-dra-driver.sh

確認基礎架構已準備好支援 DRA

確認 ResourceSlice 列出您新增的硬體裝置:

kubectl get resourceslices -o yaml

如果您使用前一節的範例,ResourceSlice 會類似下列內容,具體取決於您使用的硬體類型:

GPU

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          architecture:
            string: Turing
          brand:
            string: Nvidia
          cudaComputeCapability:
            version: 7.5.0
          cudaDriverVersion:
            version: 12.2.0
          driverVersion:
            version: 535.230.2
          index:
            int: 0
          minor:
            int: 0
          productName:
            string: Tesla T4
          type:
            string: gpu
          uuid:
            string: GPU-2087ac7a-f781-8cd7-eb6b-b00943cc13ef
        capacity:
          memory:
            value: 15Gi
      name: gpu-0

TPU

apiVersion: v1
items:
- apiVersion: resource.k8s.io/v1beta1
  kind: ResourceSlice
  metadata:
    # lines omitted for clarity
  spec:
    devices:
    - basic:
        attributes:
          index:
            int: 0
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "0"
    - basic:
        attributes:
          index:
            int: 1
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "1"
    - basic:
        attributes:
          index:
            int: 2
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "2"
    - basic:
        attributes:
          index:
            int: 3
          tpuGen:
            string: v6e
          uuid:
            string: tpu-54de4859-dd8d-f67e-6f91-cf904d965454
      name: "3"
    driver: tpu.google.com
    nodeName: gke-tpu-b4d4b61b-fwbg
    pool:
      generation: 1
      name: gke-tpu-b4d4b61b-fwbg
      resourceSliceCount: 1
kind: List
metadata:
  resourceVersion: ""

後續步驟