All Products
Search
Document Center

Container Service for Kubernetes:Gunakan MPS untuk Penjadwalan Berbagi GPU dan Isolasi Memori GPU

Last Updated:Mar 21, 2026

Penjadwalan GPU bersama menggunakan NVIDIA MPS (Multi-Process Service) sebagai modul isolasi GPU dasar, yang memungkinkan beberapa Pod aplikasi berbagi satu GPU sekaligus menjamin isolasi memori GPU antar-Pod. Topik ini menjelaskan cara mengaktifkan isolasi NVIDIA MPS dan mengintegrasikannya dengan komponen penjadwalan GPU bersama.

Informasi latar belakang

Penggunaan MPI (Message Passing Interface) untuk memparalelkan core CPU membantu menyeimbangkan alokasi sumber daya di antara tugas-tugas intensif CPU, sehingga memungkinkan beberapa tugas komputasi berjalan secara konkuren dan mempercepat komputasi keseluruhan. Namun, ketika kernel CUDA mempercepat proses MPI, setiap proses MPI mungkin tidak memanfaatkan GPU secara optimal. Akibatnya, meskipun proses MPI individual berjalan lebih cepat, efisiensi GPU secara keseluruhan tetap rendah. Jika satu aplikasi mengirim beban kerja yang tidak mencukupi ke GPU, sumber daya GPU tersebut tetap menganggur. Dalam kasus seperti ini, gunakan NVIDIA MPS (Multi-Process Service). MPS memungkinkan beberapa aplikasi CUDA berjalan pada satu GPU NVIDIA, cocok untuk lingkungan multi-pengguna atau saat menjalankan banyak tugas kecil secara bersamaan, sehingga meningkatkan pemanfaatan GPU dan throughput aplikasi.

MPS memungkinkan aplikasi yang berbeda berjalan secara konkuren pada perangkat GPU yang sama, meningkatkan pemanfaatan sumber daya GPU di seluruh kluster. MPS menggunakan arsitektur client-server dan mempertahankan kompatibilitas biner, sehingga tidak memerlukan perubahan besar pada aplikasi CUDA yang sudah ada. MPS terdiri dari tiga komponen utama:

  • Proses Control Daemon: Memulai dan menghentikan MPS Server serta mengelola koneksi antara klien dan MPS Server, memastikan klien dapat terhubung ke layanan MPS untuk meminta dan menggunakan sumber daya GPU.

  • Client Runtime: Dibangun ke dalam pustaka driver CUDA. Anda tidak perlu melakukan perubahan kode signifikan untuk menggunakan MPS dalam aplikasi CUDA Anda. Saat aplikasi menggunakan driver CUDA untuk mengakses GPU, Client Runtime menangani komunikasi dengan MPS Server, memungkinkan beberapa aplikasi berbagi GPU secara aman dan efisien.

  • Proses Server: Menerima permintaan dari berbagai klien dan menggunakan penjadwalan efisien untuk menjalankan permintaan tersebut pada satu perangkat GPU, memungkinkan konkurensi antar-klien.

