Anda dapat menggunakan cGPU untuk mengisolasi sumber daya GPU. Ini memungkinkan beberapa kontainer berbagi satu GPU. cGPU menyediakan layanan eksternal sebagai komponen dari Container Service for Kubernetes (ACK) dan berlaku untuk skenario yang memerlukan kemampuan komputasi kinerja tinggi (HPC), seperti pembelajaran mesin, pembelajaran mendalam, dan skenario komputasi ilmiah. Anda dapat menggunakan cGPU untuk memanfaatkan sumber daya GPU secara efisien dan mempercepat tugas komputasi. Topik ini menjelaskan cara menginstal dan menggunakan cGPU.
Jika Anda menggunakan cGPU untuk mengisolasi sumber daya GPU, Anda tidak dapat meminta memori GPU melalui Unified Virtual Memory (UVM). Oleh karena itu, Anda tidak dapat memanggil cudaMallocManaged() dari Compute Unified Device Architecture (CUDA) API. Sebagai alternatif, Anda dapat menggunakan metode lain, seperti memanggil cudaMalloc(). Untuk informasi lebih lanjut, lihat Unified Memory for CUDA Beginners.
Prasyarat
Sebelum memulai operasi, pastikan instans yang dipercepat GPU Anda memenuhi persyaratan berikut:
Instans termasuk dalam salah satu keluarga instans berikut: gn7i, gn6i, gn6v, gn6e, gn5i, gn5, ebmgn7i, ebmgn6i, ebmgn7e, dan ebmgn6e.
Sistem operasi yang dijalankan oleh instans adalah CentOS, Ubuntu, atau Alibaba Cloud Linux (Alinux).
Driver Tesla versi 418.87.01 atau lebih baru telah diinstal pada instans.
Docker versi 19.03.5 atau lebih baru telah diinstal pada instans.
Instal cGPU
Kami merekomendasikan penggunaan lingkungan runtime Docker ACK untuk menginstal dan menggunakan cGPU, baik untuk pengguna perusahaan maupun individu.
Jika Anda menginstal cGPU versi 1.5.7, driver kernel cGPU mungkin terkunci karena proses paralel saling mengganggu, menyebabkan masalah Linux Kernel Panic. Untuk mencegah masalah kernel pada bisnis baru Anda, kami merekomendasikan agar Anda menginstal cGPU versi 1.5.8 atau lebih baru, atau memperbarui cGPU ke versi tersebut.
Buat kluster.
Untuk informasi lebih lanjut, lihat Buat Kluster ACK yang Dikelola.
Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel navigasi di sebelah kiri, pilih .
Di bagian Basic Capabilities, pilih opsi Scheduling Policy Extension (Batch Task Scheduling, GPU Sharing, Topology-aware GPU Scheduling).
Di bagian bawah halaman, klik Deploy Cloud-native AI Suite.
Setelah cGPU diinstal, Anda dapat melihat bahwa komponen ack-ai-installer berada dalam status Deployed di halaman Cloud-native AI Suite.
Di halaman Cloud-native AI Suite, klik Deploy.
Gunakan cGPU
Bagian ini memberikan contoh cara menggunakan cGPU untuk memungkinkan dua kontainer berbagi satu GPU. Contoh ini menggunakan instans ecs.gn6i-c4g1.xlarge.
Jalankan cGPU
Jalankan perintah berikut untuk membuat kontainer dan tentukan memori GPU yang dialokasikan ke kontainer.
Dalam contoh ini,
ALIYUN_COM_GPU_MEM_CONTAINERmenentukan memori GPU yang dialokasikan ke kontainer, danALIYUN_COM_GPU_MEM_DEVmenentukan total memori GPU yang dikonfigurasi. Kontainer berikut dibuat:gpu_test1: Kontainer ini dialokasikan 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-py3gpu_test2: Kontainer ini dialokasikan 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
CatatanDalam perintah di atas, gambar TensorFlow
nvcr.io/nvidia/tensorflow:19.10-py3digunakan. Ganti gambar dengan gambar kontainer Anda sesuai kebutuhan bisnis. Untuk informasi lebih lanjut tentang cara menggunakan gambar TensorFlow untuk membangun kerangka kerja pembelajaran mendalam TensorFlow, lihat Deploy Lingkungan NGC untuk Pengembangan Pembelajaran Mendalam.Jalankan perintah berikut untuk melihat informasi GPU tentang kontainer, seperti memori GPU:
sudo docker exec -i gpu_test1 nvidia-smiDalam contoh ini, kontainer gpu_test1 digunakan. Gambar berikut menunjukkan bahwa memori GPU kontainer adalah 6.043 MiB.

