Algoritma penyeimbangan beban tradisional dapat mendistribusikan permintaan HTTP standar secara merata di berbagai beban kerja. Namun, untuk layanan inferensi model bahasa besar (LLM), memprediksi muatan setiap permintaan di backend merupakan tantangan. Gateway with Inference Extension adalah komponen yang ditingkatkan yang dibangun di atas Kubernetes Gateway API dan spesifikasi Inference Extension-nya. Komponen ini menggunakan perutean pintar untuk meningkatkan penyeimbangan beban di berbagai beban kerja layanan inferensi. Gerbang ini menawarkan berbagai kebijakan penyeimbangan beban untuk skenario layanan inferensi LLM yang berbeda serta mengaktifkan fitur seperti rilis bertahap dan antrian permintaan inferensi.
Prasyarat
Anda telah menerapkan komponen Gateway with Inference Extension.
Anda telah menerapkan layanan inferensi LLM single-machine atau layanan inferensi terdistribusi multi-machine.
Langkah 1: Konfigurasikan perutean pintar untuk layanan inferensi
Gateway with Inference Extension menyediakan dua kebijakan penyeimbangan beban perutean pintar untuk memenuhi kebutuhan layanan inferensi yang berbeda:
Penyeimbangan beban berdasarkan panjang antrian permintaan dan pemanfaatan cache GPU (kebijakan default).
Kebijakan penyeimbangan beban sadar awalan (Prefix Cache Aware Routing).
Anda dapat mengaktifkan fitur perutean pintar gerbang inferensi dengan mendeklarasikan sumber daya InferencePool dan InferenceModel untuk layanan inferensi tersebut. Sesuaikan konfigurasi sumber daya InferencePool dan InferenceModel berdasarkan metode penerapan backend dan kebijakan penyeimbangan beban yang dipilih.
Penyeimbangan beban berdasarkan panjang antrian permintaan dan pemanfaatan cache GPU
Jika anotasi InferencePool kosong, kebijakan perutean pintar berdasarkan panjang antrian permintaan dan pemanfaatan cache GPU digunakan secara default. Kebijakan ini mengalokasikan permintaan secara dinamis berdasarkan beban real-time layanan inferensi backend, yang mencakup panjang antrian permintaan dan pemanfaatan cache GPU, untuk mencapai penyeimbangan beban optimal.
Buat file
inference_networking.yaml.Penerapan vLLM single-machine
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: vllm-inference extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan SGLang single-machine
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool annotations: inference.networking.x-k8s.io/model-server-runtime: sglang spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: sgl-inference extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan vLLM terdistribusi
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: vllm-multi-nodes role: leader extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan SGLang terdistribusi
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool annotations: inference.networking.x-k8s.io/model-server-runtime: sglang spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: sglang-multi-nodes role: leader extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan disagregasi PD SGLang
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool spec: targetPortNumber: 8000 selector: alibabacloud.com/inference_backend: sglang # Memilih beban kerja prefill dan decode --- # InferenceTrafficPolicy menentukan kebijakan trafik yang diterapkan pada InferencePool apiVersion: inferenceextension.alibabacloud.com/v1alpha1 kind: InferenceTrafficPolicy metadata: name: inference-policy spec: poolRef: name: qwen-inference-pool modelServerRuntime: sglang # Menentukan SGLang sebagai framework runtime untuk layanan backend profile: pd: # Menentukan bahwa layanan backend diterapkan dalam mode disagregasi PD pdRoleLabelName: rolebasedgroup.workloads.x-k8s.io/role # Membedakan peran prefill dan decode dalam InferencePool menggunakan label pod kvTransfer: bootstrapPort: 34000 # Port bootstrap yang digunakan untuk transfer KV Cache dalam layanan disagregasi PD SGLang. Nilai ini harus konsisten dengan parameter disaggregation-bootstrap-port yang ditentukan dalam penerapan RoleBasedGroup.Terapkan penyeimbang beban berdasarkan panjang antrian permintaan dan pemanfaatan cache GPU.
kubectl create -f inference_networking.yaml
Penyeimbangan beban sadar awalan (Prefix Cache Aware Routing)
Kebijakan Prefix Cache Aware Routing mengirim permintaan yang memiliki konten awalan yang sama ke pod server inferensi yang sama sebisa mungkin. Jika server model memiliki fitur cache awalan otomatis (APC) yang diaktifkan, kebijakan ini dapat meningkatkan rasio hit cache awalan dan mengurangi waktu tanggapan.
Versi vLLM v0.9.2 dan framework SGLang yang digunakan dalam dokumen ini telah mengaktifkan fitur cache awalan secara default. Anda tidak perlu menerapkan ulang layanan untuk mengaktifkan caching awalan.
Untuk mengaktifkan kebijakan penyeimbangan beban sadar awalan, tambahkan anotasi berikut ke InferencePool: inference.networking.x-k8s.io/routing-strategy: "PREFIX_CACHE"
Buat file
Prefix_Cache.yaml.Penerapan vLLM single-machine
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool annotations: inference.networking.x-k8s.io/routing-strategy: "PREFIX_CACHE" spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: vllm-inference extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan SGLang single-machine
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool annotations: inference.networking.x-k8s.io/model-server-runtime: sglang inference.networking.x-k8s.io/routing-strategy: "PREFIX_CACHE" spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: sgl-inference extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan vLLM terdistribusi
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool annotations: inference.networking.x-k8s.io/routing-strategy: "PREFIX_CACHE" spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: vllm-multi-nodes role: leader extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan SGLang terdistribusi
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool annotations: inference.networking.x-k8s.io/model-server-runtime: sglang inference.networking.x-k8s.io/routing-strategy: "PREFIX_CACHE" spec: targetPortNumber: 8000 selector: alibabacloud.com/inference-workload: sglang-multi-nodes role: leader extensionRef: name: inference-gateway-ext-proc --- apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferenceModel metadata: name: qwen-inference-model spec: modelName: /models/Qwen3-32B criticality: Critical poolRef: group: inference.networking.x-k8s.io kind: InferencePool name: qwen-inference-pool targetModels: - name: /models/Qwen3-32B weight: 100Penerapan disagregasi PD SGLang
apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool spec: targetPortNumber: 8000 selector: alibabacloud.com/inference_backend: sglang # Memilih beban kerja prefill dan decode --- # InferenceTrafficPolicy menentukan kebijakan trafik yang diterapkan pada InferencePool apiVersion: inferenceextension.alibabacloud.com/v1alpha1 kind: InferenceTrafficPolicy metadata: name: inference-policy spec: poolRef: name: qwen-inference-pool modelServerRuntime: sglang # Menentukan SGLang sebagai framework runtime untuk layanan backend profile: pd: # Menentukan bahwa layanan backend diterapkan dalam mode disagregasi PD trafficPolicy: prefixCache: # Mendeklarasikan kebijakan penyeimbangan beban cache awalan mode: estimate prefillPolicyRef: prefixCache decodePolicyRef: prefixCache # Menerapkan penyeimbangan beban sadar awalan baik untuk prefill maupun decode pdRoleLabelName: rolebasedgroup.workloads.x-k8s.io/role # Membedakan peran prefill dan decode dalam InferencePool menggunakan label pod kvTransfer: bootstrapPort: 34000 # Port bootstrap yang digunakan untuk transfer KV Cache dalam layanan disagregasi PD SGLang. Nilai ini harus konsisten dengan parameter disaggregation-bootstrap-port yang ditentukan dalam penerapan RoleBasedGroup.Terapkan penyeimbang beban sadar awalan.
kubectl create -f Prefix_Cache.yaml
Langkah 2: Terapkan gerbang
Buat file
gateway_networking.yaml.apiVersion: gateway.networking.k8s.io/v1 kind: GatewayClass metadata: name: inference-gateway-class spec: controllerName: inference.networking.x-k8s.io/gateway-controller --- apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: inference-gateway spec: gatewayClassName: inference-gateway-class listeners: - name: http-llm protocol: HTTP port: 8080 --- apiVersion: gateway.networking.k8s.io/v1 kind: HTTPRoute metadata: name: inference-route spec: parentRefs: - name: inference-gateway rules: - matches: - path: type: PathPrefix value: /v1 backendRefs: - name: qwen-inference-pool kind: InferencePool group: inference.networking.x-k8s.ioBuat sumber daya GatewayClass, Gateway, dan HTTPRoute untuk mengonfigurasi rute layanan inferensi LLM pada port 8080.
kubectl create -f gateway_networking.yaml
Langkah 3: Verifikasi konfigurasi gerbang inferensi
Jalankan perintah berikut untuk mendapatkan titik akhir eksternal gerbang:
export GATEWAY_HOST=$(kubectl get gateway/inference-gateway -o jsonpath='{.status.addresses[0].value}')Uji akses ke layanan pada port 8080 menggunakan perintah curl:
curl http://${GATEWAY_HOST}:8080/v1/chat/completions \ -H "Content-Type: application/json" \ -d '{ "model": "/models/Qwen3-32B", "messages": [ {"role": "user", "content": "Hello, this is a test"} ], "max_tokens": 50 }'Verifikasi kebijakan penyeimbangan beban yang berbeda.
Verifikasi kebijakan penyeimbangan beban berdasarkan panjang antrian permintaan dan pemanfaatan cache GPU
Kebijakan default melakukan perutean pintar berdasarkan panjang antrian permintaan dan pemanfaatan cache GPU. Anda dapat mengamati perilakunya dengan melakukan uji stres pada layanan inferensi dan memantau metrik waktu hingga token pertama (TTFT) serta throughput.
Untuk informasi lebih lanjut tentang metode pengujian spesifik, lihat Konfigurasikan metrik observabilitas dan dasbor untuk layanan LLM.
Verifikasi penyeimbangan beban sadar awalan
Buat file pengujian untuk memverifikasi bahwa penyeimbangan beban sadar awalan berfungsi.
Hasilkan round1.txt:
echo '{"max_tokens":24,"messages":[{"content":"Hi, here's some system prompt: hi hi hi hi hi hi hi hi hi hi.For user 3, here are some other context: hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi.I would like to test your intelligence. for this purpose I would like you to play zork. you can interact with the game by typing in commands. I will forward these commands to the game and type in any response. are you ready?","role":"user"}],"model":"/models/Qwen3-32B","stream":true,"stream_options":{"include_usage":true},"temperature":0}' > round1.txtHasilkan round2.txt:
echo '{"max_tokens":3,"messages":[{"content":"Hi, here's some system prompt: hi hi hi hi hi hi hi hi hi hi.For user 3, here are some other context: hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi.I would like to test your intelligence. for this purpose I would like you to play zork. you can interact with the game by typing in commands. I will forward these commands to the game and type in any response. are you ready?","role":"user"},{"content":"Hi there! It looks like you're setting up a fun test. I'm ready to play Zork! You can","role":"assistant"},{"content":"% zork\nWelcome to Dungeon. This version created 11-MAR-91.\nYou are in an open field west of a big white house with a boarded\nfront door.\nThere is a small mailbox here.\n>","role":"user"},{"content":"Great!","role":"assistant"},{"content":"Opening the mailbox reveals:\n A leaflet.\n>","role":"user"}],"model":"/models/Qwen3-32B","stream":true,"stream_options":{"include_usage":true},"temperature":0}' > round2.txtJalankan perintah berikut untuk melakukan pengujian:
curl -X POST ${GATEWAY_HOST}:8080/v1/chat/completions -H 'Content-Type: application/json' -d @./round1.txt curl -X POST ${GATEWAY_HOST}:8080/v1/chat/completions -H 'Content-Type: application/json' -d @./round2.txtPeriksa log Prosesor Ekstensi Inferensi untuk memastikan bahwa penyeimbangan beban sadar awalan berfungsi:
kubectl logs deploy/inference-gateway-ext-proc -n envoy-gateway-system | grep "Request Handled"Jika Anda melihat nama pod yang sama pada kedua entri log, berarti penyeimbangan beban sadar awalan berfungsi.
Untuk informasi lebih lanjut tentang metode dan hasil pengujian spesifik untuk penyeimbangan beban sadar awalan, lihat Evaluasi kinerja layanan inferensi menggunakan pengujian percakapan multi-putaran.