Catatan penting

  • Dalam arsitektur NVIDIA MPS, MPS Clients—yaitu aplikasi GPU Anda yang menggunakan MPS—harus tetap terhubung ke MPS Control Daemon. Jika MPS Control Daemon direstart, MPS Clients tersebut akan keluar dengan error.

  • Dalam contoh ini, MPS Control Daemon dijalankan sebagai kontainer. DaemonSet menerapkan satu Pod MPS Control Daemon di setiap node GPU. Berikut hal-hal yang perlu Anda ketahui tentang Pod MPS Control Daemon:

    • Jangan menghapus atau merestart Pod MPS Control Daemon. Menghapusnya menyebabkan aplikasi GPU pada node tersebut tidak tersedia. Jalankan kubectl get po -l app.aliyun.com/name=mps-control-daemon -A untuk memeriksa status Pod MPS Control Daemon di kluster Anda.

    • Kontainer yang menjalankan MPS Control Daemon memerlukan izin privileged, hostIPC, dan hostPID. Izin-izin ini membawa risiko keamanan potensial. Evaluasi secara hati-hati sebelum menggunakan solusi ini.

    • Pod MPS Control Daemon menggunakan priorityClassName: system-node-critical untuk mempertahankan prioritas tinggi. Hal ini mencegah Pod dihentikan saat sumber daya node menipis. Tanpa pengaturan ini, aplikasi bisnis tidak dapat menggunakan GPU. Jika sumber daya node rendah saat penerapan, MPS Control Daemon dapat mendahului Pod bisnis berprioritas lebih rendah, menyebabkan Pod tersebut di-evict. Sebelum menerapkan komponen ini, pastikan node Anda memiliki CPU dan memori yang cukup.

  • 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:

    • Jangan menjalankan aplikasi intensif GPU secara langsung di node.

    • Jangan gunakan alat seperti Docker, Podman, atau nerdctl untuk membuat kontainer dan meminta sumber daya GPU untuk kontainer tersebut. Misalnya, jangan jalankan perintah docker run --gpus all atau docker run -e NVIDIA_VISIBLE_DEVICES=all dan menjalankan aplikasi intensif GPU.

    • Jangan tambahkan variabel lingkungan NVIDIA_VISIBLE_DEVICES=all atau NVIDIA_VISIBLE_DEVICES=<GPU ID> ke bagian env dalam file YAML Pod. Jangan gunakan variabel lingkungan NVIDIA_VISIBLE_DEVICES untuk meminta sumber daya GPU bagi Pod dan menjalankan aplikasi intensif GPU.

    • Jangan atur NVIDIA_VISIBLE_DEVICES=all dan menjalankan aplikasi intensif GPU saat membangun gambar kontainer jika variabel lingkungan NVIDIA_VISIBLE_DEVICES tidak ditentukan dalam file YAML Pod.

    • Jangan tambahkan privileged: true ke bagian securityContext dalam file YAML Pod dan menjalankan aplikasi intensif GPU.

  • Risiko potensial berikut mungkin muncul 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 suatu node tetapi tidak mencatat detailnya dalam buku besar sumber daya perangkat penjadwal, informasi alokasi sumber daya GPU aktual mungkin berbeda dari yang tercatat dalam buku besar tersebut. 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—misalnya, meminta sumber daya dari GPU yang sama—dan beberapa aplikasi mungkin gagal dimulai karena sumber daya GPU tidak mencukupi.

    • Penggunaan metode di atas juga dapat menyebabkan masalah tak terduga lainnya, seperti masalah yang dilaporkan oleh komunitas NVIDIA.

Cakupan penerapan

Anda telah membuat kluster ACK yang dikelola edisi Pro versi 1.20 atau lebih baru. Jika versi kluster Anda lebih lama, tingkatkan kluster Anda.

Prosedur

Langkah 1: Instal komponen MPS Control Daemon

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Marketplace > Marketplace.

  2. Di Marketplace, masukkan ack-mps-control di kotak pencarian. Klik komponen dalam hasil pencarian untuk membuka halaman instalasinya.

  3. Di antarmuka instalasi ack-mps-control, klik Deploy, pilih Cluster tempat Anda ingin menerapkan komponen, lalu klik Next.

  4. Di halaman Create, pilih Chart Version. Klik OK untuk menyelesaikan instalasi.

    Penting
    • Mencopot atau meningkatkan komponen MPS Control Daemon ack-mps-control memengaruhi aplikasi GPU yang sedang berjalan di node. Aplikasi tersebut akan keluar dengan error. Lakukan tindakan ini selama jam sepi.

    • Strategi peningkatan adalah OnDelete. Sistem tidak akan merestart Pod secara otomatis. Setelah peningkatan, hapus secara manual Pod lama dalam DaemonSet ack-mps-control untuk menyelesaikan pembaruan. Untuk detailnya, lihat Bagaimana cara meningkatkan komponen MPS Control Daemon?

Langkah 2: Instal komponen GPU bersama

  1. Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Applications > Cloud-native AI Suite.

  3. Di halaman Cloud-native AI Suite, klik Deploy.

  4. Di halaman Deploy Now untuk Cloud-native AI Suite, pilih Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).

  5. Di bagian bawah halaman Cloud-native AI Suite, klik Deploy Cloud-native AI Suite.

    Setelah komponen berhasil diinstal, temukan komponen GPU bersama yang telah diinstal ack-ai-installer dalam daftar komponen di halaman Cloud-native AI Suite.