Lihat cGPU menggunakan node procfs
Runtime cGPU menghasilkan beberapa node sistem file proc (procfs) di direktori /proc/cgpu_km dan mengelola node secara otomatis. Anda dapat melihat informasi cGPU dan mengonfigurasi pengaturan cGPU menggunakan node procfs.
Jalankan perintah berikut untuk melihat informasi tentang node procfs:
ls /proc/cgpu_km/Gambar berikut menunjukkan output perintah.

Jalankan perintah berikut untuk melihat parameter di direktori GPU.
Dalam contoh ini, direktori GPU 0 digunakan.
ls /proc/cgpu_km/0Gambar berikut menunjukkan output perintah.

Jalankan perintah berikut untuk melihat parameter di direktori kontainer.
Dalam contoh ini, direktori kontainer 012b2edccd7a digunakan.
ls /proc/cgpu_km/0/012b2edccd7aGambar berikut menunjukkan output perintah.

(Opsional) Jalankan perintah berikut untuk mengonfigurasi cGPU:
Setelah Anda terbiasa dengan node procfs, Anda dapat menjalankan perintah pada instans yang dipercepat GPU untuk melakukan operasi, seperti mengubah kebijakan penjadwalan dan bobot. Tabel berikut menjelaskan contoh perintah.
Perintah
Efek
echo 2 > /proc/cgpu_km/0/policy
Mengubah kebijakan penjadwalan menjadi penjadwalan preemptive berbasis bobot.
cat /proc/cgpu_km/0/free_weight
Menanyakan bobot tersedia pada GPU. Jika
free_weightdisetel ke 0, bobot kontainer baru adalah 0. Dalam hal ini, kontainer tidak dapat memperoleh daya komputasi GPU dan tidak dapat digunakan untuk menjalankan aplikasi yang memerlukan daya komputasi GPU.cat /proc/cgpu_km/0/$dockerid/weight
Menanyakan bobot kontainer tertentu.
echo 4 > /proc/cgpu_km/0/$dockerid/weight
Mengubah bobot berdasarkan mana kontainer memperoleh daya komputasi GPU.
Lihat kontainer cGPU menggunakan cgpu-smi
Anda dapat menggunakan cgpu-smi untuk melihat informasi tentang kontainer yang menggunakan cGPU, termasuk ID kontainer, pemanfaatan GPU, batas daya komputasi, penggunaan memori GPU, dan total memori yang dialokasikan.
cgpu-smi menyediakan informasi pemantauan sampel tentang cGPU. Saat menerapkan aplikasi Kubernetes, Anda dapat merujuk atau menggunakan informasi pemantauan sampel untuk pengembangan kustom dan integrasi.
Gambar berikut menunjukkan informasi pemantauan sampel yang disediakan oleh cgpu-smi.

