Node berakselerasi GPU harganya mahal, dan satu layanan inferensi jarang memanfaatkan seluruh kapasitas GPU. Penjadwalan GPU bersama memungkinkan Anda menjalankan beberapa layanan inferensi pada satu GPU dengan membagi memori GPU-nya menjadi alokasi berukuran tetap. Panduan ini menunjukkan cara menyebarkan dua layanan inferensi Qwen1.5-0.5B-Chat pada satu GPU V100 menggunakan KServe dan Arena, dengan masing-masing layanan menerima alokasi memori sebesar 6 GB.
Cara kerja
Komponen penjadwalan GPU bersama ACK mengimplementasikan pemotongan memori GPU. Setiap layanan inferensi mendeklarasikan jumlah memori GPU yang dibutuhkan melalui flag --gpumemory, dan penjadwal menempatkan beberapa Pod pada node GPU yang sama selama total memori yang diminta tidak melebihi kapasitas fisik GPU node tersebut.
Gunakan penjadwalan GPU bersama ketika memaksimalkan pemanfaatan GPU lebih penting daripada isolasi kesalahan antar layanan. Untuk beban kerja yang memerlukan isolasi ketat, gunakan node GPU khusus.
Batasan
-
Total memori GPU yang diminta oleh semua Pod pada suatu node tidak boleh melebihi memori GPU fisik node tersebut.
-
Node berakselerasi GPU secara default menggunakan CUDA 11. Panduan ini memerlukan CUDA 12.0 atau versi yang lebih baru.
-
ack-kserve harus dalam Raw Deployment mode.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
-
Kluster ACK yang dikelola atau kluster khusus ACK dengan node berakselerasi GPU, menjalankan Kubernetes 1.22 atau versi yang lebih baru. Untuk informasi lebih lanjut, lihat Add GPU-accelerated nodes to a cluster atau Create an ACK dedicated cluster with GPU-accelerated nodes.
-
CUDA 12.0 atau versi yang lebih baru pada node GPU. Secara default, node berakselerasi GPU menggunakan CUDA 11. Untuk menggunakan CUDA 12, tambahkan tag
ack.aliyun.com/nvidia-driver-version:525.105.17ke kelompok node berakselerasi GPU. Untuk informasi lebih lanjut, lihat Customize the NVIDIA GPU driver version on nodes. -
komponen penjadwalan GPU bersama yang telah diinstal pada kluster
-
Klien Arena versi 0.9.15 atau yang lebih baru. Untuk informasi lebih lanjut, lihat Configure the Arena client.
-
cert-manager dan ack-kserve yang telah diinstal, dengan ack-kserve dalam Raw Deployment mode.
Langkah 1: Siapkan data model
Simpan model di bucket Object Storage Service (OSS) atau sistem file Apsara File Storage NAS. Panduan ini menggunakan OSS. Untuk informasi lebih lanjut, lihat Use an ossfs 1.0 statically provisioned volume atau Mount a statically provisioned NAS volume.
-
Unduh model Qwen1.5-0.5B-Chat.
git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen1.5-0.5B-Chat.git cd Qwen1.5-0.5B-Chat git lfs pull -
Unggah file model ke bucket OSS Anda.
Untuk instalasi dan penggunaan ossutil, lihat Install ossutil.
ossutil mkdir oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat ossutil cp -r ./Qwen1.5-0.5B-Chat oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat -
Buat volume persisten (PV) untuk kluster menggunakan konfigurasi berikut.
Item konfigurasi Nilai Persistent volume type OSS Name llm-model Certificate Access ID AccessKey dan Rahasia AccessKey untuk bucket OSS Bucket ID Bucket OSS yang dibuat pada langkah sebelumnya OSS path /Qwen1.5-0.5B-Chat -
Buat klaim volume persisten (PVC) yang terikat ke PV tersebut.
Item konfigurasi Nilai Persistent volume claim type OSS Name llm-model Allocation mode Pilih Existing persistent volume Existing persistent volume Klik Select Existing persistent volume dan pilih PV yang dibuat pada langkah sebelumnya
Langkah 2: Sebarkan layanan inferensi
Sebarkan dua layanan inferensi Qwen, masing-masing meminta 6 GB memori GPU. Perintahnya identik kecuali pada parameter --name.
Jalankan perintah berikut untuk memulai layanan pertama:
arena serve kserve \
--name=qwen1 \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
--gpumemory=6 \
--cpu=3 \
--memory=8Gi \
--data="llm-model:/mnt/models/Qwen1.5-0.5B-Chat" \
"python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen1.5-0.5B-Chat --dtype=half --max-model-len=4096"
Untuk memulai layanan kedua, jalankan perintah yang sama dengan --name=qwen2.
Tabel berikut menjelaskan parameter utama.
| Parameter | Tipe | Wajib | Deskripsi |
|---|---|---|---|
--name |
String | Ya | Nama layanan inferensi. Harus unik secara global. |
--image |
String | Ya | Image kontainer untuk layanan inferensi. |
--gpumemory |
Integer (GB) | Tidak | Memori GPU yang dialokasikan untuk layanan ini, dalam satuan GB. Contohnya, --gpumemory=6 mengalokasikan 6 GB. Total memori GPU yang diminta oleh semua layanan pada suatu node tidak boleh melebihi memori GPU fisik node tersebut. |
--cpu |
Integer | Tidak | Jumlah vCPU untuk layanan inferensi. |
--memory |
String | Tidak | Jumlah RAM untuk layanan inferensi, misalnya 8Gi. |
--data |
String | Tidak | Path mount PVC ke kontainer dalam format <pvc-name>:<container-path>. Pada contoh ini, PVC llm-model dimount ke /mnt/models/ di dalam kontainer. |
Langkah 3: Verifikasi layanan inferensi
-
Periksa bahwa kedua Pod berjalan pada node GPU yang sama.
kubectl get pod -owide | grep qwenOutput yang diharapkan:
qwen1-predictor-856568bdcf-5pfdq 1/1 Running 0 7m10s 10.130.XX.XX cn-beijing.172.16.XX.XX <none> <none> qwen2-predictor-6b477b587d-dpdnj 1/1 Running 0 4m3s 10.130.XX.XX cn-beijing.172.16.XX.XX <none> <none>Kedua Pod muncul pada node yang sama (
cn-beijing.172.16.XX.XX), yang mengonfirmasi bahwa berbagi GPU aktif. -
Periksa memori GPU yang dialokasikan untuk setiap Pod. Jalankan perintah berikut — satu per layanan:
kubectl exec -it qwen1-predictor-856568bdcf-5pfdq -- nvidia-smi # Layanan pertama kubectl exec -it qwen2-predictor-6b477b587d-dpdnj -- nvidia-smi # Layanan keduaOutput yang diharapkan untuk setiap Pod: Memori GPU yang dialokasikan untuk layanan inferensi pertama
Fri Jun 28 06:20:43 2024 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.161.07 Driver Version: 535.161.07 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | 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-16GB On | 00000000:00:07.0 Off | 0 | | N/A 39C P0 53W / 300W | 5382MiB / 6144MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| +---------------------------------------------------------------------------------------+Memori GPU yang dialokasikan untuk layanan inferensi kedua
Fri Jun 28 06:40:17 2024 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.161.07 Driver Version: 535.161.07 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | 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-16GB On | 00000000:00:07.0 Off | 0 | | N/A 39C P0 53W / 300W | 5382MiB / 6144MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| +---------------------------------------------------------------------------------------+Batas memori GPU setiap Pod adalah 6 GB (6.144 MiB). Hal ini mengonfirmasi bahwa kedua layanan berbagi memori GPU node sesuai konfigurasi.
-
Kirim permintaan uji ke layanan inferensi melalui gerbang NGINX Ingress.
curl -H "Host: $(kubectl get inferenceservice qwen1 -o jsonpath='{.status.url}' | cut -d "/" -f 3)" \ -H "Content-Type: application/json" \ http://$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}'):80/v1/chat/completions \ -d '{ "model": "qwen", "messages": [{"role": "user", "content": "This is a test."}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10 }'Output yang diharapkan:
{"id":"cmpl-bbca59499ab244e1aabfe2c354bf6ad5","object":"chat.completion","created":1719303373,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"OK. What do you want to test?"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":21,"total_tokens":31,"completion_tokens":10}}Model mengembalikan respons, yang mengonfirmasi bahwa layanan inferensi berfungsi dengan benar.
(Opsional) Langkah 4: Bersihkan
Hapus sumber daya jika tidak lagi diperlukan.
Hapus layanan inferensi:
arena serve delete qwen1
arena serve delete qwen2
Hapus PVC dan PV:
kubectl delete pvc llm-model
kubectl delete pv llm-model