全部产品
Search
文档中心

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

更新时间:Jul 06, 2025

Berbagi GPU menggunakan NVIDIA Multi-Process Service (MPS) sebagai modul isolasi GPU di lapisan bawah memungkinkan beberapa pod berbagi satu GPU sambil mengisolasi memori GPU di antara pod. Topik ini menjelaskan cara mengaktifkan NVIDIA MPS dan menggunakan NVIDIA MPS bersama dengan komponen Berbagi GPU untuk mengimplementasikan berbagi GPU dan isolasi memori GPU.

Informasi Latar Belakang

MPS mendukung paralelisasi multi-core, yang menyeimbangkan alokasi sumber daya di antara tugas-tugas intensif CPU. Ini memastikan bahwa beberapa tugas komputasi diproses secara paralel untuk mempercepat proses komputasi beban kerja Anda. Saat menggunakan kernel Compute Unified Architecture (CUDA) untuk mempercepat proses MPI, setiap proses MPI mungkin diberi sejumlah kecil beban kerja. Dalam kasus ini, eksekusi setiap proses MPS dipercepat tetapi GPU kurang dimanfaatkan. Jika aplikasi menjalankan sejumlah kecil tugas pada GPU, sebagian dari sumber daya GPU mungkin menjadi idle. Untuk menyelesaikan masalah ini, kami merekomendasikan agar Anda mengaktifkan NVIDIA MPS untuk menjalankan beberapa aplikasi CUDA pada GPU NVIDIA. Fitur ini cocok untuk lingkungan multi-pengguna atau skenario di mana Anda perlu menjalankan beberapa tugas yang membutuhkan sedikit sumber daya. Ini membantu meningkatkan pemanfaatan GPU dan throughput aplikasi.

MPS memungkinkan sistem untuk menjalankan beberapa aplikasi pada GPU secara paralel guna meningkatkan pemanfaatan GPU. MPS menggunakan arsitektur client-server untuk mencapai kemampuan ini. Selain itu, MPS kompatibel secara biner, sehingga tidak memerlukan modifikasi kode besar pada aplikasi CUDA Anda saat menggunakan MPS. MPS terdiri dari komponen-komponen berikut:

  • Proses Daemon Kontrol: Komponen ini bertanggung jawab untuk memulai dan menghentikan server MPS serta mengoordinasikan koneksi antara klien dan server MPS. Dengan cara ini, klien dapat terhubung ke server MPS dan meminta sumber daya GPU seperti biasa.

  • Runtime Klien: Komponen ini dibangun ke dalam pustaka driver CUDA. Anda dapat langsung menggunakan MPS tanpa perlu melakukan modifikasi kode besar pada aplikasi CUDA Anda saat menggunakan MPS. Saat beberapa aplikasi menggunakan driver CUDA untuk melakukan operasi pada GPU, Runtime Klien secara otomatis berinteraksi dengan server MPS untuk memastikan bahwa aplikasi dapat berbagi GPU secara efisien dan aman.

  • Proses Server: Komponen ini menerima permintaan dari klien yang berbeda dan menggunakan kebijakan penjadwalan untuk mendistribusikan permintaan secara efisien ke satu GPU, memungkinkan GPU untuk memproses permintaan dari klien yang berbeda secara bersamaan.

