Menyiapkan infrastruktur GKE untuk workload DRA


Halaman ini menjelaskan cara menyiapkan infrastruktur Google Kubernetes Engine (GKE) untuk mendukung alokasi resource dinamis (DRA). Di halaman ini, Anda akan membuat cluster yang dapat men-deploy workload GPU atau TPU, dan menginstal driver yang diperlukan secara manual untuk mengaktifkan DRA.

Halaman ini ditujukan untuk administrator platform yang ingin mengurangi kompleksitas dan overhead penyiapan infrastruktur dengan perangkat hardware khusus.

Tentang DRA

DRA adalah fitur Kubernetes bawaan yang memungkinkan Anda secara fleksibel meminta, mengalokasikan, dan membagikan hardware di cluster Anda di antara Pod dan container. Untuk mengetahui informasi selengkapnya, lihat Tentang alokasi resource dinamis.

Batasan

  • Penyediaan otomatis node tidak didukung.
  • Cluster Autopilot tidak mendukung DRA.
  • Anda tidak dapat menggunakan fitur berbagi GPU berikut:
    • GPU berbagi waktu
    • GPU multi-instance
    • Layanan Multi-proses (MPS)

Persyaratan

Untuk menggunakan DRA, versi GKE Anda harus versi 1.32.1-gke.1489001 atau yang lebih baru.

Anda juga harus memahami persyaratan dan batasan berikut, bergantung pada jenis hardware yang ingin Anda gunakan:

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.
  • Jika Anda tidak menggunakan Cloud Shell, instal 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
    

Membuat cluster Standar GKE

Buat cluster mode Standard yang mengaktifkan API beta Kubernetes untuk DRA:

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"

Ganti kode berikut:

  • CLUSTER_NAME: nama untuk cluster Anda.
  • CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona.
  • GKE_VERSION: versi GKE yang akan digunakan untuk cluster dan node. Harus 1.32.1-gke.1489001 atau yang lebih baru.
  • PROJECT_ID: project ID Anda.

Menyiapkan lingkungan GKE untuk mendukung DRA

Di GKE, Anda dapat menggunakan DRA dengan GPU dan TPU. Saat membuat node pool, Anda harus menggunakan setelan berikut yang kompatibel dengan DRA selama Pratinjau:

  • Untuk GPU, nonaktifkan penginstalan driver GPU otomatis.
  • Tambahkan cakupan akses yang diperlukan untuk node.
  • Tambahkan label node untuk menjalankan hanya beban kerja DRA di node.
  • Aktifkan penskalaan otomatis cluster.

Semua setelan konfigurasi node pool lainnya, seperti jenis mesin, jenis akselerator, jumlah, sistem operasi node, dan lokasi node bergantung pada persyaratan Anda.

Menyiapkan lingkungan Anda untuk GPU

  1. Buat node pool dengan hardware yang diperlukan:

    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
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster Anda.
    • CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona. Pastikan lokasi yang dipilih berada di region yang sama dengan tempat GPU yang Anda tentukan tersedia.
    • ZONE: zona tempat GPU yang Anda tentukan tersedia.
  2. Instal driver secara manual di node Container-Optimized OS atau Ubuntu. Untuk mengetahui petunjuk mendetail, lihat Menginstal driver GPU NVIDIA secara manual.

    • Jika menggunakan COS, jalankan perintah berikut untuk men-deploy DaemonSet penginstalan dan menginstal versi driver GPU default:

      kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/container-engine-accelerators/master/nvidia-driver-installer/cos/daemonset-preloaded.yaml
      
    • Jika menggunakan Ubuntu, DaemonSet penginstalan yang Anda deploy bergantung pada jenis GPU dan versi node GKE seperti yang dijelaskan di bagian petunjuk Ubuntu.

  3. Tarik dan perbarui diagram Helm yang berisi operator GPU:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
        && helm repo update
    
  4. Buat namespace untuk operator GPU:

    kubectl create namespace gpu-operator
    
  5. Buat ResourceQuota di namespace gpu-operator. ResourceQuota memungkinkan operator GPU men-deploy Pod yang memiliki prioritas yang sama dengan Pod sistem Kubernetes.

    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. Instal operator GPU dengan skrip Helm:

    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
    

Menyiapkan lingkungan untuk TPU

Buat node pool yang menggunakan TPU. Contoh berikut membuat node pool 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

Ganti kode berikut: * NODEPOOL_NAME: nama untuk node pool Anda. * CLUSTER_NAME: nama cluster Anda. * CONTROL_PLANE_LOCATION: lokasi Compute Engine bidang kontrol cluster Anda. Berikan region untuk cluster regional, atau zona untuk cluster zona.

Mengakses dan menginstal driver DRA

Bagian berikut menunjukkan cara menginstal driver DRA untuk GPU dan TPU. Driver DRA memungkinkan Kubernetes mengalokasikan perangkat terlampir secara dinamis ke workload. Anda dapat menginstal driver DRA untuk GPU dan TPU dengan diagram Helm yang disediakan. Untuk mendapatkan akses ke Helm chart, selesaikan langkah-langkah berikut:

  1. Clone repositori ai-on-gke untuk mengakses diagram Helm yang berisi driver DRA untuk GPU dan TPU:

    git clone https://github.com/GoogleCloudPlatform/ai-on-gke/common-infra.git
    
  2. Buka direktori yang berisi diagram:

    cd common-infra/common/charts
    

Menginstal driver DRA di GPU

Setelah Anda memiliki akses ke diagram Helm yang berisi driver DRA, instal driver DRA untuk GPU dengan menyelesaikan langkah berikut:

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

Menginstal driver DRA di TPU

Setelah Anda memiliki akses ke diagram Helm yang berisi driver, instal driver TPU dengan menyelesaikan langkah berikut:

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

Pastikan infrastruktur Anda siap untuk DRA

Pastikan ResourceSlice mencantumkan perangkat hardware yang Anda tambahkan:

kubectl get resourceslices -o yaml

Jika Anda menggunakan contoh di bagian sebelumnya, ResourceSlice akan menyerupai berikut, bergantung pada jenis hardware yang Anda gunakan:

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: ""

Langkah berikutnya