全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan perutean inferensi cerdas untuk menerapkan penyeimbangan beban yang memperhatikan KV Cache

更新时间:Nov 11, 2025

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

Selama proses inferensi, kunci dan nilai yang dihasilkan oleh model disimpan dalam cache agar informasi kontekstual dari permintaan sebelumnya dapat diakses dengan cepat. Hal ini meningkatkan efisiensi generasi teks oleh model. Penggunaan KV Cache dapat menghindari komputasi berulang, mempercepat kecepatan inferensi, dan mengurangi latensi tanggapan model.

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.

Penting

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

Terapkan layanan model

Langkah 1: Siapkan file model Qwen3-32B

  1. Unduh model Qwen-32B dari ModelScope.

    Pastikan plugin git-lfs telah diinstal. Jika belum diinstal, Anda dapat menjalankan yum install git-lfs atau apt-get install git-lfs untuk 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 pull
  2. Buat 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-32B
  3. Buat volume persisten (PV) bernama llm-model dan klaim volume persisten (PVC) untuk kluster target. Untuk informasi selengkapnya, lihat Gunakan ossfs 1.0 untuk membuat volume penyimpanan statis.

    1. 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-model
    2. Buat Secret, PV statis, dan PVC statis.

      kubectl create -f llm-model.yaml

Langkah 2: Terapkan layanan inferensi vLLM

  1. Buat file `vllm.yaml`.

    Klik untuk melihat konten YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: qwen3
      name: qwen3
    spec:
      progressDeadlineSeconds: 600
      replicas: 3
      revisionHistoryLimit: 10
      selector:
        matchLabels:
          app: qwen3
      strategy:
        rollingUpdate:
          maxSurge: 25%
          maxUnavailable: 25%
        type: RollingUpdate
      template:
        metadata:
          annotations:
            prometheus.io/path: /metrics
            prometheus.io/port: '8000'
            prometheus.io/scrape: 'true'
          creationTimestamp: null
          labels:
            app: qwen3
        spec:
          containers:
            - command:
                - sh
                - '-c'
                - >-
                  vllm serve /models/Qwen3-32B --served-model-name Qwen3-32B
                  --trust-remote-code --port=8000 --max-model-len 8192
                  --gpu-memory-utilization 0.95 --enforce-eager --kv-events-config
                  "{\"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\"}"
                  --prefix-caching-hash-algo sha256_cbor_64bit --block-size 64
              env:
                - name: POD_IP
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: status.podIP
                - name: PYTHONHASHSEED
                  value: '42'
              image: 'registry-cn-hangzhou.ack.aliyuncs.com/dev/vllm:0.10.0'
              imagePullPolicy: IfNotPresent
              name: vllm
              ports:
                - containerPort: 8000
                  name: restful
                  protocol: TCP
              readinessProbe:
                failureThreshold: 3
                initialDelaySeconds: 30
                periodSeconds: 30
                successThreshold: 1
                tcpSocket:
                  port: 8000
                timeoutSeconds: 1
              resources:
                limits:
                  nvidia.com/gpu: '1'
                requests:
                  nvidia.com/gpu: '1'
              terminationMessagePath: /dev/termination-log
              terminationMessagePolicy: File
              volumeMounts:
                - mountPath: /models/Qwen3-32B
                  name: model
                - mountPath: /dev/shm
                  name: dshm
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
          volumes:
            - name: model
              persistentVolumeClaim:
                claimName: llm-model
            - emptyDir:
                medium: Memory
                sizeLimit: 30Gi
              name: dshm
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: qwen3
      name: qwen3
    spec:
      ports:
        - name: http-serving
          port: 8000
          protocol: TCP
          targetPort: 8000
      selector:
        app: qwen3
      type: ClusterIP

    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, sebuah InferencePool bernama qwen-inference-pool dibuat di namespace default. Oleh karena itu, endpoint diatur menjadi tcp://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-32B ditentukan, topic diatur menjadi kv@${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.

  2. Terapkan layanan inferensi vLLM.

    kubectl create -f vllm.yaml

Terapkan perutean inferensi

Langkah 1: Terapkan kebijakan perutean inferensi

  1. 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.
  2. Terapkan kebijakan perutean inferensi.

    kubectl apply -f inference-policy.yaml

Langkah 2: Terapkan gateway dan aturan perutean gateway

  1. 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-gateway
  2. Terapkan gateway dan aturan perutean.

    kubectl apply -f inference-gateway.yaml

Langkah 3: Verifikasi aturan perutean

  1. Buat `round1.txt` dan `round2.txt`. Kedua file berisi bagian content dengan 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.txt

    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 hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi hi 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.txt
  2. Dapatkan alamat IP publik gateway.

    export GATEWAY_IP=$(kubectl get gateway/inference-gateway -o jsonpath='{.status.addresses[0].value}')
  3. 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.txt
  4. Periksa 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.