Saat men-deploy dan mengelola layanan model KServe, Anda perlu menangani fluktuasi beban yang sangat dinamis pada layanan inferensi model. KServe mengintegrasikan Horizontal Pod Autoscaler (HPA) Kubernetes native dan controller penskalaan, sehingga memungkinkan penyesuaian jumlah pod layanan model secara otomatis berdasarkan pemanfaatan CPU, penggunaan memori, pemanfaatan GPU, serta metrik kinerja kustom guna memastikan kinerja dan stabilitas layanan. Topik ini menggunakan model Qwen-7B-Chat-Int8 dan GPU V100 untuk menunjukkan cara mengonfigurasi skalabilitas elastis untuk layanan menggunakan KServe.
Prasyarat
Klien Arena versi 0.9.15 atau yang lebih baru telah diinstal. Untuk informasi selengkapnya, lihat Konfigurasikan klien Arena.
Komponen ack-kserve telah diinstal. Untuk informasi selengkapnya, lihat Instal komponen ack-kserve.
Konfigurasikan kebijakan auto scaling berdasarkan CPU atau memori
Auto scaling dalam mode Raw Deployment mengandalkan mekanisme Horizontal Pod Autoscaler (HPA) Kubernetes. HPA merupakan metode auto scaling dasar yang secara dinamis menyesuaikan jumlah replika pod dalam ReplicaSet berdasarkan pemanfaatan CPU atau memori pod.
Bagian ini menunjukkan cara mengonfigurasi auto scaling berdasarkan pemanfaatan CPU. Untuk informasi selengkapnya tentang mekanisme HPA, lihat dokumentasi Kubernetes tentang Horizontal Pod Autoscaling.
Jalankan perintah berikut untuk mengirimkan layanan.
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"Parameter-parameter tersebut adalah sebagai berikut:
Parameter
Deskripsi
--scale-metric
Metrik penskalaan. Nilai yang valid adalah
cpudanmemory. Contoh ini menggunakancpu.--scale-target
Ambang batas penskalaan, dalam persentase.
--min-replicas
Jumlah minimum replika. Nilai ini harus berupa bilangan bulat lebih besar dari 0. Kebijakan HPA tidak mendukung penskalaan hingga 0.
--max-replicas
Jumlah maksimum replika. Nilai ini harus berupa bilangan bulat lebih besar dari nilai
minReplicas.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 statusOutput tersebut menunjukkan bahwa layanan sklearn-iris telah dibuat.
Jalankan perintah berikut untuk menyiapkan permintaan input inferensi.
Buat file bernama iris-input.json dan tambahkan konten JSON berikut. Konten ini merupakan data masukan untuk prediksi model.
cat <<EOF > "./iris-input.json" { "instances": [ [6.8, 2.8, 4.8, 1.4], [6.0, 3.4, 4.5, 1.6] ] } EOFJalankan perintah berikut untuk mengakses layanan dan melakukan inferensi.
# Dapatkan alamat IP load balancer dari layanan bernama nginx-ingress-lb di namespace kube-system. Ini adalah titik masuk untuk akses eksternal. NGINX_INGRESS_IP=`kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}'` # Dapatkan URL Inference Service bernama sklearn-iris dan ekstrak hostname-nya untuk digunakan nanti. SERVICE_HOSTNAME=$(kubectl get inferenceservice sklearn-iris -o jsonpath='{.status.url}' | cut -d "/" -f 3) # Gunakan perintah curl untuk mengirim permintaan ke layanan model. Header permintaan menentukan hostname target (SERVICE_HOSTNAME yang diperoleh sebelumnya) dan tipe konten JSON. -d @./iris-input.json menentukan bahwa badan permintaan berasal dari file lokal iris-input.json, yang berisi data masukan yang diperlukan untuk prediksi model. 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]}%Output tersebut menunjukkan bahwa dua inferensi telah dijalankan, dan tanggapannya konsisten.
Jalankan perintah berikut untuk memulai uji stres.
CatatanUntuk informasi selengkapnya tentang alat uji stres Hey, lihat 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:predictSaat uji stres sedang berjalan, buka terminal lain dan jalankan perintah berikut untuk melihat status penskalaan layanan.
kubectl describe hpa sklearn-iris-predictorOutput yang Diharapkan:
Bagian
Eventspada output menunjukkan bahwa HPA secara otomatis menyesuaikan jumlah replika berdasarkan penggunaan CPU. Misalnya, jumlah replika berubah menjadi 8, 7, dan 1 pada waktu yang berbeda. Hal ini menunjukkan bahwa HPA dapat melakukan penskalaan otomatis berdasarkan penggunaan CPU.
Konfigurasikan kebijakan skalabilitas elastis berbasis metrik kustom berdasarkan pemanfaatan GPU
Auto scaling berbasis metrik kustom mengandalkan komponen ack-alibaba-cloud-metrics-adapter yang disediakan oleh ACK dan mekanisme HPA Kubernetes. Untuk informasi selengkapnya, lihat Horizontal pod autoscaling berdasarkan metrik Prometheus Alibaba Cloud.
Contoh berikut menunjukkan cara mengonfigurasi auto scaling berbasis metrik kustom berdasarkan pemanfaatan GPU pod.
Persiapkan data model Qwen-7B-Chat-Int8. Untuk informasi selengkapnya, lihat Deploy layanan inferensi vLLM.
Konfigurasikan metrik GPU kustom. Untuk informasi selengkapnya, lihat Implementasikan skalabilitas elastis berdasarkan metrik GPU.
Jalankan perintah berikut untuk men-deploy layanan vLLM.
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 statusOutput tersebut menunjukkan bahwa layanan inferensi telah di-deploy.
Jalankan perintah berikut untuk menggunakan alamat gerbang NGINX Ingress guna mengakses layanan inferensi dan menguji apakah layanan vLLM berjalan dengan benar.
# 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 Inference Service. SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen -o jsonpath='{.status.url}' | cut -d "/" -f 3) # Kirim permintaan untuk mengakses layanan inferensi. 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}}%Output tersebut menunjukkan bahwa permintaan telah dikirim ke server dan server mengembalikan respons JSON yang diharapkan.
Jalankan perintah berikut untuk melakukan uji stres pada layanan.
CatatanUntuk informasi selengkapnya tentang alat uji stres Hey, lihat 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/completionsSelama uji stres berlangsung, buka terminal baru dan jalankan perintah berikut untuk melihat status penskalaan layanan.
kubectl describe hpa qwen-hpaOutput yang Diharapkan:
Output tersebut menunjukkan bahwa jumlah pod bertambah menjadi 2 selama uji stres. Setelah pengujian berakhir, jumlah pod berkurang kembali menjadi 1 setelah sekitar 5 menit. Hal ini menunjukkan bahwa KServe dapat melakukan auto scaling berbasis metrik kustom berdasarkan pemanfaatan GPU pod.
Konfigurasikan kebijakan auto scaling terjadwal
Auto scaling terjadwal memerlukan komponen ack-kubernetes-cronhpa-controller yang disediakan oleh ACK. Komponen ini memungkinkan Anda mengubah jumlah replika aplikasi pada waktu atau interval tertentu untuk menangani perubahan beban yang dapat diprediksi.
Instal komponen CronHPA. Untuk informasi selengkapnya, lihat Gunakan CronHPA untuk penskalaan horizontal terjadwal kontainer.
Persiapkan data model Qwen-7B-Chat-Int8. Untuk informasi selengkapnya, lihat Deploy layanan inferensi vLLM.
Jalankan perintah berikut untuk men-deploy layanan 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 statusJalankan perintah berikut untuk menguji apakah layanan vLLM berjalan dengan benar.
# 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 Inference Service. SERVICE_HOSTNAME=$(kubectl get inferenceservice qwen-cronhpa -o jsonpath='{.status.url}' | cut -d "/" -f 3) # Kirim permintaan untuk mengakses layanan inferensi. 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}}%Output tersebut menunjukkan bahwa permintaan telah dikirim ke layanan dan layanan mengembalikan respons JSON yang diharapkan.
Jalankan perintah berikut untuk mengonfigurasi auto scaling terjadwal.
Output yang Diharapkan:
Output tersebut menunjukkan bahwa rencana auto scaling terjadwal telah dikonfigurasi untuk CRD
qwen-cronhpa. Berdasarkan jadwal tersebut, jumlah pod dalam deploymentqwen-cronhpa-predictorsecara otomatis disesuaikan pada waktu-waktu tertentu setiap hari untuk memenuhi persyaratan penskalaan yang telah ditetapkan.
Referensi
Untuk informasi selengkapnya tentang skalabilitas elastis ACK, lihat Auto Scaling.