KV Cache Offloading#

Introduction#

This tutorial demonstrates how to enable KV cache offloading using LMCache in a vLLM deployment. KV cache offloading moves large KV caches from GPU memory to CPU or disk, enabling more potential KV cache hits. vLLM Production Stack uses LMCache for KV cache offloading.

Prerequisites#

  • Installation of minimal example shown in Minimal Example

  • Kubernetes environment with GPU support

Steps to follow#

1. Configuring KV Cache Offloading#

Locate the file tutorials/assets/values-05-cpu-offloading.yaml with the following content:

servingEngineSpec:
    modelSpec:
    - name: "mistral"
        repository: "lmcache/vllm-openai"
        tag: "latest"
        modelURL: "mistralai/Mistral-7B-Instruct-v0.2"
        replicaCount: 1
        requestCPU: 10
        requestMemory: "40Gi"
        requestGPU: 1
        pvcStorage: "50Gi"
        vllmConfig:
        enableChunkedPrefill: false
        enablePrefixCaching: false
        maxModelLen: 16384

        lmcacheConfig:
        enabled: true
        cpuOffloadingBufferSize: "20"

        hf_token: <YOUR HF TOKEN>

Note

Note: Replace <YOUR HF TOKEN> with your actual Hugging Face token.

Note

The lmcacheConfig field enables LMCache and sets the CPU offloading buffer size to 20GB. You can adjust this value based on your workload.

Step 2: Deploy the Stack#

Deploy the Helm chart using the predefined configuration file:

helm install vllm vllm/vllm-stack -f tutorials/assets/values-05-cpu-offloading.yaml

Step 3: Validate Installation#

3.1 Check the pod logs to verify LMCache is active:#

sudo kubectl get pods

Identify the pod name for the vLLM deployment (e.g., vllm-mistral-deployment-vllm-xxxx-xxxx). Then run:

sudo kubectl logs -f <pod-name>

Look for the following log message to confirm LMCache is active:

INFO 01-21 20:16:58 lmcache_connector.py:41] Initializing LMCacheConfig under kv_transfer_config kv_connector='LMCacheConnector' kv_buffer_device='cuda' kv_buffer_size=1000000000.0 kv_role='kv_both' kv_rank=None kv_parallel_size=1 kv_ip='127.0.0.1' kv_port=14579
INFO LMCache: Creating LMCacheEngine instance vllm-instance [2025-01-21 20:16:58,732] -- /usr/local/lib/python3.12/dist-packages/lmcache/experimental/cache_engine.py:237

2. Forward the router service port to access the stack locally:#

sudo kubectl port-forward svc/vllm-router-service 30080:80

3. Send a request to the stack and observe the logs:#

curl -X POST http://localhost:30080/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mistralai/Mistral-7B-Instruct-v0.2",
        "prompt": "Explain the significance of KV cache in language models.",
        "max_tokens": 10
    }'

Expected output:

The response from the stack should contain the completion result, and the logs should show LMCache activity, for example:

DEBUG LMCache: Store skips 0 tokens and then stores 13 tokens [2025-01-21 20:23:45,113] -- /usr/local/lib/python3.12/dist-packages/lmcache/integration/vllm/vllm_adapter.py:490