Container Service for Kubernetes (ACK) memungkinkan Anda menggunakan kolam node untuk mengontrol cGPU. Dengan cara ini, Anda dapat membuat kebijakan berbagi GPU dan isolasi memori yang lebih fleksibel. Topik ini menjelaskan cara menggunakan dua kolam node berlabel dalam klaster ACK Pro untuk mengontrol kemampuan berbagi GPU dan isolasi memori dari cGPU.
Skenario penggunaan
Hanya klaster khusus ACK yang berisi node dengan akselerasi GPU yang mendukung komponen ack-cgpu. Klaster terkelola ACK yang berisi node dengan akselerasi GPU tidak mendukung komponen ack-cgpu.
Untuk menginstal ack-cgpu di klaster ACK Pro, lihat Mengelola Komponen Berbagi GPU.
Prasyarat
Sebelum memulai, pastikan langkah-langkah berikut telah selesai:
Kolam node telah dikonfigurasi.
Anda dapat menyesuaikan nama kolam node. Dalam contoh ini, digunakan dua kolam node bernama cgpu dan cgpu-no-isolation.
Nama kolam node
Berbagi GPU
Isolasi memori
Label
cgpu
Diaktifkan
Diaktifkan
cgpu=true
cgpu.disable.isolation=false
cgpu-no-isolation
Diaktifkan
Dinonaktifkan
cgpu=true
cgpu.disable.isolation=true
Informasi latar belakang
Saat menggunakan cGPU dalam klaster ACK, Anda mungkin menemui skenario berikut:
Jumlah Memori GPU yang dapat dialokasikan untuk Job A sudah ditentukan dalam skrip. Dalam hal ini, klaster ACK hanya perlu mengaktifkan berbagi GPU untuk Job A. Isolasi memori tidak diperlukan.
Jumlah Memori GPU yang dapat dialokasikan untuk Job B tidak ditentukan dalam skrip. Dalam hal ini, klaster ACK harus mengaktifkan baik berbagi GPU maupun isolasi memori untuk Job B.
Bagaimana cara mengonfigurasi klaster ACK untuk mendukung kedua skenario tersebut?
Untuk menyelesaikan masalah ini, Anda dapat menggunakan kolam node untuk mengontrol cGPU. Buat dua kolam node sebagai berikut:
Buat kolam node yang hanya mendukung berbagi GPU. Kolam node ini digunakan untuk menjalankan Job A.
Buat kolam node lain yang mendukung baik berbagi GPU maupun isolasi memori. Kolam node ini digunakan untuk menjalankan Job B.
Catatan penggunaan
Saat menggunakan kolam node untuk mengontrol cGPU, perhatikan batasan berikut:
Jika pekerjaan tidak dikonfigurasi dengan pemilih node, pod dari pekerjaan tersebut mungkin dijadwalkan ke kolam node lain. Ini dapat menyebabkan kesalahan eksekusi pekerjaan.
PentingDisarankan untuk mengonfigurasi pemilih node untuk setiap pekerjaan.
Saat label node diubah, misalnya, label node diubah dari cgpu.disable.isolation=false menjadi cgpu.disable.isolation=true, Anda harus me-restart pod gpushare-device-plugin pada node agar konfigurasi tersebut berlaku.
Untuk melakukannya, hapus pod gpushare-device-plugin pada node tersebut. Kemudian, ACK secara otomatis akan membuat pod baru. Langkah-langkahnya adalah sebagai berikut:
Jalankan perintah berikut untuk menanyakan pod gpushare-device-plugin dalam klaster ACK:
kubectl get po -n kube-system -l name=gpushare-device-plugin-ds -o wideOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES gpushare-device-plugin-ds-6r8gs 1/1 Running 0 18h 192.168.7.157 cn-shanghai.192.168.7.157 <none> <none> gpushare-device-plugin-ds-pjrvn 1/1 Running 0 15h 192.168.7.158 cn-shanghai.192.168.7.158 <none> <none>Dalam contoh ini, node cn-shanghai.192.168.7.157 digunakan. Jalankan perintah berikut untuk menghapus pod gpushare-device-plugin pada node ini:
kubectl delete po gpushare-device-plugin-ds-6r8gs -n kube-system
Langkah 1: Buat kolam node
Masuk ke Konsol ACK.
Di panel navigasi sisi kiri Konsol ACK, klik Clusters.
Pada halaman Clusters, temukan klaster yang ingin Anda kelola dan klik nama klaster atau klik Details di kolom Actions. Halaman detail klaster akan muncul.
Di panel navigasi sisi kiri halaman detail, pilih .
Dalam kotak dialog Create Node Pool, atur parameter.
Untuk informasi lebih lanjut, lihat Buat Klaster Terkelola ACK. Daftar berikut menjelaskan beberapa parameter:
Quantity: Tentukan jumlah awal node dalam kolam node. Jika Anda tidak ingin menambahkan node ke kolam node, atur parameter ini ke 0.
Operating System: Pilih sistem operasi node. CentOS 7.x dan Alibaba Cloud Linux 2.x didukung.
Node Label: Anda dapat menambahkan label ke node.
ECS Label: Anda dapat menambahkan label ke instance Elastic Compute Service (ECS).
Custom Resource Group: Anda dapat menentukan grup sumber daya tempat node dalam kolam node termasuk.
Di bagian Node Label, Anda dapat menambahkan label tertentu ke node dalam kolam node.
Tambahkan label berikut ke node dalam kolam node cgpu: cgpu=true dan cgpu.disable.isolation=false.
Tambahkan label berikut ke node dalam kolam node cgpu-no-isolation: cgpu=true dan cgpu.disable.isolation=true.
Gambar berikut menunjukkan label yang ditambahkan ke node dalam kolam node cgpu-no-isolation.

