Skip to main content
CacheBlend is a technique introduced by the Tensormesh team that reuses precomputed KV caches beyond prefix boundaries. Rather than requiring an exact prefix match, it reuses any contiguous block of previously computed tokens regardless of position, then selectively recomputes a small subset of tokens to partially update each reused block. CacheBlend is most useful when:
  • prompt reuse is non-prefix — shared blocks sit after a per-request preamble, system prompt, or other documents
  • you serve RAG workloads where the same documents are retrieved in varying order across requests

Prerequisites

Install Chart

Install the chart with CacheBlend enabled. This creates the CacheBlendEngine — a per-node DaemonSet — in the tensormesh-operator namespace:
my-values.yaml

Opting a vLLM pod in

CacheBlend plugin attaches to vLLM pods you deploy — the operator does not create them. First create the workload namespace (PSS-privileged) and the plugin pull secret — the private init container is pulled in the pod’s namespace, so the secret must live here:
Then add a label + annotation to your pod template and launch vLLM args-only (a command: override makes the webhook skip injection):
Everything else (image, model, resources, replicas) stays your normal vLLM config. At admission the webhook injects the plugin init container, hostIPC, the CUSTOM attention backend, and the --kv-transfer-config (CBKVConnector) pointing at the node-local engine; blend tunables (cb.check_layer, cb.recomp_ratio) come from the engine config.

Helm values reference

Verification

Engine reconciled

The <engine>-connection ConfigMap is the reconcile proof — and the gate the webhook reads. If it is missing, injection silently fail-opens (the pod runs without CacheBlend).

Webhook wired

A non-empty caBundle means cert-manager issued the serving cert and the webhook can be called.

Injection happened

After creating an opt-in vLLM pod in the workload namespace:

Non-prefix blend actually engaged

Send two requests that share a block after different-length preambles, then check the engine logs. A shifted retrieve means a chunk was reused at a different position than it was cached — i.e. a non-prefix blend (select the engine by instance to skip any regular LMCacheEngine in the same ns):

Common mistakes

  • Running the opt-in vLLM pod in the operator (release) namespace — the webhook excludes it, so injection never happens
  • A bare engine ref (tensormesh-cacheblend) instead of <release-ns>/tensormesh-cacheblend — the webhook looks in the pod’s own namespace and finds no engine
  • Setting a command: on the vLLM container — the webhook skips injection (appended args would never reach vllm serve)
  • Workload namespace not PSS-privileged — Pod Security rejects the injected hostIPC
  • The cacheblend-plugin-pull secret missing from the workload namespace — the injected init container ImagePullBackOffs (the secret must live where the pod runs, not in the operator namespace)
  • Mismatched cacheblend-plugin and vllm-openai images — vLLM crashes at startup with an ImportError; pin a matched pair
  • webhook.enabled: false or no cert-manager — the engine deploys but nothing injects the plugin