cGPU mengisolasi sumber daya GPU sehingga memungkinkan beberapa kontainer berbagi satu kartu GPU. Fitur ini merupakan komponen dari Container Service for Kubernetes (ACK) yang dirancang untuk beban kerja high performance computing (HPC), seperti machine learning, deep learning, dan scientific computing, serta membantu mempercepat tugas komputasi dengan memanfaatkan sumber daya GPU secara lebih efisien. Topik ini menjelaskan cara menginstal dan menggunakan cGPU .
Karena isolasi cGPU tidak mendukung Unified Virtual Memory (UVM), Anda tidak dapat memanggil cudaMallocManaged() untuk mengalokasikan memori GPU. Sebagai gantinya, gunakan cudaMalloc(). Untuk informasi selengkapnya, lihat dokumentasi NVIDIA.
Prasyarat
Pastikan instans yang dipercepat GPU Anda memenuhi persyaratan berikut:
-
Keluarga instans adalah salah satu dari berikut: gn7i, gn6i, gn6v, gn6e, gn5i, gn5, ebmgn7i, ebmgn6i, ebmgn7e, ebmgn6e.
-
Sistem operasi adalah salah satu dari berikut: CentOS, Ubuntu, atau Alibaba Cloud Linux.
-
Driver Tesla 418.87.01 atau versi yang lebih baru telah diinstal.
-
Docker 19.03.5 atau versi yang lebih baru telah diinstal.
Instal cGPU
Disarankan untuk menginstal dan menggunakan cGPU dalam runtime Docker ACK.
Menginstal cGPU versi 1.5.7 dapat menyebabkan deadlock (di mana proses konkuren saling memblokir) pada driver kernel cGPU, yang berpotensi memicu Linux Kernel Panic. Untuk menghindari error kernel pada beban kerja baru, disarankan menginstal cGPU versi 1.5.8 atau yang lebih baru, atau melakukan upgrade bertahap dari versi sebelumnya ke 1.5.8 atau yang lebih baru.
-
Buat kluster.
Untuk informasi selengkapnya, lihat Buat kluster ACK yang dikelola.
Pada halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik .
-
Pada bagian Basic capabilities, pilih Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).
-
Di bagian bawah halaman, klik Deploy Cloud-native AI Suite.
Setelah instalasi, komponen ack-ai-installer muncul dalam daftar komponen pada halaman Cloud-native AI Suite.
Pada halaman Cloud-native AI Suite, klik Deploy.
Gunakan cGPU
Topik ini menunjukkan cara dua kontainer pada instans ecs.gn6i-c4g1.xlarge berbagi satu GPU.
Menjalankan kontainer dengan cGPU
-
Jalankan perintah berikut untuk membuat kontainer dan mengatur memori GPU yang terlihat oleh masing-masing kontainer.
Dalam contoh ini, variabel lingkungan
ALIYUN_COM_GPU_MEM_CONTAINERdanALIYUN_COM_GPU_MEM_DEVdiatur untuk menentukan memori GPU yang terlihat oleh kontainer dan total memori GPU perangkat.-
gpu_test1: mengalokasikan 6 GiB memori GPU.
sudo docker run -d -t --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --name gpu_test1 -v /mnt:/mnt -e ALIYUN_COM_GPU_MEM_CONTAINER=6 -e ALIYUN_COM_GPU_MEM_DEV=15 nvcr.io/nvidia/tensorflow:19.10-py3 -
gpu_test2: mengalokasikan 8 GiB memori GPU.
sudo docker run -d -t --gpus all --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --name gpu_test2 -v /mnt:/mnt -e ALIYUN_COM_GPU_MEM_CONTAINER=8 -e ALIYUN_COM_GPU_MEM_DEV=15 nvcr.io/nvidia/tensorflow:19.10-py3
CatatanPerintah-perintah tersebut menggunakan gambar kontainer TensorFlow
nvcr.io/nvidia/tensorflow:19.10-py3sebagai contoh. Gantilah dengan gambar kontainer Anda sendiri. Untuk informasi selengkapnya tentang cara menggunakan gambar TensorFlow untuk membangun framework deep learning TensorFlow, lihat Deploy lingkungan NGC untuk pengembangan deep learning. -
-
Jalankan perintah berikut untuk melihat informasi GPU kontainer, seperti memori GPU.
sudo docker exec -i gpu_test1 nvidia-smiSebagai contoh, memori GPU yang terlihat oleh kontainer gpu_test1 adalah 6.043 MiB, seperti yang ditunjukkan pada output berikut:
NVIDIA-SMI 440.33.01 Driver Version: 440.33.01 CUDA Version: 10.2 +-----------------------------------------------------------------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |=============================================================================| | 0 Tesla T4 On | 00000000:00:08.0 Off | 0 | | N/A 29C P8 9W / 70W | 0MiB / 6043MiB | 0% Default | +-----------------------------------------------------------------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | No running processes found | +-----------------------------------------------------------------------------+
Menampilkan informasi cGPU dengan node procfs
Saat cGPU berjalan, sistem secara otomatis menghasilkan dan mengelola beberapa node filesystem proc (procfs) dalam direktori /proc/cgpu_km. Anda dapat menggunakan node procfs ini untuk melihat dan mengonfigurasi informasi cGPU.
-
Jalankan perintah berikut untuk melihat informasi tentang node procfs.
ls /proc/cgpu_km/Output berikut dikembalikan:
0 default_memsize inst_ctl upgrade version -
Jalankan perintah berikut untuk melihat isi direktori GPU.
Contoh ini menggunakan GPU 0.
ls /proc/cgpu_km/0Output berikut dikembalikan:
012b2edccd7a 0852a381c0cf free_weight major max_inst policy prio_ratio -
Jalankan perintah berikut untuk melihat isi direktori kontainer.
Contoh ini menggunakan kontainer
012b2edccd7a.ls /proc/cgpu_km/0/012b2edccd7aOutput berikut dikembalikan:
highprio id meminfo memsize weight -
(Opsional) Jalankan perintah berikut untuk mengonfigurasi cGPU.
Anda dapat menggunakan node procfs untuk menjalankan perintah pada instans yang dipercepat GPU guna mengganti kebijakan penjadwalan, mengubah bobot, dan melakukan operasi lainnya. Tabel berikut memberikan contoh perintah.
Perintah
Efek
echo 2 > /proc/cgpu_km/0/policy
Mengganti kebijakan penjadwalan ke penjadwalan preemptive berbasis bobot.
cat /proc/cgpu_km/0/free_weight
Menampilkan bobot yang tersedia pada GPU. Jika
free_weight=0, kontainer yang baru dibuat diberi bobot 0. Kontainer tersebut tidak dapat memperoleh daya komputasi GPU.cat /proc/cgpu_km/0/$dockerid/weight
Menampilkan bobot kontainer tertentu.
echo 4 > /proc/cgpu_km/0/$dockerid/weight
Memodifikasi bobot daya komputasi untuk kontainer.
Menampilkan kontainer cGPU dengan cgpu-smi
Anda dapat menggunakan cgpu-smi untuk melihat informasi tentang kontainer cGPU, termasuk ID kontainer, pemanfaatan GPU, batas daya komputasi, memori GPU yang digunakan, dan total memori GPU yang dialokasikan.
cgpu-smi adalah contoh alat pemantauan untuk cGPU. Saat Anda mendeploy aplikasi di Kubernetes (k8s), Anda dapat menggunakan atau menyesuaikan alat cgpu-smi untuk integrasi kustom.
| Alibaba Cloud cGPU1.0 cGPU Version: 1.0.2
+---+----------------+----------+----------------+-----------------------+
|GPU| pod | highprio | GPU-Util/Limit | GPU Memory Usage/Total|
+===+================+==========+================+=======================+
| 0| 7db8fff70a0d | 0 | 41/ 50 | 9459/11463 |
| 0| 91b1e19795ee | 0 | 30/ 50 | 9457/11463 |
+---+----------------+----------+----------------+-----------------------+
Upgrade atau uninstal cGPU
Upgrade cGPU
cGPU mendukung pembaruan dingin (cold update) dan pembaruan panas (hot update).
-
Cold update
Untuk melakukan cold update ketika Docker tidak menggunakan cGPU:
-
Hentikan semua kontainer yang sedang berjalan:
sudo docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2) -
Upgrade cGPU ke versi terbaru:
sudo sh upgrade.sh
-
-
Hot update
Jika Docker sedang menggunakan cGPU, Anda dapat melakukan hot update pada driver kernel cGPU. Namun, metode pembaruan ini tunduk pada batasan versi. Hubungi tim dukungan purnajual Alibaba Cloud untuk bantuan.
Uninstal cGPU
Untuk menguninstal versi cGPU sebelumnya dari sebuah node, lihat Upgrade versi cGPU node.
Contoh penggunaan cGPU
Penjadwalan daya komputasi
Saat cGPU memuat modul cgpu_km, sistem mengatur time slice (dalam milidetik) untuk setiap GPU berdasarkan jumlah maksimum kontainer (max_inst). Time slice ini—disebut Slice 1, Slice 2, hingga Slice N dalam topik ini—digunakan untuk mengalokasikan daya komputasi GPU ke kontainer. Contoh berikut menunjukkan berbagai kebijakan penjadwalan.
-
Penjadwalan fair-share (policy=0)
Saat membuat kontainer, cGPU mengalokasikan time slice untuk masing-masing. Penjadwal dimulai dengan Slice 1, mengirimkan tugas ke GPU fisik selama satu time slice, lalu beralih ke time slice berikutnya. Setiap kontainer menerima bagian daya komputasi yang sama, yaitu
1/max_inst, seperti yang ditunjukkan pada gambar berikut. -
Penjadwalan preemptive (policy=1)
Saat membuat kontainer, cGPU mengalokasikan time slice kepada mereka. Penjadwal dimulai dengan Slice 1. Namun, jika tidak ada proses dalam kontainer yang mengakses GPU, penjadwal melewati time slice kontainer tersebut dan beralih ke berikutnya.
Contoh:
-
Anda membuat satu kontainer, Docker 1, yang dialokasikan Slice 1. Jika Anda menjalankan dua proses TensorFlow di Docker 1, kontainer tersebut dapat menggunakan daya komputasi seluruh GPU fisik.
-
Kemudian Anda membuat kontainer kedua, Docker 2, yang dialokasikan Slice 2. Jika tidak ada proses di Docker 2 yang mengakses GPU, penjadwal melewati time slice-nya (Slice 2).
-
Ketika proses di Docker 2 mulai mengakses GPU, Slice 1 dan Slice 2 keduanya dimasukkan dalam siklus penjadwalan. Docker 1 dan Docker 2 masing-masing dapat menerima hingga separuh daya komputasi GPU fisik, seperti yang ditunjukkan pada gambar berikut.
-
-
Penjadwalan preemptive berbasis bobot (policy=2)
Jika Anda mengatur
ALIYUN_COM_GPU_SCHD_WEIGHTke nilai lebih besar dari 1 saat membuat kontainer, cGPU secara otomatis menggunakan kebijakan ini. cGPU membagi daya komputasi GPU fisik menjadimax_instbagian. JikaALIYUN_COM_GPU_SCHD_WEIGHTlebih besar dari 1, cGPU menggabungkan beberapa time slice menjadi satu slice yang lebih besar untuk kontainer tersebut.Konfigurasi contoh:
-
Docker 1: ALIYUN_COM_GPU_SCHD_WEIGHT=m
-
Docker 2: ALIYUN_COM_GPU_SCHD_WEIGHT=n
Perilaku penjadwalan:
-
Jika hanya Docker 1 yang berjalan, ia merebut daya komputasi seluruh GPU fisik.
-
Jika Docker 1 dan Docker 2 keduanya berjalan, mereka menerima daya komputasi dengan rasio teoretis m:n. Berbeda dengan penjadwalan preemptive, Docker 2 mengonsumsi n time slice meskipun tidak ada proses di dalamnya yang menggunakan GPU.
CatatanPerforma berbeda ketika rasio m:n diatur ke 2:1 dibandingkan dengan 8:4. Dalam kasus 2:1, jumlah pergantian time slice per detik empat kali lebih tinggi daripada kasus 8:4.
Penjadwalan preemptive berbasis bobot menetapkan batas maksimum teoretis pada daya komputasi GPU yang dapat digunakan kontainer. Namun, untuk GPU yang kuat seperti NVIDIA V100, tugas komputasi singkat mungkin selesai dalam satu time slice. Dalam skenario ini, jika rasio m:n adalah 8:4, GPU menganggur selama time slice yang tersisa, sehingga batas tersebut menjadi tidak efektif.
-
-
Penjadwalan tetap (policy=3)
Anda dapat mengalokasikan persentase tetap daya komputasi dengan menentukan rasio antara
ALIYUN_COM_GPU_SCHD_WEIGHTdanmax_inst. -
Penjadwalan soft (policy=4)
Saat membuat kontainer, cGPU mengalokasikan time slice kepada mereka. Kebijakan ini memberikan isolasi yang lebih lemah dibandingkan penjadwalan preemptive. Untuk informasi selengkapnya, lihat Penjadwalan preemptive (policy=1).
-
Penjadwalan native (policy=5)
Kebijakan ini hanya mengisolasi memori GPU dan mengandalkan metode penjadwalan native dari driver GPU NVIDIA.
Kebijakan penjadwalan daya komputasi mendukung semua instans GPU-accelerated heterogen Alibaba Cloud dan GPU NVIDIA-nya, termasuk Tesla P4, Tesla P100, Tesla T4, Tesla V100, Tesla A10, . Pengujian berikut menggunakan dua kontainer yang berbagi satu instans GPU tunggal dengan GPU Tesla A10. Rasio daya komputasi antara kontainer adalah 1:2, dan memori GPU dibagi rata, masing-masing kontainer menerima 12 GB.
Hasil pengujian performa berikut berasal dari lingkungan laboratorium dan hanya untuk referensi.
-
Uji 1: Membandingkan performa model ResNet50 yang dilatih pada framework TensorFlow dengan presisi FP16 pada berbagai nilai
batch_size. Hasilnya ditunjukkan di bawah ini:Framework
Model
batch_size
Presisi
Images/sec (Docker 1)
Images/sec (Docker 2)
TensorFlow
ResNet50
16
FP16
151
307
TensorFlow
ResNet50
32
FP16
204
418
TensorFlow
ResNet50
64
FP16
247
503
TensorFlow
ResNet50
128
FP16
257
516