Klik Confirm Order.
Pada halaman Node Pools, periksa kolom Status kolam node. Jika kolam node berada dalam status Initializing, itu menunjukkan bahwa kolam node sedang dibuat. Setelah kolam node dibuat, state kolam node berubah menjadi Active.
Jika Anda ingin menambahkan node dengan akselerasi GPU ke kolam node, Anda dapat memperluas kolam node. Untuk informasi lebih lanjut, lihat Kelola Kolam Node.
Langkah 2: Kirim pekerjaan
Kirim dua pekerjaan bernama cgpu-test dan cgpu-test-no-isolation. Anda harus mengatur nodeSelector dalam file YAML kedua pekerjaan tersebut.
cgpu-test: Jumlah Memori GPU yang dapat dialokasikan untuk pekerjaan ini tidak ditentukan dalam skrip pekerjaan. Oleh karena itu, isolasi memori diperlukan untuk menjalankan pekerjaan ini. Template YAML berikut adalah contohnya:
apiVersion: batch/v1 kind: Job metadata: name: cgpu-test spec: parallelism: 1 template: metadata: labels: app: cgpu-test spec: nodeSelector: cgpu.disable.isolation: "false" # Tambahkan pemilih node untuk memilih kolam node cgpu. containers: - name: cgpu-test 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: # Pod meminta total 3 GiB memori GPU. aliyun.com/gpu-mem: 3 workingDir: /root restartPolicy: NeverCatatannodeSelector: memilih kolam node cgpu.
cgpu.disable.isolation=false: menjadwalkan pekerjaan ke node dalam kolam node cgpu.
aliyun.com/gpu-mem: menentukan jumlah memori GPU yang diminta oleh pekerjaan.
cgpu-test-no-isolation: Jumlah memori yang dapat dialokasikan untuk pekerjaan per GPU ditentukan dalam skrip pekerjaan. Oleh karena itu, isolasi memori tidak diperlukan untuk menjalankan pekerjaan ini. Template YAML berikut adalah contohnya:
apiVersion: batch/v1 kind: Job metadata: name: cgpu-test-no-isolation spec: parallelism: 1 template: metadata: labels: app: cgpu-test-no-isolation spec: nodeSelector: cgpu.disable.isolation: "true" # Tambahkan pemilih node untuk memilih kolam node cgpu. containers: - name: cgpu-test-no-isolation 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: # Pod meminta total 3 GiB memori GPU. aliyun.com/gpu-mem: 3CatatannodeSelector: menentukan label yang digunakan untuk memilih kolam node cgpu-no-isolation.
cgpu.disable.isolation=true: label yang digunakan untuk menjadwalkan pekerjaan ke node dalam kolam node cgpu-no-isolation.
aliyun.com/gpu-mem: menentukan jumlah memori GPU yang diminta oleh pekerjaan.
Langkah 3: Periksa hasilnya
Jalankan perintah berikut untuk menanyakan status pekerjaan:
kubectl get poOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE cgpu-test-0 1/1 Running 0 5m55s cgpu-test-no-isolation-0 1/1 Running 0 6m42sJalankan perintah
nvidia-smidi pod cgpu-test-0 (memerlukan isolasi memori) untuk menanyakan jumlah memori GPU yang dapat digunakan oleh pod:kubectl exec cgpu-test-0 nvidia-smiOutput yang diharapkan:
Mon Nov 2 11:33:10 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | 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 V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 34C P0 54W / 300W | 3039MiB / 3226MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+Output menunjukkan bahwa 3.226 MiB memori GPU dapat digunakan oleh kontainer. Total memori GPU adalah 16 GiB. Ini menunjukkan bahwa isolasi memori GPU diaktifkan.
Jalankan perintah
nvidia-smidi pod cgpu-test-no-isolation-0 (tidak memerlukan isolasi memori GPU) untuk menanyakan jumlah memori GPU yang dapat digunakan oleh kontainer dalam pod:kubectl exec cgpu-test-no-isolation-0 nvidia-smiOutput yang diharapkan:
Mon Nov 2 11:39:59 2020 +-----------------------------------------------------------------------------+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | 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 V100-SXM2... On | 00000000:00:07.0 Off | 0 | | N/A 37C P0 56W / 300W | 1929MiB / 16130MiB | 1% Default | +-------------------------------+----------------------+----------------------+ +-----------------------------------------------------------------------------+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| +-----------------------------------------------------------------------------+Output menunjukkan bahwa 16.130 MiB memori GPU dapat ditemukan oleh kontainer. Total memori GPU adalah 16 GiB. Ini menunjukkan bahwa isolasi memori GPU dinonaktifkan. Dalam hal ini, Anda harus menanyakan variabel lingkungan berikut untuk memeriksa jumlah memori GPU yang dapat digunakan oleh kontainer dalam pod. Jalankan perintah berikut untuk memeriksa jumlah memori GPU yang dapat digunakan oleh kontainer dalam pod:
kubectl exec cgpu-test-no-isolation-0 env | grep ALIYUNOutput yang diharapkan:
ALIYUN_COM_GPU_MEM_CONTAINER=3 # Jumlah memori GPU yang dapat digunakan oleh kontainer dalam pod. Jumlahnya adalah 3 GiB dalam contoh ini. ALIYUN_COM_GPU_MEM_DEV=15 # Jumlah total memori yang disediakan oleh GPU. ...Setelah Anda menjalankan perintah
nvidia-smi, bandingkan hasil yang dikembalikan dari pod cgpu-test-no-isolation-0 dan pod cgpu-test-0.Hasil dari pod cgpu-test-no-isolation-0 menunjukkan jumlah total memori GPU dan hasil dari pod cgpu-test-0 hanya menunjukkan jumlah memori GPU yang diminta oleh pod. Ini menunjukkan bahwa Anda dapat menggunakan kolam node untuk mengontrol cGPU untuk berbagi GPU dan isolasi memori.