Berbagi GPU dengan beberapa workload menggunakan NVIDIA MPS


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

Ringkasan

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

NVIDIA MPS mengandalkan Layanan Multiproses NVIDIA di CUDA. NVIDIA MPS adalah implementasi alternatif yang kompatibel dengan biner dari CUDA API yang dirancang untuk mengaktifkan aplikasi CUDA multiproses kooperatif secara transparan agar dapat berjalan secara serentak di satu perangkat GPU.

Dengan NVIDIA MPS, Anda dapat menentukan container bersama maksimum GPU fisik. Nilai ini menentukan jumlah daya GPU fisik yang diperoleh setiap penampung, 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 ingin petunjuk untuk meminta NVIDIA MPS dengan GPU, lihat Men-deploy workload 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.
  • Jenis GPU: 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 lakukan inisialisasi 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. Mengaktifkan 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 node pool 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 di node pool baru

Anda dapat mengaktifkan NVIDIA MPS dengan GPU saat membuat node pool baru secara manual di cluster GKE. Buat node pool 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 Anda memilih untuk menonaktifkan penginstalan driver otomatis saat membuat cluster, atau menggunakan versi GKE yang lebih lama dari 1.27.2-gke.1200, Anda harus menginstal driver NVIDIA yang kompatibel secara manual untuk mengelola pembagian MPS NVIDIA 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 memverifikasi 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 node Anda.

Outputnya mirip dengan hal berikut ini:

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

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

  • Nilai di 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, masing-masing tiga pada setiap GPU fisik.

Memverifikasi bahwa daemon kontrol MPS sedang berjalan

Plugin perangkat GPU melakukan pemeriksaan kondisi pada daemon kontrol MPS. Jika daemon kontrol MPS sudah responsif, Anda dapat men-deploy penampung.

Untuk memverifikasi 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 mendahului error MPS is healthy. Error ini bersifat sementara. Jika Anda melihat pesan MPS is healthy, 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 workload 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 (penampung) yang berjalan secara 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. Wajib diisi. Namun, pertimbangkan bahwa konfigurasi hostIPC: true memungkinkan penampung mengakses resource host yang menimbulkan risiko keamanan.
    • 5.000 iterasi berjalan 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 memverifikasi bahwa 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

Membatasi 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 workload GPU:

  • CUDA_MPS_ACTIVE_THREAD_PERCENTAGE: Variabel ini menunjukkan persentase thread yang tersedia yang dapat digunakan oleh setiap unit berbagi MPS. Secara default, setiap unit berbagi MPS GPU disetel ke 100 / MaxSharedClientsPerGPU untuk mendapatkan bagian komputasi GPU yang sama dalam hal multiprosesor streaming.
  • 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 ditetapkan ke total mem / MaxSharedClientsPerGPU untuk mendapatkan bagian memori GPU yang sama.

Untuk menetapkan batas resource bagi beban kerja GPU, konfigurasikan variabel lingkungan NVIDIA MPS berikut:

  1. Tinjau dan build 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-mem-and-sm-count
          image: CUDA_MPS_IMAGE
          securityContext:
            privileged: true
          resources:
            limits:
              nvidia.com/gpu: 1
    

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

    NVIDIA MPS mengharuskan Anda menetapkan hostIPC:true di 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, outputnya serupa dengan 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 SM 60 dan memori 24 GB. Setiap unit berbagi MPS kira-kira mendapatkan 33% thread aktif dan memori 8 GB.

  5. Perbarui 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. Perbarui 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 (P100) memiliki kemampuan terbatas dibandingkan dengan jenis GPU dalam dan setelah Volta.
  • Dengan NVIDIA MPS, GKE memastikan bahwa setiap penampung 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, penampung dapat memengaruhi performa penampung lain secara negatif jika semuanya meminta resource tanpa batas yang sama.
  • NVIDIA MPS memiliki batasan perlindungan memori dan pembatasan error. Sebaiknya Anda mengevaluasi batasan ini untuk memastikan kompatibilitas dengan workload Anda.
  • NVIDIA MPS mengharuskan Anda menetapkan hostIPC:true di 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.
  • Jumlah maksimum container yang dapat menggunakan satu GPU fisik dengan NVIDIA MPS adalah 48 (GPU pra-Volta hanya mendukung 16). Saat merencanakan konfigurasi NVIDIA MPS, pertimbangkan kebutuhan resource dari workload 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