Mengelola Stack GPU dengan Operator GPU NVIDIA di Google Kubernetes Engine (GKE)


Halaman ini membantu Anda memutuskan kapan harus menggunakan operator GPU NVIDIA dan menunjukkan cara mengaktifkan Operator GPU NVIDIA di GKE.

Ringkasan

Operator merupakan ekstensi software Kubernetes yang memungkinkan pengguna membuat resource yang mengelola aplikasi dan komponennya. Anda dapat menggunakan operator untuk mengotomatiskan tugas-tugas kompleks di luar fungsi yang disediakan Kubernetes, seperti men-deploy dan mengupgrade aplikasi.

Operator GPU NVIDIA adalah operator Kubernetes yang menyediakan dan API untuk men-deploy, mengonfigurasi, dan mengelola software komponen yang diperlukan untuk menyediakan GPU NVIDIA di cluster Kubernetes. NVIDIA Operator GPU memberikan pengalaman yang konsisten, menyederhanakan sumber daya GPU manajemen proyek, dan menyederhanakan integrasi beban kerja yang dipercepat oleh GPU ke dalam Kubernetes.

Mengapa menggunakan Operator GPU NVIDIA?

Sebaiknya gunakan pengelolaan GPU GKE untuk node GPU Anda, karena GKE mengelola sepenuhnya siklus proses node GPU. Untuk mulai menggunakan menggunakan GKE untuk mengelola node GPU Anda, pilih salah satu opsi berikut:

Atau, Operator GPU NVIDIA mungkin menjadi opsi yang cocok untuk Anda menginginkan pengalaman yang konsisten di beberapa layanan {i>cloud<i} penyedia lain, Anda sudah menggunakan Operator GPU NVIDIA, atau jika Anda menggunakan perangkat lunak yang tergantung pada operator GPU NVIDIA.

Untuk pertimbangan selengkapnya saat memutuskan di antara opsi tersebut, lihat Kelola stack GPU melalui GKE atau Operator GPU NVIDIA di GKE.

Batasan

Operator GPU NVIDIA didukung pada Container-Optimized OS (COS) dan image node Ubuntu dengan batasan berikut:

  • Operator GPU NVIDIA didukung di GKE yang dimulai dengan Operator GPU versi 24.6.0 atau yang lebih baru.
  • Operator GPU NVIDIA tidak didukung pada cluster Autopilot.
  • Operator GPU NVIDIA tidak didukung pada image node Windows.
  • Operator GPU NVIDIA tidak dikelola oleh GKE. Untuk mengupgrade Operator GPU NVIDIA, lihat dokumentasi NVIDIA.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Mengaktifkan 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.
  • Pastikan Anda memenuhi persyaratan dalam Jalankan GPU di kumpulan node standar.
  • Pastikan Anda telah menginstal Helm di lingkungan pengembangan. Helm sudah terinstal di Cloud Shell.

    Meskipun tidak ada persyaratan versi Helm khusus, Anda dapat menggunakan perintah berikut untuk memverifikasi bahwa Anda telah menginstal Helm.

    helm version
    

    Jika output mirip dengan Command helm not found, Anda dapat instal Helm CLI dengan menjalankan perintah ini:

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

Membuat dan menyiapkan kumpulan node GPU