Catatan Penggunaan

  • Dalam arsitektur NVIDIA MPS, klien MPS perlu berinteraksi dengan MPS Control Daemon. Klien MPS adalah aplikasi yang membutuhkan sumber daya GPU dan memiliki MPS diaktifkan. Jika MPS Control Daemon di-restart, kesalahan mungkin terjadi pada klien MPS dan klien mungkin keluar.

  • Dalam contoh ini, MPS Control Daemon berjalan di dalam kontainer dan diterapkan sebagai DaemonSet untuk berjalan di setiap node yang dipercepat GPU. Setiap node menjalankan pod MPS Control Daemon. Daftar berikut menjelaskan catatan penggunaan untuk pod MPS Control Daemon:

    • Jangan hapus atau restart pod MPS Control Daemon. Jika Anda menghapus pod MPS Control Daemon, aplikasi yang membutuhkan sumber daya GPU mungkin tidak tersedia. Anda dapat menjalankan perintah kubectl get po -l app.aliyun.com/name=mps-control-daemon -A untuk memeriksa status pod MPS Control Daemon.

    • Saat menjalankan MPS Control Daemon di dalam kontainer, kontainer harus memiliki izin privileged, hostIPC, dan hostPID. Risiko keamanan mungkin timbul dari izin tersebut. Berhati-hatilah sebelum Anda mengaktifkan MPS.

    • Pod MPS Control Daemon menggunakan konfigurasi priorityClassName: system-node-critical untuk meminta prioritas tinggi. Ini mencegah sistem menghentikan pod MPS Control Daemon ketika sumber daya pada node menjadi tidak cukup. Jika pod MPS Control Daemon dihentikan, aplikasi Anda yang menggunakan MPS mungkin tidak berfungsi dengan normal. Jika sumber daya pada node tidak cukup saat Anda menerapkan MPS Control Daemon, MPS Control Daemon mungkin merebut sumber daya yang digunakan oleh pod yang diberi prioritas lebih rendah. Dalam hal ini, pod diusir dari node. Sebelum Anda menerapkan MPS Control Daemon pada node, kami sarankan Anda memastikan sumber daya CPU dan memori yang cukup pada node.

  • Untuk node GPU yang dikelola dalam kluster Container Service for Kubernetes (ACK), Anda perlu memperhatikan item-item berikut saat meminta sumber daya GPU untuk aplikasi dan menggunakan sumber daya GPU.

    • Jangan jalankan aplikasi yang intensif GPU langsung pada node.

    • Jangan gunakan alat-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 jalankan aplikasi yang 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 untuk pod dan menjalankan aplikasi yang intensif GPU.

    • Jangan atur NVIDIA_VISIBLE_DEVICES=all dan jalankan aplikasi yang intensif GPU saat Anda 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 yang intensif GPU.

  • Risiko potensial berikut mungkin ada saat Anda menggunakan metode sebelumnya untuk meminta sumber daya GPU untuk aplikasi Anda:

    • Jika Anda menggunakan salah satu metode sebelumnya untuk meminta sumber daya GPU pada node tetapi tidak menentukan detail dalam buku sumber daya perangkat scheduler, informasi alokasi sumber daya GPU aktual mungkin berbeda dari yang ada dalam buku sumber daya perangkat scheduler. Dalam skenario ini, scheduler masih dapat menjadwalkan pod tertentu yang meminta sumber daya GPU ke node. Akibatnya, aplikasi Anda mungkin bersaing untuk sumber daya yang disediakan oleh GPU yang sama, seperti meminta sumber daya dari GPU yang sama, dan beberapa aplikasi mungkin gagal memulai karena sumber daya GPU yang tidak mencukupi.

    • Menggunakan metode sebelumnya juga dapat menyebabkan masalah lain yang tidak diketahui, seperti masalah yang dilaporkan oleh komunitas NVIDIA.

Prasyarat

Sebuah kluster ACK Pro yang menjalankan Kubernetes 1.20 atau lebih baru telah dibuat. Untuk informasi lebih lanjut, lihat Buat Kluster ACK yang Dikelola dan Perbarui Kluster ACK.

Prosedur

Langkah 1: Instal MPS Control Daemon

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

  2. Pergi ke halaman Marketplace, masukkan ack-mps-control di kotak pencarian, lalu klik ikon pencarian. Kemudian, klik komponen yang ditampilkan.

  3. Di halaman ack-mps-control, klik Deploy. Di panel Deploy, pilih cluster tempat Anda ingin menerapkan komponen dan klik Next.

  4. Di panel Create, pilih chart version yang ingin Anda instal dan klik OK.

    Penting

    Jika Anda meng-uninstall atau memperbarui ack-mps-control pada node, kesalahan mungkin terjadi pada aplikasi yang sedang berjalan yang membutuhkan sumber daya GPU pada node dan aplikasi mungkin keluar. Kami sarankan Anda melakukan operasi ini selama jam-jam sepi.

Langkah 2: Instal ack-ai-installer

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

  2. Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel navigasi kiri, pilih Applications > Cloud-native AI Suite.

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

  4. Di halaman 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 Anda menginstal suite AI cloud-native, komponen Berbagi GPU ack-ai-installer ditampilkan di bagian Components pada halaman Cloud-native AI Suite.

