Berbagi GPU dengan beberapa workload menggunakan NVIDIA MPS


Halaman ini menunjukkan cara menggunakan Multi-Process Service (MPS) CUDA untuk memungkinkan beberapa beban kerja untuk berbagi satu akselerator hardware GPU NVIDIA di node Google Kubernetes Engine (GKE) Anda.

Ringkasan

NVIDIA MPS adalah solusi berbagi GPU yang memungkinkan beberapa container untuk berbagi satu hardware GPU NVIDIA fisik yang terpasang ke sebuah node.

NVIDIA MPS mengandalkan Multi-Process Service NVIDIA di CUDA. NVIDIA MPS adalah implementasi alternatif yang kompatibel dengan biner dari CUDA API yang dirancang untuk memungkinkan aplikasi CUDA multiproses yang bekerja sama secara transparan agar berjalan secara serentak pada satu perangkat GPU.

Dengan NVIDIA MPS, Anda dapat menentukan container bersama maksimum dari GPU fisik. Nilai ini menentukan jumlah daya GPU fisik yang didapatkan setiap container, dalam hal karakteristik berikut:

Untuk mempelajari lebih lanjut cara GPU dijadwalkan dengan NVIDIA MPS, kapan Anda harus menggunakan CUDA MPS, lihat Tentang solusi berbagi GPU di GKE.

Siapa sasaran pengguna panduan ini

Petunjuk di bagian ini berlaku untuk Anda jika Anda adalah salah satu dari yang berikut:

  • Administrator platform: Membuat dan mengelola cluster GKE, merencanakan persyaratan infrastruktur dan resource, serta memantau performa cluster.
  • Developer aplikasi: Mendesain dan men-deploy workload di cluster GKE. Jika Anda menginginkan petunjuk untuk meminta NVIDIA MPS dengan GPU, lihat Men-deploy beban kerja yang menggunakan NVIDIA MPS dengan GPU.

Persyaratan

  • Versi GKE: Anda dapat mengaktifkan berbagi GPU dengan NVIDIA MPS di cluster GKE Standard yang menjalankan GKE versi 1.27.7-gke.1088000 dan yang lebih baru.
  • GPU type: Anda dapat mengaktifkan NVIDIA MPS untuk semua jenis GPU NVIDIA Tesla®.

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 initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengaktifkan NVIDIA MPS dengan GPU di cluster GKE

Sebagai administrator platform, Anda harus mengaktifkan NVIDIA MPS dengan GPU di cluster GKE Standard. Kemudian, developer aplikasi dapat men-deploy workload untuk menggunakan NVIDIA MPS dengan GPU. Untuk mengaktifkan NVIDIA MPS dengan GPU di GKE, lakukan hal berikut:

  1. Aktifkan NVIDIA MPS dengan GPU di cluster GKE baru.
  2. Instal driver perangkat GPU NVIDIA (jika diperlukan).
  3. Verifikasi resource GPU yang tersedia di node Anda.

Mengaktifkan NVIDIA MPS dengan GPU di cluster GKE

Anda dapat mengaktifkan NVIDIA MPS dengan GPU saat membuat cluster GKE Standard. Node pool default di cluster telah mengaktifkan fitur tersebut. Anda masih harus mengaktifkan NVIDIA MPS dengan GPU saat membuat kumpulan node baru secara manual di cluster tersebut.

Buat cluster dengan NVIDIA MPS yang diaktifkan menggunakan Google Cloud CLI:

gcloud container clusters create CLUSTER_NAME \
    --region=COMPUTE_REGION \
    --cluster-version=CLUSTER_VERSION \
    --machine-type=MACHINE_TYPE \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=mps,max-shared-clients-per-gpu=CLIENTS_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster baru.
  • COMPUTE_REGION: region Compute Engine untuk cluster baru Anda. Untuk cluster zona, tentukan --zone=COMPUTE_ZONE. Jenis GPU yang Anda gunakan harus tersedia di zona yang dipilih.
  • CLUSTER_VERSION: versi GKE untuk bidang kontrol dan node cluster. Gunakan GKE versi 1.27.7-gke.1088000 atau yang lebih baru. Atau, tentukan saluran rilis dengan versi GKE tersebut menggunakan flag --release-channel=RELEASE_CHANNEL.
  • MACHINE_TYPE: Jenis mesin Compute Engine untuk node Anda.
  • GPU_TYPE: jenis GPU yang harus berupa platform GPU Tesla NVIDIA seperti nvidia-tesla-v100.
  • GPU_QUANTITY: jumlah GPU fisik yang akan dipasang ke setiap node di node pool default.
  • CLIENTS_PER_GPU: jumlah maksimum container yang dapat membagikan setiap GPU fisik.
  • DRIVER_VERSION: versi driver NVIDIA yang akan diinstal. Dapat berupa salah satu dari hal berikut:
    • default: Menginstal versi driver default untuk versi GKE Anda.
    • latest: Instal versi driver terbaru yang tersedia untuk versi GKE Anda. Hanya tersedia untuk node yang menggunakan Container-Optimized OS.
    • disabled: Melewati penginstalan driver otomatis. Anda harus menginstal driver secara manual setelah membuat node pool. Jika Anda menghilangkan gpu-driver-version, ini adalah opsi defaultnya.

