All Products
Search
Document Center

Container Service for Kubernetes:Gunakan MPS untuk penjadwalan GPU bersama dan isolasi memori GPU

Last Updated:Aug 21, 2026

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, dan hostPID, yang membawa risiko keamanan. Lakukan penilaian hati-hati sebelum menggunakan solusi ini.

    • Pod MPS Control Daemon menggunakan priorityClassName: system-node-critical untuk 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, 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 berat 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 berat GPU.

    • Jangan atur NVIDIA_VISIBLE_DEVICES=all dan jalankan aplikasi berat 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 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

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

  2. Di Marketplace, cari ack-mps-control dan klik.

  3. Di halaman ack-mps-control, klik Deploy. Pilih Cluster target dan klik Next.

  4. 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

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

  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 dan klik Confirm.

    Lihat Buat dan kelola kelompok node untuk pengaturan lainnya.

    Pengaturan

    Deskripsi

    Desired number of nodes

    Jumlah awal node dalam kelompok node.

    Catatan

    Setelah 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 Node Label untuk Node Label, atur Key menjadi ack.node.gpu.schedule dan Value menjadi mps.

    Penting
    • Beri label setiap node GPU dengan ack.node.gpu.schedule=mps untuk 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 nodes untuk 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

  1. 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: Never
    Penting

    Pod aplikasi GPU di node yang diaktifkan MPS harus mengatur hostIPC: true, atau Pod tersebut gagal dijalankan.

  2. Setelah Pod mencapai status Running, periksa 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 nvidia-smi mencantumkan proses mps-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:

  1. Di halaman Cloud-native AI Suite, tingkatkan versi Helm ack-ai-installer.

  2. Di Applications > Helm, pilih namespace kube-system dan 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.
  3. Untuk setiap node, lakukan Drain, tandai sebagai Unschedulable, dan hapus Pod ack-mps-control.

    1. Tandai node sebagai Unschedulable dan klik Drain.

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

    3. Konfirmasi bahwa Pod baru berjalan normal.

  4. 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.
  5. 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.