Penggunaan node pools untuk mengelola cGPU memungkinkan penerapan kebijakan fleksibel dalam berbagi GPU dan isolasi memori. Topik ini menjelaskan cara membuat dua node pool dengan label tertentu dalam klaster khusus untuk mengontrol kemampuan tersebut.
Skenario
-
Fitur yang dijelaskan dalam topik ini hanya didukung di klaster khusus, bukan di klaster yang dikelola.
-
Untuk menginstal komponen ack-cgpu di klaster ACK Pro, lihat Mengelola komponen ack-cgpu.
Prasyarat
Pastikan Anda telah menyelesaikan tugas-tugas berikut:
-
Rencanakan node pools Anda.
Anda dapat menggunakan nama kustom untuk node pools Anda. Topik ini menggunakan
cgpudancgpu-no-isolationsebagai contoh.Node pool
GPU sharing
Memory isolation
Labels
cgpu
Enabled
Enabled
-
cgpu=true
-
cgpu.disable.isolation=false
cgpu-no-isolation
Enabled
Disabled
-
cgpu=true
-
cgpu.disable.isolation=true
-
Latar Belakang
Saat menggunakan GPU sharing di Container Service for Kubernetes (ACK), Anda mungkin menghadapi skenario berikut:
-
Untuk Training Job A, kode aplikasi sudah menentukan memori GPU yang dapat digunakan. Oleh karena itu, klaster hanya perlu menyediakan GPU sharing, bukan isolasi memori.
-
Untuk Training Job B, kode aplikasi tidak menentukan memori GPU yang dapat digunakan. Dalam kasus ini, klaster harus menyediakan GPU sharing dan isolasi memori.
Bagaimana Anda dapat mendukung kedua skenario tersebut dalam satu klaster?
Penggunaan node pools untuk mengelola cGPU mendukung kedua skenario tersebut. Anda hanya perlu membuat dua node pool:
-
Node pool yang hanya menyediakan GPU sharing, tanpa isolasi memori. Pool ini ditujukan untuk pekerjaan seperti Training Job A.
-
Node pool yang menyediakan GPU sharing dan isolasi memori. Pool ini ditujukan untuk pekerjaan seperti Training Job B.
Catatan Penggunaan
Saat menggunakan node pools untuk mengelola cGPU, perhatikan hal-hal berikut:
-
Jika suatu pekerjaan tidak memiliki
nodeSelectoryang ditentukan, Pod-nya dapat dijadwalkan ke node pool mana pun, yang dapat menyebabkan hasil yang tidak diinginkan.PentingSelalu tentukan
nodeSelectoruntuk setiap pekerjaan. -
Jika label node berubah (misalnya, dari
cgpu.disable.isolation=falsemenjadicgpu.disable.isolation=true), Anda harus me-restart Podgpushare-device-pluginpada node tersebut agar konfigurasi isolasi memori berlaku.Untuk me-restart plugin tersebut, hapus Pod
gpushare-device-pluginyang ada. ACK kemudian secara otomatis membuat Pod baru. Ikuti langkah-langkah berikut:-
Jalankan perintah berikut untuk menampilkan daftar Pod
gpushare-device-plugindi klaster:kubectl get po -n kube-system -l name=gpushare-device-plugin-ds -o wideOutput berikut diharapkan muncul:
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> -
Sebagai contoh, untuk menghapus Pod pada node
cn-shanghai.192.168.7.157, jalankan perintah berikut:kubectl delete po gpushare-device-plugin-ds-6r8gs -n kube-system
-
Langkah 1: Membuat node pools
Masuk ke ACK console. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, klik nama klaster Anda. Di panel navigasi kiri, klik .
-
Di pojok kanan atas, klik Create Node Pool.
-
Pada halaman Create Node Pool, konfigurasikan parameter untuk node pool tersebut.
Untuk informasi lebih lanjut tentang parameter-parameter tersebut, lihat Create an ACK managed cluster. Daftar berikut menjelaskan beberapa parameter utama:
-
Quantity: Jumlah awal node dalam node pool. Atur ke 0 jika Anda tidak ingin membuat node sekarang.
-
Operating System: Pilih sistem operasi untuk node, seperti CentOS 7.x atau Alibaba Cloud Linux 2.x.
-
Node Labels: Label yang akan diterapkan pada node dalam node pool ini.
-
ECS Tags: Tag yang akan diterapkan pada instance ECS yang mendasarinya.
-
Custom Resource Group: Kelompok sumber daya untuk node dalam node pool ini.
Pada bagian Node Labels, tambahkan label spesifik untuk setiap node pool.
-
Node pool
cgpu:cgpu=truedancgpu.disable.isolation=false -
Node pool
cgpu-no-isolation:cgpu=truedancgpu.disable.isolation=true
Konfigurasi berikut menggunakan node pool
cgpu-no-isolationsebagai contoh. -
-
Klik Confirm.
Pada halaman Node Pools, status Status bernilai Initializing menunjukkan bahwa node pool sedang dibuat. Setelah pembuatan selesai, Status berubah menjadi Active.
Jika Anda perlu menambahkan node GPU, Anda dapat melakukan scale out terhadap node pool tersebut. Untuk informasi lebih lanjut, lihat Create and manage node pools.
Langkah 2: Mengirimkan pekerjaan
Kirimkan dua pekerjaan, cgpu-test dan cgpu-test-no-isolation. Anda harus menentukan nodeSelector dalam file YAML untuk setiap pekerjaan.
-
cgpu-test: Ukuran memori GPU yang tersedia tidak diatur dalam kode pekerjaan ini, sehingga memerlukan isolasi memori cGPU agar berjalan dengan benar. File YAML contoh berikut menunjukkan konfigurasinya: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 nodeSelector untuk memilih node pool 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 ini meminta total 3 GiB memori GPU. aliyun.com/gpu-mem: 3 workingDir: /root restartPolicy: NeverCatatan-
nodeSelector: Menentukan node pool
cgpu. -
cgpu.disable.isolation: "false": Menjadwalkan pekerjaan ke node dalam node pool
cgpu. -
aliyun.com/gpu-mem: Menetapkan jumlah memori GPU dalam satuan GiB.
-
-
cgpu-test-no-isolation: Kode pekerjaan ini mengelola penggunaan memori GPU-nya sendiri, sehingga tidak memerlukan isolasi memori cGPU. File YAML contoh berikut menunjukkan konfigurasinya: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 nodeSelector untuk memilih node pool cgpu-no-isolation. 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 ini meminta total 3 GiB memori GPU. aliyun.com/gpu-mem: 3Catatan-
nodeSelector: Menentukan node pool
cgpu-no-isolation. -
cgpu.disable.isolation: "true": Menjadwalkan pekerjaan ke node dalam node pool
cgpu-no-isolation. -
aliyun.com/gpu-mem: Menetapkan jumlah memori GPU dalam satuan GiB.
-
Langkah 3: Memverifikasi hasil
-
Jalankan perintah berikut untuk memeriksa status pekerjaan:
kubectl get poOutput berikut diharapkan muncul:
NAME READY STATUS RESTARTS AGE cgpu-test-0 1/1 Running 0 5m55s cgpu-test-no-isolation-0 1/1 Running 0 6m42s -
Jalankan perintah
nvidia-smidi Podcgpu-test-0, yang memerlukan isolasi memori, untuk memeriksa memori GPU yang tersedia bagi kontainer.kubectl exec cgpu-test-0 -- nvidia-smiOutput berikut diharapkan muncul:
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 | |=============================================================================| +-----------------------------------------------------------------------------+Total memori yang terlihat oleh kontainer adalah 3.226 MiB, jauh lebih kecil daripada total 16 GiB kartu fisik. Hal ini mengonfirmasi bahwa isolasi memori cGPU sedang berlaku.
-
Jalankan perintah
nvidia-smidi Podcgpu-test-no-isolation-0, yang tidak memerlukan isolasi memori, untuk memeriksa memori GPU yang tersedia bagi kontainer.kubectl exec cgpu-test-no-isolation-0 -- nvidia-smiOutput berikut diharapkan muncul:
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 | |=============================================================================| +-----------------------------------------------------------------------------+Total memori yang terlihat oleh kontainer adalah 16.130 MiB, yang merupakan total memori kartu GPU 16 GiB. Hal ini mengonfirmasi bahwa isolasi memori cGPU dinonaktifkan. Dalam skenario ini, aplikasi dalam kontainer harus menentukan kuota memori yang diizinkan dari variabel lingkungan berikut. Jalankan perintah berikut untuk menanyakan ukuran memori GPU yang diizinkan.
kubectl exec cgpu-test-no-isolation-0 -- env | grep ALIYUNOutput berikut diharapkan muncul:
ALIYUN_COM_GPU_MEM_CONTAINER=3 # Jumlah memori dalam satuan GiB yang boleh digunakan kontainer ini pada kartu GPU. Dalam kasus ini, 3 GiB. ALIYUN_COM_GPU_MEM_DEV=15 # Total memori kartu GPU. ... -
Bandingkan output
nvidia-smidari Podcgpu-test-no-isolation-0dancgpu-test-0.Output untuk
cgpu-test-no-isolation-0menunjukkan seluruh memori kartu GPU, sedangkan output untukcgpu-test-0hanya menunjukkan bagian memori yang dialokasikan. Hal ini menunjukkan bahwa node pools merupakan cara yang efektif untuk mengelola kemampuan cGPU.