Penyeimbangan beban yang memperhatikan KV Cache dirancang untuk skenario inferensi AI generatif dan secara dinamis menetapkan permintaan ke node komputasi optimal guna meningkatkan efisiensi layanan model bahasa besar (LLM) secara signifikan. Topik ini menjelaskan cara menggunakan komponen Gateway with Inference Extension untuk menerapkan kebijakan penyeimbangan beban yang memperhatikan KV Cache.
Informasi latar belakang
vLLM
vLLM adalah kerangka kerja yang dirancang untuk membangun layanan inferensi LLM secara efisien dan mudah digunakan. Kerangka kerja ini mendukung berbagai model bahasa besar, termasuk Qwen, serta mengoptimalkan efisiensi inferensi LLM melalui teknik-teknik seperti PagedAttention, inferensi batch dinamis (Continuous Batching), dan kuantisasi model.
KV cache
Prefix caching otomatis di vLLM
vLLM mendukung prefix caching otomatis. Automatic Prefix Caching (APC) menyimpan KV Cache untuk permintaan yang telah diproses oleh vLLM. Jika permintaan baru memiliki awalan (prefix) yang sama dengan permintaan sebelumnya, KV Cache yang sudah ada dapat digunakan kembali. Dengan demikian, permintaan baru dapat melewati komputasi KV Cache untuk awalan bersama tersebut, sehingga mempercepat pemrosesan permintaan inferensi LLM.
Hubungan antara kebijakan penyeimbangan beban yang memperhatikan KV Cache dan yang memperhatikan prefix
Kebijakan penyeimbangan beban yang memperhatikan KV Cache bekerja sebagai berikut:
Setiap beban kerja vLLM melaporkan informasi blok KV Cache yang telah di-cache ke Gateway with Inference Extension melalui pesan event. Dengan menggunakan informasi blok KV Cache dari setiap beban kerja vLLM, gateway dapat menjadwalkan permintaan baru ke beban kerja vLLM yang memiliki rasio hit cache tertinggi berdasarkan konten permintaan. Proses ini memaksimalkan rasio hit cache prefix dan mengurangi waktu tanggapan. Kebijakan ini terutama cocok untuk skenario di mana banyak permintaan memiliki awalan yang sama. Anda harus menentukan apakah kebijakan ini sesuai dengan skenario bisnis Anda.
Seperti halnya penyeimbangan beban yang memperhatikan prefix, penyeimbangan beban yang memperhatikan KV Cache juga memanfaatkan mekanisme prefix caching dari kerangka kerja layanan inferensi untuk memaksimalkan rasio hit cache prefix.
Penyeimbangan beban yang memperhatikan KV Cache dapat langsung menerima informasi distribusi blok KV Cache. Hal ini memungkinkan gateway untuk lebih tepat menentukan status cache permintaan dan memaksimalkan rasio hit cache prefix. Namun, kebijakan ini mensyaratkan bahwa layanan inferensi menggunakan vLLM versi 0.10.0 atau lebih baru serta Anda mengonfigurasi parameter pelaporan event KV Cache saat startup.
Penyeimbangan beban yang memperhatikan prefix terpisah dari mesin inferensi tetapi tidak dapat mendeteksi secara akurat distribusi KV Cache.
Untuk menggunakan penyeimbangan beban yang memperhatikan KV Cache, layanan inferensi Anda harus dibangun dengan kerangka kerja vLLM versi 0.10.0 atau lebih baru. Anda juga harus menentukan parameter event KV Cache dalam parameter startup vLLM. Untuk informasi lebih lanjut tentang pengaturan tersebut, lihat contoh dalam topik ini.
Prasyarat
Anda telah membuat kluster ACK yang dikelola dengan kelompok node GPU, sebagaimana dijelaskan dalam Buat kluster ACK yang dikelola. Anda juga dapat menginstal komponen ACK Virtual Node di kluster ACK yang dikelola untuk menggunakan daya komputasi GPU ACS, sebagaimana dijelaskan dalam Contoh penggunaan daya komputasi GPU ACS dengan ACK.
Topik ini menggunakan layanan model Qwen-32B sebagai contoh. Layanan ini memerlukan memori GPU lebih dari 64 GB. Kami merekomendasikan tipe instans ecs.gn8is-2x.8xlarge. Untuk node virtual ACS, kami merekomendasikan tipe kartu GU8TF.
Anda telah menginstal Gateway with Inference Extension versi 1.4.0-aliyun.3 atau lebih baru dan memilih Enable Gateway API Inference Extension. Untuk informasi selengkapnya, lihat Instal komponen Gateway with Inference Extension.
Terapkan layanan model
Langkah 1: Siapkan file model Qwen3-32B
Unduh model Qwen-32B dari ModelScope.
Pastikan plugin git-lfs telah diinstal. Jika belum diinstal, Anda dapat menjalankan
yum install git-lfsatauapt-get install git-lfsuntuk menginstalnya. Untuk informasi lebih lanjut tentang metode instalasi, lihat Installing Git Large File Storage.git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen3-32B.git cd Qwen3-32B/ git lfs pullBuat folder di OSS dan unggah file model ke dalamnya.
Untuk informasi tentang cara menginstal dan menggunakan ossutil, lihat Instal ossutil.
ossutil mkdir oss://<your-bucket-name>/Qwen3-32B ossutil cp -r ./Qwen3-32B oss://<your-bucket-name>/Qwen3-32BBuat volume persisten (PV) bernama
llm-modeldan klaim volume persisten (PVC) untuk kluster target. Untuk informasi selengkapnya, lihat Gunakan ossfs 1.0 untuk membuat volume penyimpanan statis.Buat file llm-model.yaml. File ini berisi konfigurasi untuk Secret, PV statis, dan PVC statis.
apiVersion: v1 kind: Secret metadata: name: oss-secret stringData: akId: <your-oss-ak> # ID AccessKey yang digunakan untuk mengakses OSS akSecret: <your-oss-sk> # Rahasia AccessKey yang digunakan untuk mengakses OSS --- apiVersion: v1 kind: PersistentVolume metadata: name: llm-model labels: alicloud-pvname: llm-model spec: capacity: storage: 30 Gi accessModes: - ReadOnlyMany persistentVolumeReclaimPolicy: Retain csi: driver: ossplugin.csi.alibabacloud.com volumeHandle: llm-model nodePublishSecretRef: name: oss-secret namespace: default volumeAttributes: bucket: <your-bucket-name> # Nama bucket. url: <your-bucket-endpoint> # Informasi Titik akhir, seperti oss-cn-hangzhou-internal.aliyuncs.com. otherOpts: "-o umask=022 -o max_stat_cache_size=0 -o allow_other" path: <your-model-path> # Dalam contoh ini, path-nya adalah /Qwen3-32B/. --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: llm-model spec: accessModes: - ReadOnlyMany resources: requests: storage: 30 Gi selector: matchLabels: alicloud-pvname: llm-modelBuat Secret, PV statis, dan PVC statis.
kubectl create -f llm-model.yaml
Langkah 2: Terapkan layanan inferensi vLLM
Buat file `vllm.yaml`.
Tabel berikut menjelaskan beberapa parameter startup dan variabel lingkungan.
Parameter startup/Variabel lingkungan
Deskripsi
--kv-events-config
Konfigurasi untuk memublikasikan event KV Cache. Harus berupa string JSON yang valid atau kunci JSON yang dilewatkan secara individual.
Nilai contoh:
{"enable_kv_cache_events":true,"publisher":"zmq","endpoint":"tcp://epp-default-qwen-inference-pool.envoy-gateway-system.svc.cluster.local:5557","topic":"kv@${POD_IP}@Qwen3-32B"}Rincian:
endpoint: Harus diatur ke titik akhir server ZMQ dari ekstensi inferensi. Konvensi penamaannya adalah
tcp://epp-<InferencePool namespace>-<InferencePool name>.envoy-gateway-system.<cluster local domain>:5557. Dalam contoh ini, sebuahInferencePoolbernamaqwen-inference-pooldibuat di namespacedefault. Oleh karena itu, endpoint diatur menjaditcp://epp-default-qwen-inference-pool.envoy-gateway-system.svc.cluster.local:5557.topic: Konvensi penamaannya adalah
kv@${POD_IP}@<served model name>. Dalam contoh ini, karena parameter startup vLLM--served-model-name Qwen3-32Bditentukan, topic diatur menjadikv@${POD_IP}@Qwen3-32B.
--prefix-caching-hash-algo
Algoritma yang digunakan untuk menghitung nilai hash blok cache prefix KV Cache. Harus diatur ke
sha256_cbor_64bit.--block-size
Jumlah token yang disimpan dalam setiap blok cache prefix KV Cache. Dalam contoh ini, diatur ke
64.PYTHONHASHSEED
Seed yang digunakan ketika Python menjalankan algoritma hash. Harus diatur ke nilai bukan nol. Dalam contoh ini, diatur ke
42.Terapkan layanan inferensi vLLM.
kubectl create -f vllm.yaml
Terapkan perutean inferensi
Langkah 1: Terapkan kebijakan perutean inferensi
Buat file `inference-policy.yaml`.
# InferencePool menyatakan bahwa perutean inferensi diaktifkan untuk beban kerja. apiVersion: inference.networking.x-k8s.io/v1alpha2 kind: InferencePool metadata: name: qwen-inference-pool spec: targetPortNumber: 8000 selector: app: qwen3 --- # 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 profile: single: # Menentukan bahwa layanan inferensi backend adalah penerapan vLLM mandiri. trafficPolicy: # Menentukan kebijakan penyeimbangan beban untuk layanan inferensi. prefixCache: mode: tracking # Mengaktifkan penyeimbangan beban yang memperhatikan KV Cache. trackingConfig: indexerConfig: tokenProcessorConfig: blockSize: 64 # Harus konsisten dengan parameter startup block-size vLLM. hashSeed: 42 # Harus konsisten dengan variabel lingkungan PYTHONHASHSEED vLLM. model: Qwen/Qwen3-32B # Menentukan nama resmi model layanan inferensi di ModelScope.Terapkan kebijakan perutean inferensi.
kubectl apply -f inference-policy.yaml
Langkah 2: Terapkan gateway dan aturan perutean gateway
Buat file `inference-gateway.yaml`. File ini berisi gateway, aturan perutean gateway, dan aturan timeout backend.
apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: name: inference-gateway spec: gatewayClassName: ack-gateway 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.io --- apiVersion: gateway.envoyproxy.io/v1alpha1 kind: BackendTrafficPolicy metadata: name: backend-timeout spec: timeout: http: requestTimeout: 24h targetRef: group: gateway.networking.k8s.io kind: Gateway name: inference-gatewayTerapkan gateway dan aturan perutean.
kubectl apply -f inference-gateway.yaml
Langkah 3: Verifikasi aturan perutean
Buat `round1.txt` dan `round2.txt`. Kedua file berisi bagian
contentdengan teks yang sama. Kirim konten `round1.txt` lalu `round2.txt` sebagai isi permintaan LLM. Kemudian, periksa log ekstensi inferensi untuk memverifikasi bahwa fitur penyeimbangan beban yang memperhatikan KV Cache telah dipicu.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 hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi 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":"Qwen3-32B","stream":true,"stream_options":{"include_usage":true},"temperature":0}' > round1.txtround2.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 hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi 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":"Qwen3-32B","stream":true,"stream_options":{"include_usage":true},"temperature":0}' > round2.txtDapatkan alamat IP publik gateway.
export GATEWAY_IP=$(kubectl get gateway/inference-gateway -o jsonpath='{.status.addresses[0].value}')Kirim dua permintaan sesi untuk mensimulasikan skenario percakapan multi putaran.
curl -X POST $GATEWAY_IP:8080/v1/chat/completions -H 'Content-Type: application/json' -d @./round1.txt curl -X POST $GATEWAY_IP:8080/v1/chat/completions -H 'Content-Type: application/json' -d @./round2.txtPeriksa log untuk memastikan bahwa penyeimbangan beban yang memperhatikan KV Cache sedang berjalan.
kubectl logs deploy/epp-default-qwen-inference-pool -n envoy-gateway-system|grep "handled"Output yang diharapkan:
2025-08-19T10:16:12Z LEVEL(-2) requestcontrol/director.go:278 Request handled {"x-request-id": "00d5c24e-b3c8-461d-9848-7bb233243eb9", "model": "Qwen3-32B", "resolvedTargetModel": "Qwen3-32B", "criticality": "Critical", "model": "Qwen3-32B", "targetModel": "Qwen3-32B", "endpoint": "{NamespacedName:default/qwen3-779c54544f-9c4vz Address:10.0.0.5 Labels:map[app:qwen3 pod-template-hash:779c54544f]}"} 2025-08-19T10:16:19Z LEVEL(-2) requestcontrol/director.go:278 Request handled {"x-request-id": "401925f5-fe65-46e3-8494-5afd83921ba5", "model": "Qwen3-32B", "resolvedTargetModel": "Qwen3-32B", "criticality": "Critical", "model": "Qwen3-32B", "targetModel": "Qwen3-32B", "endpoint": "{NamespacedName:default/qwen3-779c54544f-9c4vz Address:10.0.0.5 Labels:map[app:qwen3 pod-template-hash:779c54544f]}"}Output tersebut menunjukkan bahwa kedua permintaan dengan awalan yang sama diteruskan ke beban kerja yang sama. Hal ini mengindikasikan bahwa kebijakan penyeimbangan beban yang memperhatikan KV Cache sedang berjalan.