Langkah 3: Aktifkan penjadwalan berbagi GPU dan isolasi memori GPU

  1. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Nodes > Node Pools.

  2. Di halaman Node Pools, klik Create Node Pool.

  3. Di halaman Create Node Pool, konfigurasikan pengaturan kelompok node. Klik Confirm.

    Untuk detail pengaturan lainnya, lihat Buat dan kelola kelompok node.

    Setting

    Description

    Desired number of nodes

    Atur jumlah awal node dalam kelompok node.

    Catatan

    Node labels

    Klik Node Label untuk Node Label, atur Key menjadi ack.node.gpu.schedule dan Value menjadi mps.

    Penting
    • Anda harus memberi label setiap node GPU dengan ack.node.gpu.schedule=mps agar Pod MPS Control Daemon diterapkan di node tersebut. Jika kluster Anda mencakup komponen penjadwalan GPU bersama, memberi label node dengan ack.node.gpu.schedule=mps juga mengaktifkan kemampuan penjadwalan GPU bersama dan isolasi MPS pada node tersebut.

Langkah 4: Terapkan aplikasi contoh

  1. Buat aplikasi contoh menggunakan file YAML berikut.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: mps-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: mps-sample
        spec:
          hostIPC: true  # Required. Otherwise, the pod fails to start.
          hostPID: true  # Optional. Added here only to help you see the effect of MPS.
          nodeSelector:
           kubernetes.io/hostname: <NODE_NAME> # Replace <NODE_NAME> with the hostname of a GPU node that has the label ack.node.gpu.schedule=mps. For example: 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  # Request 7 GiB of GPU memory for this pod.
            workingDir: /root
          restartPolicy: Never
    Penting

    Setelah Anda mengaktifkan MPS di suatu node, Pod aplikasi GPU di node tersebut harus mengatur hostIPC: true. Jika tidak, Pod gagal dimulai.

  2. Tunggu hingga Pod mencapai status Running. Lalu jalankan perintah berikut untuk memeriksa apakah MPS aktif.

    kubectl exec -ti mps-sample-xxxxx --  nvidia-smi

    Output 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 tersebut menunjukkan bahwa perintah nvidia-smi mencantumkan mps-server. ID prosesnya di host adalah 14732. Output tersebut juga menampilkan proses Python dengan ID proses 110312 yang berjalan di bawah MPS. Hal ini mengonfirmasi bahwa MPS berfungsi.

FAQ

Bagaimana cara meningkatkan komponen MPS Control Daemon?

Meningkatkan ack-mps-control v0.2.0 memerlukan ack-ai-installer >= 1.13.1. Tingkatkan komponen MPS Control Daemon dengan urutan berikut:

  1. Di daftar komponen pada halaman Cloud-native AI Suite, tingkatkan versi Helm komponen penjadwalan GPU bersama ack-ai-installer.

  2. Di Applications > Helm, pilih namespace kube-system. Tingkatkan versi Helm komponen ack-mps-control.

    Strategi peningkatan adalah OnDelete. Sistem tidak akan merestart Pod secara otomatis. Setelah peningkatan, hapus secara manual Pod lama dalam DaemonSet ack-mps-control untuk menyelesaikan pembaruan.
  3. Untuk setiap node, lakukan Drain, tandai sebagai Unschedulable, dan hapus Pod ack-mps-control.

    1. Atur node menjadi Unschedulable dan eksekusi Drain.

    2. Hapus Pod ack-mps-control di node tersebut.

    3. Konfirmasi bahwa Pod baru berjalan normal.

  4. Hapus dan restart Pod ack-ai-installer.

    Setelah Anda meningkatkan ack-mps-control dan mengonfirmasi bahwa Pod terkait telah diperbarui, hapus secara manual Pod ack-ai-installer. Pod tersebut akan dibuat ulang secara otomatis.
  5. Tandai kembali node sebagai schedulable.

    Setelah Anda mengonfirmasi bahwa Pod ack-mps-control dan Pod ack-ai-installer berjalan normal di node target, tandai kembali node tersebut sebagai schedulable.