Saat menerapkan dan mengelola layanan model KServe, Anda perlu menangani beban inferensi yang sangat dinamis. KServe mengintegrasikan Kubernetes HPA dan pengontrol penskalaan untuk menyesuaikan jumlah replika Pod berdasarkan pemanfaatan CPU, memori, GPU utilization, atau metrik kustom. Topik ini menggunakan model Qwen-7B-Chat-Int8 pada GPU V100 sebagai contoh untuk mengonfigurasi skalabilitas elastis pada layanan KServe.
Contoh dalam topik ini menggunakan model Qwen-7B-Chat-Int8 pada GPU V100.
Pilih jenis penskalaan
| Scaling type | Trigger | Deployment mode | When to use |
|---|---|---|---|
| CPU/memory-based HPA | Pemanfaatan CPU atau memori melebihi ambang batas | Raw Deployment | Trafik tidak dapat diprediksi dengan beban kerja inferensi yang dibatasi oleh CPU atau memori |
| GPU utilization-based HPA | Metrik GPU kustom (DCGM) melebihi ambang batas | Raw Deployment | Beban kerja inferensi yang dibatasi oleh GPU, seperti serving LLM |
| Scheduled scaling (CronHPA) | Jadwal waktu (cron expression) | Raw Deployment | Pola lalu lintas yang dapat diprediksi, seperti lonjakan trafik di jam kerja |
HPA tidak mendukung penskalaan hingga 0. --min-replicas harus lebih besar dari 0.
Prasyarat
-
Arena client versi 0.9.15 atau yang lebih baru telah diinstal.
-
Komponen ack-kserve telah diinstal.
Konfigurasi skalabilitas elastis berbasis CPU/memori
HPA menyesuaikan jumlah replika Pod dalam mode Raw Deployment berdasarkan pemanfaatan CPU atau memori. Contoh ini menggunakan model sklearn-iris dengan penskalaan berbasis CPU.
Lihat Horizontal Pod Autoscaling dalam dokumentasi Kubernetes.
-
Kirim layanan inferensi dengan parameter penskalaan.
Parameter Description --scale-metricMetrik penskalaan. Nilai yang valid: cpu,memory.--scale-targetAmbang batas penskalaan, dalam persentase. --min-replicasJumlah minimum replika. Harus lebih besar dari 0. --max-replicasJumlah maksimum replika. Harus lebih besar dari --min-replicas.arena serve kserve \ --name=sklearn-iris \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/ai-sample/kserve-sklearn-server:v0.12.0 \ --cpu=1 \ --memory=200Mi \ --scale-metric=cpu \ --scale-target=10 \ --min-replicas=1 \ --max-replicas=10 \ "python -m sklearnserver --model_name=sklearn-iris --model_dir=/models --http_port=8080"Output yang diharapkan:
inferenceservice.serving.kserve.io/sklearn-iris created INFO[0002] The Job sklearn-iris has been submitted successfully INFO[0002] You can run `arena serve get sklearn-iris --type kserve -n default` to check the job status -
Buat file bernama
iris-input.jsondengan konten berikut:cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOF -
Uji layanan inferensi.
# Dapatkan IP load balancer dari layanan nginx-ingress-lb di namespace kube-system. NGINX_INGRESS_IP=`kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}'` # Dapatkan hostname dari InferenceService sklearn-iris. SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) # Kirim permintaan prediksi menggunakan file iris-input.json. curl -H "Host: $SERVICE_HOSTNAME" -H "Content-Type: application/json" \ http://$NGINX_INGRESS_IP:80/v1/models/sklearn-iris:predict -d @./iris-input.jsonOutput yang diharapkan:
{"predictions":[1,1]}% -
Jalankan uji stres untuk memicu penskalaan.
CatatanLangkah ini menggunakan alat uji stres Hey.
hey -z 2m -c 20 -m POST -host $SERVICE_HOSTNAME -H "Content-Type: application/json" -D ./iris-input.json http://${NGINX_INGRESS_IP}:80/v1/models/sklearn-iris:predict -
Saat uji stres berjalan, periksa status penskalaan HPA di terminal terpisah.
kubectl describe hpa sklearn-iris-predictorBagian
Eventsmenunjukkan bahwa HPA melakukan scale-out menjadi 8 replika saat beban tinggi, lalu melakukan scale-in menjadi 7 dan 1 seiring penurunan beban.
Konfigurasi skalabilitas elastis berbasis pemanfaatan GPU
Jenis ini menggunakan HPA dalam mode Raw Deployment dengan komponen ack-alibaba-cloud-metrics-adapter untuk mengekspos metrik GPU kustom. Lihat Horizontal pod autoscaling berdasarkan metrik Alibaba Cloud Prometheus.
Contoh ini mengonfigurasi auto scaling berbasis pemanfaatan GPU.
-
Siapkan data model Qwen-7B-Chat-Int8. Lihat Deploy a vLLM inference service.
-
Konfigurasi metrik GPU kustom. Lihat Implement elastic scaling based on GPU metrics.
-
Terapkan layanan inferensi vLLM dengan penskalaan berbasis GPU.
arena serve kserve \ --name=qwen \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \ --gpus=1 \ --cpu=4 \ --memory=12Gi \ --scale-metric=DCGM_CUSTOM_PROCESS_SM_UTIL \ --scale-target=50 \ --min-replicas=1 \ --max-replicas=2 \ --data="llm-model:/mnt/models/Qwen-7B-Chat-Int8" \ "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen-7B-Chat-Int8 --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"Output yang diharapkan:
inferenceservice.serving.kserve.io/qwen created INFO[0002] The Job qwen has been submitted successfully INFO[0002] You can run `arena serve get qwen --type kserve -n default` to check the job status -
Uji layanan inferensi.
# Dapatkan alamat IP Nginx Ingress. NGINX_INGRESS_IP=$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}') # Dapatkan hostname dari InferenceService. SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen -o jsonpath='{.status.url}' | cut -d "/" -f 3) # Kirim permintaan uji ke endpoint chat completions vLLM. curl -H "Host: $SERVICE_HOSTNAME" -H "Content-Type: application/json" http://$NGINX_INGRESS_IP:80/v1/chat/completions -d '{"model": "qwen", "messages": [{"role": "user", "content": "Test"}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}'Output yang diharapkan:
{"id":"cmpl-77088b96abe744c89284efde2e779174","object":"chat.completion","created":1715590010,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"OK, what do you need to test?<|im_end|>"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":10,"total_tokens":20,"completion_tokens":10}}% -
Jalankan uji stres untuk memicu penskalaan berbasis GPU.
CatatanLangkah ini menggunakan alat uji stres Hey.
hey -z 2m -c 5 -m POST -host $SERVICE_HOSTNAME -H "Content-Type: application/json" -d '{"model": "qwen", "messages": [{"role": "user", "content": "Test"}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10}' http://$NGINX_INGRESS_IP:80/v1/chat/completions -
Saat uji stres berjalan, periksa status penskalaan HPA di terminal terpisah.
kubectl describe hpa qwen-hpaLayanan melakukan penskalaan menjadi 2 pod selama uji stres dan kembali ke 1 pod sekitar 5 menit setelah uji selesai.
Konfigurasi skalabilitas elastis terjadwal
Jenis ini menggunakan komponen ack-kubernetes-cronhpa-controller (CronHPA) untuk menyesuaikan jumlah replika Pod sesuai jadwal cron, cocok untuk pola lalu lintas yang dapat diprediksi.
-
Instal komponen CronHPA. Lihat Use CronHPA for scheduled horizontal scaling of containers.
-
Siapkan data model Qwen-7B-Chat-Int8. Lihat Deploy a vLLM inference service.
-
Terapkan layanan inferensi vLLM.
arena serve kserve \ --name=qwen-cronhpa \ --image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \ --gpus=1 \ --cpu=4 \ --memory=12Gi \ --annotation="serving.kserve.io/autoscalerClass=external" \ --data="llm-model:/mnt/models/Qwen-7B-Chat-Int8" \ "python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen-7B-Chat-Int8 --gpu-memory-utilization 0.95 --quantization gptq --max-model-len=6144"Output yang diharapkan:
inferenceservice.serving.kserve.io/qwen-cronhpa created INFO[0004] The Job qwen-cronhpa has been submitted successfully INFO[0004] You can run `arena serve get qwen-cronhpa --type kserve -n default` to check the job status -
Uji layanan inferensi.
# Dapatkan alamat IP Nginx Ingress. NGINX_INGRESS_IP=`kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}'` # Dapatkan hostname dari InferenceService. SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen-cronhpa -o jsonpath='{.status.url}' | cut -d "/" -f 3) # Kirim permintaan uji ke endpoint chat completions vLLM. curl -H "Host: ${SERVICE_HOSTNAME}" -H "Content-Type: application/json" \ http://$NGINX_INGRESS_IP:80/v1/chat/completions -X POST \ -d '{"model": "qwen", "messages": [{"role": "user", "content": "Hello"}], "max_tokens": 512, "temperature": 0.7, "top_p": 0.9, "seed": 10, "stop":["<|endoftext|>", "<|im_end|>", "<|im_start|>"]}'Output yang diharapkan:
{"id":"cmpl-b7579597aa284f118718b22b83b726f8","object":"chat.completion","created":1715589652,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"OK, what do you need to test?<|im_end|>"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":10,"total_tokens":20,"completion_tokens":10}}% -
Terapkan konfigurasi CronHPA. Contoh ini melakukan penskalaan menjadi 2 pod pada pukul 10.30 dan kembali ke 1 pod pada pukul 12.00 setiap hari.
Sumber daya CronHPA memiliki dua tugas terjadwal. Deployment
qwen-cronhpa-predictormelakukan penskalaan menjadi 2 pod pada pukul 10.30 dan kembali ke 1 pod pada pukul 12.00 setiap hari.
Langkah selanjutnya
Lihat Auto Scaling.