-
Uji 2: Membandingkan performa model ResNet50 yang dilatih pada framework TensorRT dengan presisi FP16 pada berbagai nilai
batch_size. Hasilnya ditunjukkan di bawah ini:Framework
Model
batch_size
Presisi
Images/sec (Docker 1)
Images/sec (Docker 2)
TensorRT
ResNet50
1
FP16
568,05
1132,08
TensorRT
ResNet50
2
FP16
940,36
1884,12
TensorRT
ResNet50
4
FP16
1304,03
2571,91
TensorRT
ResNet50
8
FP16
1586,87
3055,66
TensorRT
ResNet50
16
FP16
1783,91
3381,72
TensorRT
ResNet50
32
FP16
1989,28
3695,88
TensorRT
ResNet50
64
FP16
2105,81
3889,35
TensorRT
ResNet50
128
FP16
2205,25
3901,94

Pemartisian memori multi-GPU
Contoh ini menunjukkan cara mempartisi memori di empat GPU, mengalokasikan 3 GB ke GPU 0, 4 GB ke GPU 1, 5 GB ke GPU 2, dan 6 GB ke GPU 3. Kode contohnya sebagai berikut:
docker run -d -t --runtime=nvidia --name gpu_test0123 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 -v /mnt:/mnt -e ALIYUN_COM_GPU_MEM_CONTAINER=3,4,5,6 -e ALIYUN_COM_GPU_MEM_DEV=23 -e NVIDIA_VISIBLE_DEVICES=0,1,2,3 nvcr.io/nvidia/tensorflow:21.03-tf1-py3
docker exec -i gpu_test0123 nvidia-smi
Output perintah menunjukkan detail memori keempat GPU.
NVIDIA-SMI 510.39 Driver Version: 510.39 CUDA Version: 11.6
-------------------------------+----------------------+----------------------+
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 NVIDIA A10 On | 00000000:61:00.0 Off | 0 |
0% 31C P8 15W / 150W | 0MiB / 3003MiB | 0% Default |
| | N/A |
+-------------------------------+----------------------+----------------------+
1 NVIDIA A10 On | 00000000:6B:00.0 Off | 0 |
0% 31C P8 16W / 150W | 0MiB / 4004MiB | 0% Default |
| | N/A |
+-------------------------------+----------------------+----------------------+
2 NVIDIA A10 On | 00000000:CA:00.0 Off | 0 |
0% 30C P8 15W / 150W | 0MiB / 5006MiB | 0% Default |
| | N/A |
+-------------------------------+----------------------+----------------------+
3 NVIDIA A10 On | 00000000:E3:00.0 Off | 0 |
0% 31C P8 16W / 150W | 0MiB / 6007MiB | 0% Default |
| | N/A |
+-------------------------------+----------------------+----------------------+
Tabel berikut menjelaskan parameter ALIYUN_COM_GPU_MEM_CONTAINER untuk konfigurasi multi-GPU.
|
Nilai |
Deskripsi |
|
ALIYUN_COM_GPU_MEM_CONTAINER=3 |
Mengatur memori GPU keempat GPU menjadi 3 GB. |
|
ALIYUN_COM_GPU_MEM_CONTAINER=3,1 |
Mengatur memori GPU keempat GPU menjadi 3 GB, 1 GB, 1 GB, dan 1 GB, masing-masing. |
|
ALIYUN_COM_GPU_MEM_CONTAINER=3,4,5,6 |
Mengatur memori GPU keempat GPU menjadi 3 GB, 4 GB, 5 GB, dan 6 GB, masing-masing. |
|
ALIYUN_COM_GPU_MEM_CONTAINER tidak ditentukan |
Menonaktifkan cGPU. |
|
ALIYUN_COM_GPU_MEM_CONTAINER=0 |
|
|
ALIYUN_COM_GPU_MEM_CONTAINER=1,0,0 |