Untuk membuat dan menyiapkan kumpulan node GPU, ikuti langkah-langkah berikut:

  1. Buat kumpulan node GPU dengan mengikuti petunjuk cara Membuat kumpulan node GPU dengan modifikasi berikut:

    • Setel gpu-driver-version=disabled untuk melewati driver GPU otomatis karena tidak didukung saat menggunakan operator GPU NVIDIA.
    • Setel --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" hingga menonaktifkan Daemonset plugin perangkat GPU yang dikelola GKE.

    Jalankan perintah berikut dan tambahkan flag lain untuk pembuatan node pool GPU sesuai kebutuhan:

    gcloud container node-pools create POOL_NAME \
      --accelerator type=GPU_TYPE,count=AMOUNT,gpu-driver-version=disabled \
      --node-labels="gke-no-default-nvidia-gpu-device-plugin=true"
    

    Ganti kode berikut:

    • POOL_NAME nama yang Anda pilih untuk kumpulan node.
    • GPU_TYPE: jenis akselerator GPU yang yang ingin Anda gunakan. Contohnya, nvidia-h100-80gb
    • AMOUNT: jumlah GPU yang akan dipasang ke node di kumpulan node.

    Misalnya, perintah berikut akan membuat node pool GKE, a3nodepool, dengan GPU H100 di cluster zona a3-cluster. Di sini misalnya, Daemonset plugin perangkat GPU GKE dan penginstalan {i>driver<i} dinonaktifkan.

    gcloud container node-pools create a3nodepool \
      --region=us-central1 --cluster=a3-cluster \
      --node-locations=us-central1-a \
      --accelerator=type=nvidia-h100-80gb,count=8,gpu-driver-version=disabled \
      --machine-type=a3-highgpu-8g \
      --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" \
      --num-nodes=1
    
  2. Dapatkan kredensial autentikasi untuk cluster dengan menjalankan perintah perintah berikut:

    USE_GKE_GCLOUD_AUTH_PLUGIN=True \
    gcloud container clusters get-credentials CLUSTER_NAME [--zone COMPUTE_ZONE] [--region COMPUTE_REGION]
    

    Ganti kode berikut:

    • CLUSTER_NAME: nama cluster yang berisi kumpulan node Anda.
    • COMPUTE_REGION atau COMPUTE_ZONE: menentukan region atau zona cluster berdasarkan apakah cluster Anda merupakan cluster regional atau zona, secara berurutan.

    Outputnya mirip dengan hal berikut ini:

    Fetching cluster endpoint and auth data.
    kubeconfig entry generated for CLUSTER_NAME.
    
  3. (Opsional) Pastikan Anda dapat terhubung ke cluster.

    kubectl get nodes -o wide
    

    Anda akan melihat daftar semua node Anda yang berjalan di cluster ini.

  4. Membuat namespace gpu-operator untuk Operator GPU NVIDIA dengan menjalankan perintah berikut:

    kubectl create ns gpu-operator
    

    Outputnya mirip dengan hal berikut ini:

    namespace/gpu-operator created
    
  5. Buat kuota resource di namespace gpu-operator dengan menjalankan perintah ini:

    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
    

    Outputnya mirip dengan hal berikut ini:

    resourcequota/gpu-operator-quota created
    
  6. Lihat kuota resource untuk namespace gpu-operator:

    kubectl get -n gpu-operator resourcequota gpu-operator-quota
    

    Outputnya mirip dengan hal berikut ini:

    NAME                 AGE     REQUEST       LIMIT
    gpu-operator-quota   2m27s   pods: 0/100
    
  7. Instal driver secara manual di Container-Optimized OS atau Ubuntu. Untuk petunjuk terperinci, lihat Instal driver GPU NVIDIA secara manual.

    • Jika menggunakan COS, jalankan perintah berikut untuk men-deploy penginstalan DaemonSet, lalu instal 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 GPU jenis dan versi node GKE sebagaimana dijelaskan dalam Bagian petunjuk Ubuntu.

  8. Verifikasi versi driver GPU dengan menjalankan perintah ini:

    kubectl logs -l k8s-app=nvidia-driver-installer  \
      -c "nvidia-driver-installer" --tail=-1 -n kube-system
    

    Jika penginstalan driver GPU berhasil, output-nya mirip dengan berikut ini:

    I0716 03:17:38.863927    6293 cache.go:66] DRIVER_VERSION=535.183.01
    …
    I0716 03:17:38.863955    6293 installer.go:58] Verifying GPU driver installation
    I0716 03:17:41.534387    6293 install.go:543] Finished installing the drivers.
    

Menginstal Operator GPU NVIDIA