Langkah 3: Aktifkan berbagi GPU dan isolasi memori GPU

  1. Di halaman Clusters, temukan kluster untuk dikelola dan klik namanya. Di panel navigasi kiri, pilih Nodes > Node Pools.

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

  3. Di kotak dialog Create Node Pool, konfigurasikan parameter dan klik Confirm Order.

    Tabel berikut menjelaskan parameter utama. Untuk informasi lebih lanjut tentang parameter lainnya, lihat Buat Node Pool.

    Parameter

    Deskripsi

    Expected Nodes

    Tentukan jumlah awal node dalam node pool. Jika Anda tidak ingin membuat node dalam node pool, atur parameter ini ke 0.

    Catatan

    Setelah node pool dibuat, Anda dapat menambahkan node yang dipercepat GPU ke node pool. Untuk menambahkan node yang dipercepat GPU, Anda perlu mengatur arsitektur untuk jenis instance ke GPU-accelerated. Untuk informasi lebih lanjut, lihat Tambahkan instance ECS yang ada atau Buat dan kelola node pool.

    Node Labels

    Klik ikon 节点标签 di sebelah Node Labels. Atur key ke ack.node.gpu.schedule dan value ke mps.

    Penting
    • Sistem hanya akan menerapkan pod MPS Control Daemon pada node yang dipercepat GPU jika node tersebut memiliki label ack.node.gpu.schedule=mps. Setelah Anda menerapkan ack-ai-installer di kluster Anda, jika Anda menambahkan label ack.node.gpu.schedule=mps ke node, berbagi GPU dan isolasi memori GPU berbasis MPS diaktifkan untuk node tersebut.

Langkah 4: Instal alat inspeksi GPU

  1. Unduh kubectl-inspect-cgpu. File yang dapat dieksekusi harus diunduh ke direktori yang termasuk dalam variabel lingkungan PATH. Dalam contoh ini, /usr/local/bin/ digunakan.

    • Jika Anda menggunakan Linux, jalankan perintah berikut untuk mengunduh kubectl-inspect-cgpu:

      wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-linux -O /usr/local/bin/kubectl-inspect-cgpu
    • Jika Anda menggunakan macOS, jalankan perintah berikut untuk mengunduh kubectl-inspect-cgpu:

      wget http://aliacs-k8s-cn-beijing.oss-cn-beijing.aliyuncs.com/gpushare/kubectl-inspect-cgpu-darwin -O /usr/local/bin/kubectl-inspect-cgpu
  2. Jalankan perintah berikut untuk memberikan izin eksekusi ke kubectl-inspect-cgpu:

    chmod +x /usr/local/bin/kubectl-inspect-cgpu
  3. Jalankan perintah berikut untuk memeriksa penggunaan GPU kluster:

    kubectl inspect cgpu

    Output yang diharapkan:

    NAME                       IPADDRESS      GPU0(Allocated/Total)  GPU Memory(GiB)
    cn-shanghai.192.168.6.104  192.168.6.104  0/15                   0/15
    ----------------------------------------------------------------------
    Allocated/Total GPU Memory In Cluster:
    0/15 (0%)

Langkah 5: Terapkan aplikasi

  1. Gunakan template YAML berikut untuk membuat aplikasi:

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: mps-sample
    spec:
      parallelism: 1
      template:
        metadata:
          labels:
            app: mps-sample
        spec:
          hostIPC: true  # Parameter ini diperlukan. Jika Anda tidak menentukan parameter ini, pod gagal dimulai.
          hostPID: true  # Parameter ini opsional. Dalam contoh ini, parameter ini memungkinkan Anda melihat efek MPS dengan cara yang nyaman.
          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  # Pod ini mengajukan 7 GiB memori GPU.
            workingDir: /root
          restartPolicy: Never
    Catatan

    Setelah Anda mengaktifkan MPS untuk node, Anda harus menambahkan pengaturan hostIPC: true ke konfigurasi pod yang membutuhkan sumber daya GPU pada node. Jika tidak, pod gagal dimulai.

  2. Setelah pod dibuat dan memasuki status Running, jalankan perintah berikut untuk memeriksa apakah MPS diaktifkan.

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

    Output yang diharapkan:

    Tue Nov 12 11:09:35 2024
    +---------------------------------------------------------------------------------------+
    | 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 xxxxxxxxxxxxxx           On  | 00000000:00:07.0 Off |                    0 |
    | N/A   37C    P0              56W / 300W |    345MiB / 32768MiB |      0%   E. Process |
    |                                         |                      |                  N/A |
    +-----------------------------------------+----------------------+----------------------+
    
    +---------------------------------------------------------------------------------------+
    | Processes:                                                                            |
    |  GPU   GI   CI        PID   Type   Process name                            GPU Memory |
    |        ID   ID                                                             Usage      |
    |=======================================================================================|
    |    0   N/A  N/A    197792      C   nvidia-cuda-mps-server                       30MiB |
    |    0   N/A  N/A    387820    M+C   python                                      312MiB |
    +---------------------------------------------------------------------------------------+

    Output perintah nvidia-smi menunjukkan bahwa mps-server telah dimulai dan ID proses (PID) mps-server pada node adalah 197792. Selain itu, program Python (PID: 387820) telah dimulai, yang menunjukkan bahwa MPS diaktifkan.