Mengaktifkan NVIDIA MPS dengan GPU pada node pool baru

Anda dapat mengaktifkan NVIDIA MPS dengan GPU saat membuat node pool baru secara manual di cluster GKE. Buat kumpulan node dengan NVIDIA MPS yang diaktifkan menggunakan Google Cloud CLI:

gcloud container node-pools create NODEPOOL_NAME \
    --cluster=CLUSTER_NAME \
    --machine-type=MACHINE_TYPE \
    --region=COMPUTE_REGION \
    --accelerator=type=GPU_TYPE,count=GPU_QUANTITY,gpu-sharing-strategy=mps,max-shared-clients-per-gpu=CONTAINER_PER_GPU,gpu-driver-version=DRIVER_VERSION

Ganti kode berikut:

  • NODEPOOL_NAME: nama node pool baru.
  • CLUSTER_NAME: nama cluster Anda, yang harus menjalankan GKE versi 1.27.7-gke.1088000 atau yang lebih baru.
  • COMPUTE_REGION: region Compute Engine Anda. Untuk cluster zona, tentukan --zone=COMPUTE_ZONE.
  • MACHINE_TYPE: Jenis mesin Compute Engine untuk node Anda. Untuk GPU A100, gunakan jenis mesin A2. Untuk semua GPU lainnya, gunakan jenis mesin N1.
  • GPU_TYPE: jenis GPU yang harus berupa platform GPU Tesla NVIDIA seperti nvidia-tesla-v100.
  • GPU_QUANTITY: jumlah GPU fisik yang akan dipasang ke setiap node di node pool.
  • CONTAINER_PER_GPU: jumlah maksimum container yang dapat membagikan setiap GPU fisik.
  • DRIVER_VERSION: versi driver NVIDIA yang akan diinstal. Dapat berupa salah satu dari hal berikut:

    • default: Menginstal versi driver default untuk versi GKE Anda.
    • latest: Instal versi driver terbaru yang tersedia untuk versi GKE Anda. Hanya tersedia untuk node yang menggunakan Container-Optimized OS.
    • disabled: Melewati penginstalan driver otomatis. Anda harus menginstal driver secara manual setelah membuat node pool. Jika Anda menghilangkan gpu-driver-version, ini adalah opsi defaultnya.

Menginstal driver perangkat GPU NVIDIA

Jika memilih untuk menonaktifkan penginstalan driver otomatis saat membuat cluster, atau jika menggunakan versi GKE yang lebih lama dari 1.27.2-gke.1200, Anda harus menginstal driver NVIDIA yang kompatibel secara manual untuk mengelola divisi NVIDIA MPS dari GPU fisik. Untuk menginstal driver, Anda men-deploy DaemonSet penginstalan GKE yang menyiapkan driver.

Untuk mendapatkan petunjuk, lihat Menginstal driver perangkat GPU NVIDIA.

Memverifikasi resource GPU yang tersedia

Anda dapat memverifikasi bahwa jumlah GPU di node Anda cocok dengan jumlah yang Anda tentukan saat mengaktifkan NVIDIA MPS. Anda juga dapat memastikan bahwa daemon kontrol NVIDIA MPS sedang berjalan.

Memverifikasi resource GPU yang tersedia di node Anda

Untuk memverifikasi resource GPU yang tersedia di node Anda, jalankan perintah berikut:

kubectl describe nodes NODE_NAME

Ganti NODE_NAME dengan nama salah satu node Anda.

Outputnya mirip dengan hal berikut ini:

...
Capacity:
  ...
  nvidia.com/gpu:             3
Allocatable:
  ...
  nvidia.com/gpu:             3

Dalam output ini, jumlah resource GPU pada node adalah 3 karena nilai berikut:

  • Nilai dalam max-shared-clients-per-gpu adalah 3.
  • count GPU fisik yang akan dipasang ke node adalah 1. Jika count GPU fisik adalah 2, output akan menampilkan 6 resource GPU yang dapat dialokasikan, tiga resource pada setiap GPU fisik.

Memastikan daemon kontrol MPS berjalan

