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 adalah ekstensi software Kubernetes yang memungkinkan pengguna membuat resource kustom yang mengelola aplikasi dan komponennya. Anda dapat menggunakan operator untuk mengotomatiskan tugas kompleks di luar yang disediakan Kubernetes itu sendiri, seperti men-deploy dan mengupgrade aplikasi.

Operator GPU NVIDIA adalah operator Kubernetes yang menyediakan infrastruktur dan API umum untuk men-deploy, mengonfigurasi, dan mengelola komponen software yang diperlukan untuk menyediakan GPU NVIDIA di cluster Kubernetes. Operator GPU NVIDIA memberi Anda pengalaman yang konsisten, menyederhanakan pengelolaan resource GPU, dan menyederhanakan integrasi beban kerja yang dipercepat GPU ke dalam Kubernetes.

Mengapa menggunakan Operator GPU NVIDIA?

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

Atau, Operator GPU NVIDIA mungkin merupakan opsi yang sesuai untuk Anda jika Anda mencari pengalaman yang konsisten di beberapa penyedia layanan cloud, Anda sudah menggunakan Operator GPU NVIDIA, atau jika Anda menggunakan software yang bergantung pada operator GPU NVIDIA.

Untuk pertimbangan lebih lanjut saat memutuskan antara opsi ini, lihat Mengelola stack GPU melalui GKE atau Operator GPU NVIDIA di GKE.

Batasan

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

  • Operator GPU NVIDIA didukung di GKE mulai dari Operator GPU versi 24.6.0 atau yang lebih baru.
  • Operator GPU NVIDIA tidak didukung di 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.
  • 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.
  • Pastikan Anda memenuhi persyaratan di Menjalankan GPU di node pool Standard.
  • Pastikan Anda telah menginstal Helm di lingkungan pengembangan. Helm sudah diinstal sebelumnya di Cloud Shell.

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

    helm version
    

    Jika output-nya mirip dengan Command helm not found, Anda dapat menginstal 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 node pool GPU

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

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

    • Tetapkan gpu-driver-version=disabled untuk melewati penginstalan driver GPU otomatis karena tidak didukung saat menggunakan operator GPU NVIDIA.
    • Tetapkan --node-labels="gke-no-default-nvidia-gpu-device-plugin=true" untuk 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 node pool.
    • GPU_TYPE: jenis akselerator GPU yang ingin Anda gunakan. Contohnya, nvidia-h100-80gb
    • AMOUNT: jumlah GPU yang akan dipasang ke node di node pool.

    Misalnya, perintah berikut membuat node pool GKE, a3nodepool, dengan GPU H100 di cluster zona a3-cluster. Dalam contoh ini, Daemonset plugin perangkat GPU GKE dan penginstalan driver otomatis 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 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 node pool Anda.
    • COMPUTE_REGION atau COMPUTE_ZONE: tentukan region atau zona cluster berdasarkan apakah cluster Anda merupakan cluster regional atau zona.

    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 yang berjalan di cluster ini.

  4. Buat namespace gpu-operator untuk Operator GPU NVIDIA dengan menjalankan perintah ini:

    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 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 dalam bagian Ubuntu dalam petunjuk.

  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, outputnya akan mirip dengan berikut:

    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 lebih lanjut, lihat dokumentasi NVIDIA tentang menginstal Operator GPU NVIDIA.

  1. Tambahkan repositori Helm NVIDIA:

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

    • Pastikan versi GPU Operator adalah 24.6.0 atau yang lebih baru.
    • Konfigurasikan jalur penginstalan driver di Operator GPU dengan hostPaths.driverInstallDir=/home/kubernetes/bin/nvidia.
    • Tetapkan jalur penginstalan toolkit toolkit.installDir=/home/kubernetes/bin/nvidia untuk COS dan Ubuntu. Di COS, direktori/home dapat ditulis dan berfungsi sebagai lokasi stateful untuk menyimpan biner runtime NVIDIA. Untuk mempelajari lebih lanjut, lihat Ringkasan disk dan sistem file COS.
    • Aktifkan Antarmuka Perangkat Penampung (CDI) di Operator GPU dengan cdi.enabled=true dan cdi.default=true karena 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 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 jumlah GPU dikonfigurasi dengan benar di kolom 'Allocatable' node, 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
      

      Kemudian, 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