Penjadwalan GPU bersama menggunakan NVIDIA MPS (Multi-Process Service) sebagai modul isolasi GPU dasar, memungkinkan beberapa Pod berbagi satu GPU dengan isolasi memori. Topik ini menjelaskan cara mengaktifkan MPS dan mengintegrasikannya dengan komponen penjadwalan GPU bersama di kluster ACK.
Latar Belakang
MPI (Message Passing Interface) memparalelkan core CPU dalam berbagai tugas komputasi, tetapi proses MPI yang dipercepat CUDA sering kali tidak memanfaatkan GPU secara optimal. NVIDIA MPS (Multi-Process Service) memungkinkan beberapa aplikasi CUDA berbagi satu GPU, meningkatkan pemanfaatan dan throughput dalam skenario multi-pengguna atau banyak tugas kecil.
MPS menggunakan arsitektur client-server dengan kompatibilitas biner, sehingga tidak memerlukan perubahan besar pada aplikasi CUDA yang sudah ada. MPS terdiri dari tiga komponen:
-
Proses Control Daemon: Mengelola siklus hidup MPS Server dan koneksi klien.
-
Runtime Klien: Dibangun ke dalam pustaka driver CUDA. Menangani komunikasi antara aplikasi dan MPS Server, memungkinkan berbagi GPU tanpa perubahan kode signifikan.
-
Proses Server: Menjadwalkan permintaan dari beberapa klien pada satu GPU, memungkinkan konkurensi.
Catatan Penggunaan
-
Klien MPS (aplikasi GPU yang menggunakan MPS) harus tetap terhubung ke MPS Control Daemon. Jika daemon direstart, klien akan keluar dengan error.
-
MPS Control Daemon berjalan sebagai kontainer, diterapkan oleh DaemonSet (satu Pod per node GPU):
-
Jangan hapus atau restart Pod MPS Control Daemon—aplikasi GPU di node tersebut menjadi tidak tersedia. Periksa status Pod dengan
kubectl get po -l app.aliyun.com/name=mps-control-daemon -A. -
Kontainer MPS Control Daemon memerlukan izin
privileged,hostIPC, danhostPID, yang membawa risiko keamanan. Lakukan penilaian hati-hati sebelum menggunakan solusi ini. -
Pod MPS Control Daemon menggunakan
priorityClassName: system-node-criticaluntuk menghindari terminasi saat sumber daya node menipis. Saat penerapan, Pod ini dapat menggantikan Pod dengan prioritas lebih rendah jika sumber daya tidak mencukupi. Pastikan node memiliki CPU dan memori yang cukup sebelum menerapkan.
-
-
Untuk node GPU yang dikelola dalam kluster Container Service for Kubernetes (ACK), Anda perlu memperhatikan hal-hal berikut saat meminta sumber daya GPU untuk aplikasi dan menggunakan sumber daya GPU tersebut.
Jangan menjalankan aplikasi berat GPU secara langsung di node.
Jangan gunakan alat seperti
Docker,Podman, ataunerdctluntuk membuat kontainer dan meminta sumber daya GPU untuk kontainer tersebut. Misalnya, jangan jalankan perintahdocker run --gpus allataudocker run -e NVIDIA_VISIBLE_DEVICES=alldan menjalankan aplikasi berat GPU.Jangan tambahkan variabel lingkungan
NVIDIA_VISIBLE_DEVICES=allatauNVIDIA_VISIBLE_DEVICES=<GPU ID>ke bagianenvdalam file YAML Pod. Jangan gunakan variabel lingkunganNVIDIA_VISIBLE_DEVICESuntuk meminta sumber daya GPU bagi Pod dan menjalankan aplikasi berat GPU.Jangan atur
NVIDIA_VISIBLE_DEVICES=alldan jalankan aplikasi berat GPU saat membangun gambar kontainer jika variabel lingkunganNVIDIA_VISIBLE_DEVICEStidak ditentukan dalam file YAML Pod.Jangan tambahkan
privileged: trueke bagiansecurityContextdalam file YAML Pod dan jalankan aplikasi berat GPU.
-
Risiko potensial berikut mungkin terjadi saat Anda menggunakan metode di atas untuk meminta sumber daya GPU bagi aplikasi Anda:
Jika Anda menggunakan salah satu metode di atas untuk meminta sumber daya GPU di sebuah node tetapi tidak menentukan detailnya dalam buku besar sumber daya perangkat penjadwal, informasi alokasi sumber daya GPU aktual mungkin berbeda dari yang tercatat dalam buku besar sumber daya perangkat penjadwal. Dalam skenario ini, penjadwal tetap dapat menjadwalkan Pod tertentu yang meminta sumber daya GPU ke node tersebut. Akibatnya, aplikasi Anda mungkin bersaing untuk sumber daya dari GPU yang sama, seperti meminta sumber daya dari GPU yang sama, dan beberapa aplikasi mungkin gagal dijalankan karena sumber daya GPU tidak mencukupi.
Penggunaan metode di atas juga dapat menyebabkan masalah tak terduga lainnya, seperti masalah yang dilaporkan oleh komunitas NVIDIA.
Prasyarat
Kluster ACK yang dikelola edisi Pro yang menjalankan versi 1.20 atau lebih baru. Jika versi Anda lebih lama, tingkatkan kluster Anda.
Prosedur
Langkah 1: Instal komponen MPS Control Daemon
-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik .
-
Di Marketplace, cari ack-mps-control dan klik.
-
Di halaman ack-mps-control, klik Deploy. Pilih Cluster target dan klik Next.
-
Di halaman Create, pilih Chart Version dan klik OK.
Penting-
Mencopot atau meningkatkan ack-mps-control menyebabkan aplikasi GPU yang sedang berjalan di node keluar dengan error. Lakukan selama jam sepi.
-
Strategi peningkatan adalah
OnDelete—Pod tidak restart secara otomatis. Setelah peningkatan, hapus secara manual Pod DaemonSet ack-mps-control yang lama. Lihat Bagaimana cara meningkatkan komponen MPS Control Daemon?
-
Langkah 2: Instal komponen GPU bersama
-
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Cloud-native AI Suite, klik Deploy.
-
Di halaman Deploy Now untuk Cloud-native AI Suite, pilih Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).
-
Di halaman Cloud-native AI Suite, klik Deploy Cloud-native AI Suite.
Setelah instalasi, temukan ack-ai-installer dalam daftar komponen di halaman Cloud-native AI Suite.
Langkah 3: Aktifkan penjadwalan berbagi GPU dan isolasi memori GPU
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Di halaman Node Pools, klik Create Node Pool.
-
Di halaman Create Node Pool, konfigurasikan pengaturan kelompok node dan klik Confirm.
Lihat Buat dan kelola kelompok node untuk pengaturan lainnya.
Pengaturan
Deskripsi
Desired number of nodes
Jumlah awal node dalam kelompok node.
CatatanSetelah membuat kelompok node, tambahkan node GPU ke dalamnya. Saat melakukannya, pastikan Anda menentukan GPU cloud server sebagai tipe instans. Untuk informasi lebih lanjut, lihat Tambahkan node yang ada ke kelompok node atau Buat dan kelola kelompok node.
Node labels
Klik
untuk Node Label, atur Key menjadi ack.node.gpu.scheduledan Value menjadimps.Penting-
Beri label setiap node GPU dengan
ack.node.gpu.schedule=mpsuntuk menerapkan Pod MPS Control Daemon. Jika komponen penjadwalan GPU bersama telah diinstal, label ini juga mengaktifkan penjadwalan GPU bersama dan isolasi MPS di node tersebut. Setelah menambahkan label berbagi GPU, jangan gunakan perintah
kubectl label nodesuntuk mengubah label penjadwalan GPU atau gunakan fitur manajemen label di halaman Nodes untuk mengubah label node. Hal ini dapat menyebabkan masalah potensial. Untuk informasi lebih lanjut, lihat Aktifkan penjadwalan. Metode yang direkomendasikan dijelaskan di Aktifkan penjadwalan.
-
Langkah 4: Terapkan aplikasi contoh
-
Buat aplikasi contoh dengan file YAML berikut.
apiVersion: batch/v1 kind: Job metadata: name: mps-sample spec: parallelism: 1 template: metadata: labels: app: mps-sample spec: hostIPC: true # Wajib. Jika tidak, Pod gagal dijalankan. hostPID: true # Opsional. Ditambahkan di sini hanya untuk membantu Anda melihat efek MPS. nodeSelector: kubernetes.io/hostname: <NODE_NAME> # Ganti <NODE_NAME> dengan hostname node GPU yang memiliki label ack.node.gpu.schedule=mps. Contoh: cn-shanghai.192.0.2.109. containers: - name: mps-sample image: registry.cn-hangzhou.aliyuncs.com/ai-samples/gpushare-sample:tensorflow-1.5 command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: aliyun.com/gpu-mem: 7 # Minta 7 GiB memori GPU untuk Pod ini. workingDir: /root restartPolicy: NeverPentingPod aplikasi GPU di node yang diaktifkan MPS harus mengatur
hostIPC: true, atau Pod tersebut gagal dijalankan. -
Setelah Pod mencapai status Running, periksa apakah MPS aktif:
kubectl exec -ti mps-sample-xxxxx -- nvidia-smiOutput yang diharapkan:
Tue May 27 05:32:12 2025 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.161.07 Driver Version: 535.161.07 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 Tesla ****-****-**** On | 00000000:00:09.0 Off | 0 | | N/A 33C P0 55W / 300W | 345MiB / 16384MiB | 0% E. Process | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| | 0 N/A N/A 14732 C nvidia-cuda-mps-server 30MiB | | 0 N/A N/A 110312 M+C python 312MiB | +---------------------------------------------------------------------------------------+Output
nvidia-smimencantumkan prosesmps-server(PID 14732) dan proses Python (PID 110312) yang berjalan di bawah MPS, mengonfirmasi bahwa MPS aktif.
FAQ
Bagaimana cara meningkatkan komponen MPS Control Daemon?
Peningkatan ack-mps-control v0.2.0 memerlukan ack-ai-installer >= 1.13.1. Ikuti urutan berikut:
-
Di halaman Cloud-native AI Suite, tingkatkan versi Helm ack-ai-installer.
-
Di , pilih namespace
kube-systemdan tingkatkan ack-mps-control.Strategi peningkatan adalah
OnDelete—Pod tidak restart secara otomatis. Setelah peningkatan, hapus secara manual Pod DaemonSet ack-mps-control yang lama. -
Untuk setiap node, lakukan Drain, tandai sebagai Unschedulable, dan hapus Pod ack-mps-control.
-
Tandai node sebagai Unschedulable dan klik Drain.
-
Hapus Pod ack-mps-control di node tersebut.
-
Konfirmasi bahwa Pod baru berjalan normal.
-
-
Hapus Pod ack-ai-installer.
Setelah meningkatkan ack-mps-control dan mengonfirmasi Pod telah diperbarui, hapus Pod ack-ai-installer. Pod tersebut akan dibuat ulang secara otomatis.
-
Tandai node sebagai dapat dijadwalkan.
Setelah mengonfirmasi bahwa Pod ack-mps-control dan ack-ai-installer berjalan normal di node tersebut, tandai node sebagai schedulable.