Plugin perangkat GPU melakukan health check pada daemon kontrol MPS. Jika daemon kontrol MPS responsif, Anda dapat men-deploy container.

Untuk memeriksa status MPS, jalankan perintah berikut:

kubectl logs -l k8s-app=nvidia-gpu-device-plugin -n kube-system --tail=100 | grep MPS

Outputnya mirip dengan hal berikut ini:

I1118 08:08:41.732875       1 nvidia_gpu.go:75] device-plugin started
...
I1110 18:57:54.224832       1 manager.go:285] MPS is healthy, active thread percentage = 100.0
...

Dalam output, Anda mungkin melihat bahwa peristiwa berikut terjadi:

  • Error failed to start GPU device manager terjadi sebelum error MPS is healthy. Error ini bersifat sementara. Jika Anda melihat pesan MPS is healthy, berarti daemon kontrol sedang berjalan.
  • Pesan active thread percentage = 100.0 berarti bahwa seluruh resource GPU fisik memiliki thread yang sepenuhnya aktif.

Men-deploy workload yang menggunakan MPS

Sebagai operator aplikasi yang men-deploy beban kerja GPU, Anda dapat memberi tahu GKE untuk berbagi unit berbagi MPS di GPU fisik yang sama. Dalam manifes berikut, Anda meminta satu GPU fisik dan menetapkan max-shared-clients-per-gpu=3. GPU fisik mendapatkan tiga unit berbagi MPS, dan memulai Tugas nvidia/samples:nbody dengan tiga Pod (container) yang berjalan paralel.

  1. Simpan manifes sebagai gpu-mps.yaml:

      apiVersion: batch/v1
      kind: Job
      metadata:
        name: nbody-sample
      spec:
        completions: 3
        parallelism: 3
        template:
          spec:
            hostIPC: true
            nodeSelector:
              cloud.google.com/gke-gpu-sharing-strategy: mps
            containers:
              - name: nbody-sample
                image: nvidia/samples:nbody
                command: ["/tmp/nbody"]
                args: ["-benchmark", "-i=5000"]
                resources:
                  limits:
                    nvidia.com/gpu: 1
            restartPolicy: "Never"
        backoffLimit: 1
    

    Dalam manifes ini:

    • hostIPC: true memungkinkan Pod berkomunikasi dengan daemon kontrol MPS. Atribut ini wajib diisi. Namun, pertimbangkan bahwa konfigurasi hostIPC: true memungkinkan container mengakses resource host yang dapat menimbulkan risiko keamanan.
    • 5.000 iterasi dijalankan dalam mode benchmark.
  2. Terapkan manifes:

    kubectl apply -f gpu-mps.yaml
    
  3. Pastikan semua Pod berjalan:

    kubectl get pods
    

    Outputnya mirip dengan hal berikut ini:

    NAME                           READY   STATUS    RESTARTS   AGE
    nbody-sample-6948ff4484-54p6q   1/1     Running   0          2m6s
    nbody-sample-6948ff4484-5qs6n   1/1     Running   0          2m6s
    nbody-sample-6948ff4484-5zpdc   1/1     Running   0          2m5s
    
  4. Periksa log dari Pod untuk memastikan Tugas telah selesai:

    kubectl logs -l job-name=nbody-sample -f
    

    Outputnya mirip dengan hal berikut ini:

    ...
    > Compute 8.9 CUDA device: [NVIDIA L4]
    18432 bodies, total time for 5000 iterations: 9907.976 ms
    = 171.447 billion interactions per second
    = 3428.941 single-precision GFLOP/s at 20 flops per interaction
    ...
    

    Karena GKE menjalankan 50.000 iterasi, log mungkin memerlukan waktu beberapa menit.

Pembersihan

Hapus Tugas dan semua Pod-nya dengan menjalankan perintah berikut:

kubectl delete job --all

Batasi memori perangkat yang disematkan dan thread aktif dengan NVIDIA MPS

Secara default, saat menggunakan GPU dengan NVIDIA MPS di GKE, variabel lingkungan CUDA berikut akan dimasukkan ke dalam beban kerja GPU:

  • CUDA_MPS_ACTIVE_THREAD_PERCENTAGE: Variabel ini menunjukkan persentase thread yang tersedia dan dapat digunakan oleh setiap unit berbagi MPS. Secara default, setiap unit berbagi MPS GPU disetel ke 100 / MaxSharedClientsPerGPU untuk mendapatkan potongan komputasi GPU yang sama dalam hal multiprosesor stream.
  • CUDA_MPS_PINNED_DEVICE_MEM_LIMIT: Variabel ini membatasi jumlah memori GPU yang dapat dialokasikan oleh unit berbagi MPS GPU. Secara default, setiap unit berbagi MPS GPU disetel ke total mem / MaxSharedClientsPerGPU untuk mendapatkan bagian yang sama dari memori GPU.

