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 untuk 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
.
- 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 workload 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:
- Mengaktifkan 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 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.- 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 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 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 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
adalah3
. count
GPU fisik yang akan dipasang ke node adalah1
. Jikacount
GPU fisik adalah2
, output akan menampilkan6
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 errorMPS is healthy
. Error ini bersifat sementara. Jika Anda melihat pesanMPS 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.
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 konfigurasihostIPC: true
memungkinkan penampung mengakses resource host yang menimbulkan risiko keamanan.- 5.000 iterasi berjalan 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 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 ke100 / MaxSharedClientsPerGPU
untuk mendapatkan slice 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 ketotal mem / MaxSharedClientsPerGPU
untuk mendapatkan bagian memori GPU yang sama.
Untuk menetapkan batas resource bagi beban kerja GPU, konfigurasikan variabel lingkungan NVIDIA MPS berikut:
Tinjau dan build 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-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 contohcuda-mps
.NVIDIA MPS mengharuskan Anda menetapkan
hostIPC:true
di 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
, 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.
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
Perbarui 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 (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. 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.
- 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
- Untuk mengetahui informasi selengkapnya tentang strategi berbagi GPU yang tersedia di GKE, lihat Tentang strategi berbagi GPU di GKE
- Untuk mengetahui informasi selengkapnya tentang Multi-Process Service (MPS), lihat dokumentasi NVIDIA.