Bagian ini menunjukkan cara menginstal Operator GPU NVIDIA menggunakan Helm. Untuk mempelajari selengkapnya, lihat dokumentasi NVIDIA tentang menginstal Operator GPU NVIDIA.

  1. Tambahkan repositori NVIDIA Helm:

    helm repo add nvidia https://helm.ngc.nvidia.com/nvidia \
      && helm repo update
    
  2. Instal Operator GPU NVIDIA menggunakan Helm dengan kode berikut opsi konfigurasi:

    • Pastikan versi Operator GPU adalah 24.6.0 atau yang lebih baru.
    • Konfigurasikan jalur penginstalan driver di Operator GPU dengan hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia.
    • Menetapkan jalur penginstalan toolkit toolkit.installDir=/home/kubernetes/bin/nvidia untuk COS dan Ubuntu. Dalam COS, direktori /home dapat ditulis dan berfungsi sebagai stateful untuk menyimpan biner {i>runtime<i} NVIDIA. Untuk mempelajari lebih lanjut, lihat ke Ringkasan sistem file dan disk COS.
    • Aktifkan Container Device Interface (CDI) di Operator GPU dengan cdi.enabled=true dan cdi.default=true sebagai mode lama tidak didukung. CDI diperlukan untuk COS dan Ubuntu di GKE.
    helm install --wait --generate-name \
      -n gpu-operator \
      nvidia/gpu-operator \
      --set hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia \
      --set toolkit.installDir=/home/kubernetes/bin/nvidia \
      --set cdi.enabled=true \
      --set cdi.default=true \
      --set driver.enabled=false
    

    Untuk mempelajari setelan ini lebih lanjut, lihat Opsi Penyesuaian Diagram Umum dan Skenario Deployment Umum dalam dokumentasi NVIDIA.

  3. Pastikan operator GPU NVIDIA berhasil diinstal.

    1. Untuk memeriksa apakah operand Operator GPU berjalan dengan benar, jalankan metode perintah berikut.

      kubectl get pods -n gpu-operator
      

      Outputnya terlihat mirip dengan yang berikut ini:

      NAME                                                          READY    STATUS
      RESTARTS   AGE
      gpu-operator-5c7cf8b4f6-bx4rg                                 1/1      Running   0          11m
      gpu-operator-node-feature-discovery-gc-79d6d968bb-g7gv9       1/1      Running   0          11m
      gpu-operator-node-feature-discovery-master-6d9f8d497c-thhlz   1/1      Running   0          11m
      gpu-operator-node-feature-discovery-worker-wn79l              1/1      Running   0          11m
      gpu-feature-discovery-fs9gw                                   1/1      Running   0          8m14s
      gpu-operator-node-feature-discovery-worker-bdqnv              1/1      Running   0          9m5s
      nvidia-container-toolkit-daemonset-vr8fv                      1/1      Running   0          8m15s
      nvidia-cuda-validator-4nljj                                   0/1      Completed 0          2m24s
      nvidia-dcgm-exporter-4mjvh                                    1/1      Running   0          8m15s
      nvidia-device-plugin-daemonset-jfbcj                          1/1      Running   0          8m15s
      nvidia-mig-manager-kzncr                                      1/1      Running   0          2m5s
      nvidia-operator-validator-fcrr6                               1/1      Running   0          8m15s
      
    2. Untuk memeriksa apakah hitungan GPU dikonfigurasi dengan benar di antarmuka 'Dapat dialokasikan' , jalankan perintah berikut:

      kubectl describe node GPU_NODE_NAME | grep Allocatable -A7
      

      Ganti GPU_NODE_NAME dengan nama node yang memiliki GPU.

      Outputnya mirip dengan hal berikut ini:

      Allocatable:
      cpu:                11900m
      ephemeral-storage:  47060071478
      hugepages-1Gi:      0
      hugepages-2Mi:      0
      memory:             80403000Ki
      nvidia.com/gpu:     1           # showing correct count of GPU associated with the nods
      pods:               110
      
    3. Untuk memeriksa apakah beban kerja GPU berjalan dengan benar, Anda dapat menggunakan alat cuda-vectoradd:

      cat << EOF | kubectl create -f -
      apiVersion: v1
      kind: Pod
      metadata:
        name: cuda-vectoradd
      spec:
        restartPolicy: OnFailure
        containers:
        - name: vectoradd
          image: nvidia/samples:vectoradd-cuda11.2.1
          resources:
            limits:
              nvidia.com/gpu: 1
      EOF
      

      Lalu, jalankan perintah berikut:

      kubectl logs cuda-vectoradd
      

      Outputnya mirip dengan hal berikut ini:

      [Vector addition of 50000 elements]
      Copy input data from the host memory to the CUDA device
      CUDA kernel launch with 196 blocks of 256 threads
      Copy output data from the CUDA device to the host memory
      Test PASSED
      Done
      

Langkah selanjutnya