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
.
- Pastikan Anda memiliki kuota GPU NVIDIA Tesla yang memadai. Jika Anda memerlukan lebih banyak kuota, lihat Meminta penambahan kuota.
- Rencanakan kapasitas GPU Anda berdasarkan kebutuhan resource beban kerja dan kapasitas GPU dasar.
- Tinjau batasan untuk NVIDIA MPS dengan GPU.
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:
- Aktifkan NVIDIA MPS dengan GPU di cluster GKE baru.
- Instal driver perangkat GPU NVIDIA (jika diperlukan).
- 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.- Untuk GPU H100, gunakan jenis mesin A3
- Untuk GPU A100, gunakan jenis mesin A2
- Untuk GPU L4, gunakan jenis mesin G2
- Untuk semua GPU lainnya, gunakan jenis mesin N1
GPU_TYPE
: jenis GPU yang harus berupa platform GPU Tesla NVIDIA sepertinvidia-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 menghilangkangpu-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 sepertinvidia-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 menghilangkangpu-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
adalah3
. count
GPU fisik yang akan dipasang ke node adalah1
. Jikacount
GPU fisik adalah2
, output akan menampilkan6
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 errorMPS is healthy
. Error ini bersifat sementara. Jika Anda melihat pesanMPS 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.
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 konfigurasihostIPC: true
memungkinkan container mengakses resource host yang dapat menimbulkan risiko keamanan.- 5.000 iterasi dijalankan dalam mode benchmark.
Terapkan manifes:
kubectl apply -f gpu-mps.yaml
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
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 ke100 / 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 ketotal 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:
Tinjau dan buat image contoh
cuda-mps
di GitHub.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 contohcuda-mps
.NVIDIA MPS mewajibkan Anda menetapkan
hostIPC:true
pada Pod. KonfigurasihostIPC:true
memungkinkan penampung mengakses resource host yang menimbulkan risiko keamanan.Terapkan manifes:
kubectl apply -f cuda-mem-and-sm-count.yaml
Periksa log untuk Pod ini:
kubectl logs cuda-mem-and-sm-count
Dalam contoh yang menggunakan NVIDIA Tesla® L4 dengan
gpu-sharing-strategy=mps
danmax-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.
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
Update manifes untuk mengganti variabel
CUDA_MPS_ACTIVE_THREAD_PERCENTAGE
danCUDA_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. KonfigurasihostIPC: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
- Untuk mengetahui informasi selengkapnya tentang strategi berbagi GPU yang tersedia di GKE, lihat Tentang strategi berbagi GPU di GKE
- Untuk mengetahui informasi selengkapnya tentang Layanan Multi-Proses (MPS), lihat dokumentasi NVIDIA.