Topik ini menjelaskan cara menggunakan fitur berbagi GPU untuk menjadwalkan dan mengisolasi sumber daya GPU pada node Lingjun dalam klaster terkelola Container Service for Kubernetes (ACK) Lingjun.
Prasyarat
Klaster terkelola ACK Lingjun telah dibuat dan mencakup node Lingjun yang dipercepat oleh GPU. Untuk informasi lebih lanjut, lihat Buat klaster Lingjun dengan ACK diaktifkan.
Secara default, komponen berbagi GPU diinstal di klaster terkelola ACK Lingjun. Anda dapat menambahkan label tertentu ke node yang dipercepat oleh GPU untuk mengaktifkan berbagi GPU. Untuk informasi lebih lanjut, lihat Label untuk mengaktifkan kebijakan penjadwalan GPU.
Menggunakan penjadwalan GPU bersama
Berbagi GPU berlaku dalam skenario berikut:
Aktifkan berbagi GPU tanpa isolasi memori GPU: Dalam skenario ini, beberapa pod dapat berbagi GPU yang sama, dan memori GPU yang dialokasikan ke sebuah pod tidak diisolasi dari memori GPU yang dialokasikan ke pod lainnya. Konten memori GPU mungkin ditangani atau tidak oleh aplikasi lapisan atas.
Aktifkan berbagi GPU dengan isolasi memori GPU: Dalam skenario ini, beberapa pod dapat berbagi GPU yang sama, tetapi memori GPU yang dialokasikan ke sebuah pod diisolasi dari memori GPU yang dialokasikan ke pod lainnya. Ini menangani konten memori GPU di antara pod.
Skenario 1: Berbagi tanpa isolasi
Dalam beberapa kasus, Anda mungkin memerlukan berbagi GPU tanpa isolasi memori GPU. Beberapa beban kerja menyediakan isolasi memori GPU. Misalnya, saat meluncurkan aplikasi Java, Anda dapat mengonfigurasi opsi Java untuk menentukan jumlah maksimum memori GPU yang dapat digunakan oleh aplikasi. Jika modul isolasi GPU diinstal, konflik sumber daya mungkin terjadi. Untuk menghindari masalah ini, Anda dapat mengaktifkan berbagi GPU tanpa menginstal modul isolasi GPU di beberapa node.
Langkah 1: Aktifkan berbagi GPU untuk sebuah node
Periksa apakah file
/etc/lingjun_metadataada.Jika file tersebut ada, jalankan perintah
nvidia-smi. Jika output-nya normal, node tersebut adalah node Lingjun dan Anda dapat melanjutkan ke langkah berikutnya.Jika file tersebut tidak ada, node tersebut bukan node Lingjun. Anda tidak dapat mengaktifkan berbagi GPU untuk node tersebut. Untuk mengaktifkan berbagi GPU dalam kasus ini, Anda perlu membuat node Lingjun. Untuk informasi lebih lanjut, lihat Ikhtisar kumpulan node Lingjun.
Jalankan perintah berikut untuk menambahkan label
ack.node.gpu.scheduleke node guna mengaktifkan GPU sharing.
kubectl label node <NODE_NAME> ack.node.gpu.schedule=shareLangkah 2: Gunakan sumber daya GPU bersama
Buat file
tensorflow.yamlmenggunakan contoh berikut.apiVersion: batch/v1 kind: Job metadata: name: tensorflow-mnist-share spec: parallelism: 1 template: metadata: labels: app: tensorflow-mnist-share spec: # Template YAML menentukan pekerjaan yang menggunakan dataset TensorFlow MNIST. Pekerjaan tersebut membuat satu pod dan pod tersebut meminta 4 GiB memori GPU. containers: - name: tensorflow-mnist-share image: registry.cn-beijing.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: # Jika Anda ingin pod meminta 4 GiB memori GPU, tentukan aliyun.com/gpu-mem: 4 dalam parameter resources.limits konfigurasi pod. limits: aliyun.com/gpu-mem: 4 # Pod meminta 4 GiB memori GPU. workingDir: /root restartPolicy: NeverJalankan perintah berikut untuk mengirimkan pekerjaan:
kubectl apply -f tensorflow.yaml
Langkah 3: Verifikasi berbagi GPU tanpa isolasi memori GPU
Kueri pod yang dibuat oleh pekerjaan dan jalankan perintah berikut:
kubectl get pod | grep tensorflow
kubectl exec -ti tensorflow-mnist-share-xxxxx -- nvidia-smiOutput yang diharapkan:
Wed Jun 14 06:45:56 2023
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 515.105.01 Driver Version: 515.105.01 CUDA Version: 11.7 |
|-------------------------------+----------------------+----------------------+
| 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 V100-SXM2... On | 00000000:00:09.0 Off | 0 |
| N/A 35C P0 59W / 300W | 334MiB / 16384MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+Output tersebut menunjukkan bahwa pod dapat menggunakan semua memori yang disediakan oleh GPU, yaitu sebesar 16.384 MiB. Ini berarti berbagi GPU diimplementasikan tanpa isolasi memori GPU. Jika modul isolasi GPU diinstal, ukuran memori yang ditampilkan dalam output sama dengan jumlah memori yang diminta oleh pod.
Dalam contoh ini, GPU V100 digunakan dan 4 GiB memori GPU diminta oleh pod. Konfigurasi aktual tergantung pada lingkungan Anda.
Aplikasi perlu membaca nilai memori GPU yang dapat digunakan dari dua variabel lingkungan berikut.
ALIYUN_COM_GPU_MEM_CONTAINER=4 # Memori GPU yang tersedia untuk pod.
ALIYUN_COM_GPU_MEM_DEV=16 # Ukuran memori setiap GPU.Anda dapat menghitung persentase total memori GPU yang digunakan oleh aplikasi dari dua variabel lingkungan di atas.
persentase = ALIYUN_COM_GPU_MEM_CONTAINER / ALIYUN_COM_GPU_MEM_DEV = 4 / 16 = 0,25Skenario 2: Aktifkan berbagi GPU dengan isolasi memori GPU
Untuk memastikan stabilitas kontainer, Anda harus mengisolasi sumber daya GPU yang dialokasikan ke setiap kontainer. Saat menjalankan beberapa kontainer pada satu GPU, sumber daya GPU dialokasikan ke setiap kontainer sesuai permintaan. Namun, jika satu kontainer menggunakan sumber daya GPU secara berlebihan, kinerja kontainer lainnya mungkin terpengaruh. Untuk menyelesaikan masalah ini, banyak solusi tersedia di industri komputasi, seperti NVIDIA vGPU, Multi-Process Service (MPS), vCUDA, dan eGPU, yang memungkinkan pembagian GPU secara halus. Bagian berikut menjelaskan cara menggunakan eGPU.
Langkah 1: Aktifkan berbagi GPU untuk sebuah node
Periksa apakah file
/etc/lingjun_metadataada.Jika file tersebut ada, jalankan perintah
nvidia-smi. Jika output-nya normal, node tersebut adalah node Lingjun dan Anda dapat melanjutkan ke langkah berikutnya.Jika file tersebut tidak ada, node tersebut bukan node Lingjun. Anda tidak dapat mengaktifkan berbagi GPU untuk node tersebut. Untuk mengaktifkan berbagi GPU dalam kasus ini, Anda perlu membuat node Lingjun. Untuk informasi lebih lanjut, lihat Ikhtisar kumpulan node Lingjun.
Jalankan perintah berikut untuk menambahkan label
ack.node.gpu.scheduleke node guna mengaktifkan GPU sharing.kubectl label node <NODE_NAME> ack.node.gpu.schedule=egpu_mem
Jika Anda menetapkan nilai label menjadi egpu_mem, hanya isolasi memori GPU yang diaktifkan. Dalam contoh sebelumnya, nilai label diatur menjadi egpu_mem.
Jika Anda menetapkan nilai label menjadi egpu_core_mem, baik isolasi memori GPU maupun isolasi daya komputasi diaktifkan.
Daya komputasi GPU harus diajukan bersama Memori GPU. Namun, Anda dapat mengajukan Memori GPU secara terpisah.
Langkah 2: Gunakan sumber daya GPU bersama
Tunggu hingga informasi GPU dilaporkan oleh node.
Jalankan perintah berikut untuk menanyakan sumber daya yang disediakan oleh node:
kubectl get node <NODE_NAME> -oyamlOutput yang diharapkan:
allocatable:
aliyun.com/gpu-count: "1"
aliyun.com/gpu-mem: "80"
...
nvidia.com/gpu: "0"
...
capacity:
aliyun.com/gpu-count: "1"
aliyun.com/gpu-mem: "80"
...
nvidia.com/gpu: "0"
...Output yang diharapkan menunjukkan bahwa aliyun.com/gpu-mem ada dalam daftar resource node. Node tersebut memiliki satu kartu GPU dengan total memori GPU sebesar 80 GB.
Jika suatu Pod perlu dijadwalkan ke dan menggunakan seluruh perangkat, tambahkan label ack.gpushare.placement=require-whole-device ke Pod tersebut. Kemudian, tentukan jumlah memori GPU menggunakan gpu-mem. Pod tersebut kemudian akan dijadwalkan ke GPU utuh yang memiliki jumlah memori yang ditentukan.
Langkah 3: Jalankan pekerjaan untuk memverifikasi berbagi GPU
Gunakan file YAML berikut untuk mengirimkan pekerjaan benchmarking:
apiVersion: batch/v1 kind: Job metadata: name: benchmark-job spec: parallelism: 1 template: spec: containers: - name: benchmark-job image: registry.cn-beijing.aliyuncs.com/ai-samples/gpushare-sample:benchmark-tensorflow-2.2.3 command: - bash - run.sh - --num_batches=500000000 - --batch_size=8 resources: limits: aliyun.com/gpu-mem: 10 # Pekerjaan meminta 10 GB memori. workingDir: /root restartPolicy: Never hostNetwork: true tolerations: - operator: ExistsJalankan perintah berikut untuk mengirimkan pekerjaan:
kubectl apply -f benchmark.yamlSetelah pod berjalan, jalankan perintah berikut untuk mengakses pod:
kubectl exec -ti benchmark-job-xxxx bashJalankan perintah berikut di dalam pod untuk menanyakan informasi isolasi GPU:
vgpu-smiOutput yang diharapkan:
+------------------------------------------------------------------------------+ | VGPU_SMI 460.91.03 DRIVER_VERSION: 460.91.03 CUDA Version: 11.2 | +-------------------------------------------+----------------------------------+ | GPU Name Bus-Id | Memory-Usage GPU-Util | |===========================================+==================================| | 0 xxxxxxxx 00000000:00:07.0 | 8307MiB / 10782MiB 100% / 100% | +-------------------------------------------+----------------------------------+Output tersebut menunjukkan bahwa 10 GB memori GPU dialokasikan ke pod.
FAQ
Bagaimana cara memeriksa apakah komponen berbagi GPU diinstal di klaster saya?
Jalankan perintah berikut untuk memeriksa apakah komponen berbagi GPU berbasis eGPU diinstal:
kubectl get ds -nkube-system | grep gpushareOutput yang diharapkan:
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
gpushare-egpu-device-plugin-ds 0 0 0 0 0 <none>
gpushare-egpucore-device-plugin-ds 0 0 0 0 0 <none>Output tersebut menunjukkan bahwa komponen berbagi GPU diinstal.