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 -Auntuk memeriksa status pod MPS Control Daemon.Saat menjalankan MPS Control Daemon di dalam kontainer, kontainer harus memiliki izin
privileged,hostIPC, danhostPID. Risiko keamanan mungkin timbul dari izin tersebut. Berhati-hatilah sebelum Anda mengaktifkan MPS.Pod MPS Control Daemon menggunakan konfigurasi
priorityClassName: system-node-criticaluntuk 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, ataunerdctl, untuk membuat kontainer dan meminta sumber daya GPU untuk kontainer tersebut. Misalnya, jangan jalankan perintahdocker run --gpus allataudocker run -e NVIDIA_VISIBLE_DEVICES=alldan jalankan aplikasi yang intensif 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 untuk pod dan menjalankan aplikasi yang intensif GPU.Jangan atur
NVIDIA_VISIBLE_DEVICES=alldan jalankan aplikasi yang intensif GPU saat Anda membangun gambar kontainer jika variabel lingkunganNVIDIA_VISIBLE_DEVICEStidak ditentukan dalam file YAML pod.Jangan tambahkan
privileged: trueke bagiansecurityContextdalam 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
Masuk ke Konsol ACK. Di panel navigasi kiri, pilih .
Pergi ke halaman Marketplace, masukkan ack-mps-control di kotak pencarian, lalu klik ikon pencarian. Kemudian, klik komponen yang ditampilkan.
Di halaman ack-mps-control, klik Deploy. Di panel Deploy, pilih cluster tempat Anda ingin menerapkan komponen dan klik Next.
Di panel Create, pilih chart version yang ingin Anda instal dan klik OK.
PentingJika 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
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel navigasi kiri, pilih .
Di halaman Cloud-native AI Suite, klik Deploy.
Di halaman Cloud-native AI Suite, pilih Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).
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
Di halaman Clusters, temukan kluster untuk dikelola dan klik namanya. Di panel navigasi kiri, pilih .
Di halaman Node Pools, klik Create Node Pool.
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.
CatatanSetelah 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.PentingSistem 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 labelack.node.gpu.schedule=mpske node, berbagi GPU dan isolasi memori GPU berbasis MPS diaktifkan untuk node tersebut.
Langkah 4: Instal alat inspeksi GPU
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-cgpuJika 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
Jalankan perintah berikut untuk memberikan izin eksekusi ke kubectl-inspect-cgpu:
chmod +x /usr/local/bin/kubectl-inspect-cgpuJalankan perintah berikut untuk memeriksa penggunaan GPU kluster:
kubectl inspect cgpuOutput 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
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: NeverCatatanSetelah Anda mengaktifkan MPS untuk node, Anda harus menambahkan pengaturan
hostIPC: trueke konfigurasi pod yang membutuhkan sumber daya GPU pada node. Jika tidak, pod gagal dimulai.Setelah pod dibuat dan memasuki status Running, jalankan perintah berikut untuk memeriksa apakah MPS diaktifkan.
kubectl exec -ti mps-sample-xxxxx -- nvidia-smiOutput 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-smimenunjukkan bahwamps-servertelah dimulai dan ID proses (PID) mps-server pada node adalah 197792. Selain itu, program Python (PID: 387820) telah dimulai, yang menunjukkan bahwa MPS diaktifkan.