Perbarui atau uninstall cGPU
Perbarui cGPU
cGPU mendukung pembaruan dingin dan panas.
Cold update
Jika cGPU tidak digunakan untuk Docker, Anda dapat melakukan pembaruan dingin pada cGPU. Lakukan langkah-langkah berikut:
Jalankan perintah berikut untuk menghentikan semua kontainer yang sedang berjalan:
sudo docker stop $(docker ps -a | awk '{ print $1}' | tail -n +2)Jalankan perintah berikut untuk memperbarui cGPU ke versi terbaru:
sudo sh upgrade.sh
Hot update
Jika cGPU digunakan untuk Docker, Anda dapat melakukan pembaruan panas pada driver kernel cGPU. Batasan tertentu diberlakukan pada versi yang dapat diperbarui. Jika Anda memerlukan bantuan, hubungi insinyur purna jual Alibaba Cloud.
Uninstall cGPU
Untuk informasi lebih lanjut tentang cara menguninstall cGPU versi sebelumnya dari sebuah node, lihat Perbarui Versi cGPU pada Sebuah Node.
Contoh penggunaan cGPU
Gunakan cGPU untuk menjadwalkan daya komputasi
Saat cGPU memuat modul cgpu_km, cGPU menetapkan irisan waktu (X ms) untuk setiap GPU berdasarkan jumlah maksimum kontainer (max_inst) untuk mengalokasikan daya komputasi GPU ke kontainer. Dalam contoh berikut, irisan waktu Slice 1, Slice 2, dan Slice N digunakan. Contoh berikut menunjukkan cara daya komputasi GPU dialokasikan menggunakan kebijakan penjadwalan yang berbeda.
Penjadwalan Fair-share (policy = 0)
Saat membuat kontainer, cGPU mengalokasikan irisan waktu ke kontainer. cGPU mulai menjadwalkan dari Slice 1. Tugas penjadwalan dikirimkan ke GPU fisik dan dieksekusi dalam kontainer dalam irisan waktu (X ms). Kemudian, cGPU beralih ke irisan waktu berikutnya. Setiap kontainer memperoleh daya komputasi yang sama, yaitu
1/max_inst. Gambar berikut menunjukkan detailnya.Penjadwalan Preemptive (policy = 1)
Saat membuat kontainer, cGPU mengalokasikan irisan waktu ke kontainer. cGPU mulai menjadwalkan dari Slice 1. Namun, jika tidak ada kontainer yang digunakan dalam Slice 1 atau jika perangkat GPU tidak dimulai oleh proses di kontainer, cGPU melewati penjadwalan dalam Slice 1 dan beralih ke irisan waktu berikutnya.
Contoh:
Anda hanya membuat kontainer bernama Docker 1, dan mengalokasikan Slice 1 serta menjalankan dua proses TensorFlow di kontainer. Dalam hal ini, Docker 1 dapat memperoleh daya komputasi seluruh GPU fisik.
Kemudian, Anda membuat kontainer bernama Docker 2 dan mengalokasikan Slice 2 ke kontainer. Jika perangkat GPU tidak dimulai oleh proses di Docker 2, cGPU melewati penjadwalan untuk Docker 2 dalam Slice 2.
Jika perangkat GPU dimulai oleh proses di Docker 2, cGPU melakukan penjadwalan dalam Slice 1 dan Slice 2. Docker 1 dan Docker 2 dapat memperoleh hingga setengah dari daya komputasi GPU fisik. Gambar berikut menunjukkan detailnya.
Penjadwalan Preemptive Berbasis Bobot (policy = 2)
Jika ALIYUN_COM_GPU_SCHD_WEIGHT disetel ke nilai lebih besar dari 1 saat membuat kontainer, penjadwalan preemptive berbasis bobot digunakan. cGPU membagi daya komputasi GPU fisik menjadi max_inst bagian berdasarkan jumlah kontainer (max_inst). Jika ALIYUN_COM_GPU_SCHD_WEIGHT disetel ke nilai lebih besar dari 1, cGPU menggabungkan beberapa irisan waktu menjadi irisan waktu yang lebih besar dan mengalokasikan irisan waktu tersebut ke kontainer.
Konfigurasi Sampel:
Docker 1: ALIYUN_COM_GPU_SCHD_WEIGHT = m
Docker 2: ALIYUN_COM_GPU_SCHD_WEIGHT = n
Hasil Penjadwalan:
Jika hanya Docker 1 yang berjalan, Docker 1 mempreempt daya komputasi seluruh GPU fisik.
Jika Docker 1 dan Docker 2 berjalan, Docker 1 dan Docker 2 memperoleh daya komputasi pada rasio teoretis m:n. Dibandingkan dengan penjadwalan preemptive, Docker 2 mengonsumsi n irisan waktu meskipun perangkat GPU tidak dimulai oleh proses di Docker 2.
CatatanKinerja kontainer berbeda saat m:n disetel ke 2:1 dan 8:4. Jumlah irisan waktu dalam 1 detik saat m:n disetel ke 2:1 adalah empat kali jumlah irisan waktu dalam 1 detik saat m:n disetel ke 8:4.
Penjadwalan preemptive berbasis bobot membatasi daya komputasi GPU maksimum teoretis yang dapat diperoleh kontainer. Namun, untuk GPU yang menyediakan daya komputasi kuat seperti GPU NVIDIA V100, tugas komputasi dapat diselesaikan hanya dalam satu irisan waktu jika memori GPU kecil digunakan. Dalam hal ini, jika m:n disetel ke 8:4, daya komputasi GPU menjadi idle selama sisa irisan waktu dan batas pada daya komputasi GPU maksimum teoretis menjadi tidak valid.
Penjadwalan Tetap (policy = 3)
Anda dapat menggunakan ALIYUN_COM_GPU_SCHD_WEIGHT bersama dengan max_inst untuk menetapkan persentase daya komputasi.
Penjadwalan Lunak (policy = 4)
Saat membuat kontainer, cGPU mengalokasikan irisan waktu ke kontainer. Dibandingkan dengan penjadwalan preemptive, penjadwalan lunak mengisolasi sumber daya GPU dengan cara yang lebih lembut. Untuk informasi lebih lanjut, lihat Penjadwalan Preemptive (policy = 1).
Penjadwalan Native (policy = 5)
Anda dapat menggunakan kebijakan ini untuk mengisolasi hanya memori GPU. Saat kebijakan ini digunakan, daya komputasi dijadwalkan berdasarkan metode penjadwalan bawaan driver GPU NVIDIA.
Kebijakan penjadwalan untuk daya komputasi didukung untuk semua instans heterogen GPU-accelerated milik Alibaba Cloud dan GPU NVIDIA yang digunakan untuk instans tersebut, termasuk Tesla P4, Tesla P100, Tesla T4, Tesla V100, dan Tesla A10 GPU. Dalam contoh ini, dua kontainer yang berbagi instans yang dipercepat GPU yang dikonfigurasi dengan GPU Tesla A10 diuji. Rasio daya komputasi kontainer adalah 1:2. Setiap kontainer memperoleh 12 GiB memori GPU.
Data uji kinerja berikut disediakan hanya untuk referensi.
Uji 1: Data kinerja model ResNet50 yang dilatih menggunakan framework TensorFlow pada nilai batch_size yang berbeda dibandingkan. Presisi FP16 digunakan. Bagian berikut menunjukkan hasil uji.
Framework
Model
batch_size
Presisi
Gambar per detik Docker 1
Gambar per detik 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: Data kinerja model ResNet50 yang dilatih menggunakan framework TensorRT pada nilai batch_size yang berbeda dibandingkan. Presisi FP16 digunakan. Bagian berikut menunjukkan hasil uji.
Framework
Model
batch_size
Presisi
Gambar per detik Docker 1
Gambar per detik 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
Gunakan cGPU untuk mengalokasikan memori ke beberapa GPU
Dalam contoh berikut, empat GPU dikonfigurasi. GPU 0, GPU 1, GPU 2, dan GPU 3 secara terpisah dialokasikan 3 GiB, 4 GiB, 5 GiB, dan 6 GiB memori. Kode sampel:
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-smiOutput perintah berikut menunjukkan detail memori GPU.
Anda dapat menggunakan ALIYUN_COM_GPU_MEM_CONTAINER untuk mengalokasikan memori ke beberapa GPU. Tabel berikut menjelaskan nilai ALIYUN_COM_GPU_MEM_CONTAINER.
Nilai | Deskripsi |
ALIYUN_COM_GPU_MEM_CONTAINER=3 | Memori masing-masing dari empat GPU disetel ke 3 GiB. |
ALIYUN_COM_GPU_MEM_CONTAINER=3,1 | Memori dari empat GPU disetel ke 3 GiB, 1 GiB, 1 GiB, dan 1 GiB secara berurutan. |
ALIYUN_COM_GPU_MEM_CONTAINER=3,4,5,6 | Memori dari empat GPU disetel ke 3 GiB, 4 GiB, 5 GiB, dan 6 GiB secara berurutan. |
ALIYUN_COM_GPU_MEM_CONTAINER tidak ditentukan | cGPU dinonaktifkan. |
ALIYUN_COM_GPU_MEM_CONTAINER=0 | |
ALIYUN_COM_GPU_MEM_CONTAINER=1,0,0 |