Guna menetapkan batas resource untuk beban kerja GPU Anda, konfigurasikan variabel lingkungan NVIDIA MPS ini:

  1. Tinjau dan buat image contoh cuda-mps di GitHub.

  2. Simpan manifes berikut sebagai cuda-mem-and-sm-count.yaml:

    apiVersion: v1
    kind: Pod
    metadata:
      name: cuda-mem-and-sm-count
    spec:
      hostIPC: true
      nodeSelector:
        cloud.google.com/gke-gpu-sharing-strategy: mps
      containers:
        - name: CUDA_MPS_IMAGE
          image: gcr.io/gracegao-gke-dev/cuda-mem-and-sm-count:latest
          securityContext:
            privileged: true
          resources:
            limits:
              nvidia.com/gpu: 1
    

    Ganti CUDA_MPS_IMAGE dengan nama image yang Anda buat untuk contoh cuda-mps.

    NVIDIA MPS mewajibkan Anda menetapkan hostIPC:true pada Pod. Konfigurasi hostIPC:true memungkinkan penampung mengakses resource host yang menimbulkan risiko keamanan.

  3. Terapkan manifes:

    kubectl apply -f cuda-mem-and-sm-count.yaml
    
  4. Periksa log untuk Pod ini:

    kubectl logs cuda-mem-and-sm-count
    

    Dalam contoh yang menggunakan NVIDIA Tesla® L4 dengan gpu-sharing-strategy=mps dan max-shared-clients-per-gpu=3, output-nya mirip seperti berikut:

    For device 0:  Free memory: 7607 M, Total memory: 22491 M
    For device 0:  multiProcessorCount: 18
    

    Dalam contoh ini, GPU NVIDIA Tesla® L4 memiliki jumlah 60 SM dan memori 24 GB. Setiap unit berbagi MPS mendapatkan sekitar 33% thread aktif dan memori 8 GB.

  5. Update manifes untuk meminta 2 nvidia.com/gpu:

      resources:
            limits:
              nvidia.com/gpu: 2
    

    Outputnya mirip dengan hal berikut ini:

    For device 0:  Free memory: 15230 M, Total memory: 22491 M
    For device 0:  multiProcessorCount: 38
    
  6. Update manifes untuk mengganti variabel CUDA_MPS_ACTIVE_THREAD_PERCENTAGE dan CUDA_MPS_PINNED_DEVICE_MEM_LIMIT:

      env:
        - name: CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
          value: "20"
        - name: CUDA_MPS_PINNED_DEVICE_MEM_LIMIT
          value: "0=8000M"
    

    Outputnya mirip dengan hal berikut ini:

    For device 0:  Free memory: 7952 M, Total memory: 22491 M
    For device 0:  multiProcessorCount: 10
    

Batasan

  • MPS pada GPU pra-Volta (k80 dan P100) memiliki kemampuan terbatas dibandingkan dengan jenis GPU di dalam dan setelah Volta.
  • Dengan NVIDIA MPS, GKE memastikan bahwa setiap container mendapatkan memori perangkat yang disematkan dan thread aktif yang terbatas. Namun, resource lain seperti bandwidth memori, encoder, atau decoder tidak dicatat sebagai bagian dari batas resource ini. Akibatnya, container mungkin berdampak negatif pada performa container lain jika semua container meminta resource tak terbatas yang sama.
  • NVIDIA MPS memiliki perlindungan memori dan batasan pembatasan error. Sebaiknya Anda mengevaluasi batasan ini untuk memastikan kompatibilitas dengan beban kerja Anda.
  • NVIDIA MPS mewajibkan Anda menetapkan hostIPC:true pada Pod. Konfigurasi hostIPC:true memungkinkan penampung mengakses resource host yang menimbulkan risiko keamanan.
  • GKE mungkin menolak permintaan GPU tertentu saat menggunakan NVIDIA MPS, untuk mencegah perilaku yang tidak terduga selama alokasi kapasitas. Untuk mengetahui detailnya, lihat Meminta batas untuk solusi berbagi GPU.
  • Jumlah maksimum container yang dapat berbagi satu GPU fisik dengan NVIDIA MPS adalah 48 (GPU pra-Volta hanya mendukung 16). Saat merencanakan konfigurasi MPS NVIDIA, pertimbangkan kebutuhan resource beban kerja Anda dan kapasitas GPU fisik yang mendasarinya untuk mengoptimalkan performa dan responsivitas Anda.
  • Konfigurasi NVIDIA MPS API hanya didukung menggunakan Google Cloud CLI atau Konsol Google Cloud.

Langkah selanjutnya