lmcache-mp — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited lmcache-mp (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Target audience: operators running vLLM on H100/H200/B200-class GPUs in production who need KV-cache extension beyond HBM and have outgrown the in-process LMCache path. Assumes Kubernetes or bare container deployment.
vllm-cachingvllm-caching covers vLLM's native CPU-offload (--kv-offloading-size, OffloadingConnector) and the in-process LMCacheConnectorV1 (LMCache linked into the vLLM worker). MP mode is structurally different:
Different image pair, different deployment shape, different troubleshooting surface. Hence its own skill.
Ask in order:
→ Native offload (--kv-offloading-size N --kv-offloading-backend native --disable-hybrid-kv-cache-manager). Zero extra pods. Use the vllm-caching skill, not this one.
→ In-process LMCacheConnectorV1 (--kv-transfer-config '{"kv_connector":"LMCacheConnectorV1","kv_role":"kv_both"}' + LMCACHE_LOCAL_DISK env vars). Still in vllm-caching skill.
→ MP mode. This skill.
→ NixlConnector or MooncakeConnector. See vllm-caching (and nvidia-nixl for transport-level tuning). MP can layer on top of these via MultiConnector.
Don't reach for MP mode just because it's newest — it adds operational surface (extra DaemonSet, ZMQ network path, two images to keep in sync, version-pin dance). The in-process LMCacheConnectorV1 still works fine for single-pod deployments.
Current stable pair (2026-05): vLLM v0.21.0 + LMCache v0.4.5. v0.19.1 remains the verified-floor bundling example below.
| Component | What you need | Notes |
|---|---|---|
| vLLM | v0.19.0 or newer for LMCacheMPConnector registered in factory.py | Pre-0.19 had only LMCacheConnectorV1. Both connectors coexist in 0.19+. Connector source path stable through v0.21.0. |
| vLLM | v0.20.0+ for cache_salt propagation through MP | PR #39837 added per-user/per-tenant cache isolation. Repo-local fallback adapter has a known bug — see Pitfalls below. Released in the v0.20.x line (v0.20.0 2026-04-27, v0.21.0 2026-05-15). |
| LMCache | 0.4.0+ for the MP adapter file (lmcache.integration.vllm.vllm_multi_process_adapter) | Moved into LMCache repo on 2026-01-07 (PR #2360). Earlier versions had it in vLLM. |
| LMCache | 0.4.4+ for vLLM v0.20+/main | vLLM main imports ParallelStrategy symbol that doesn't exist in 0.4.3. Verified 2026-04-26 against tags v0.4.3 (no class) vs v0.4.4 (has class). |
| LMCache | 0.4.5 recommended as current stable | v0.4.5 (2026-05-15) changed the default CUDA wheel to cu13, added DeepSeek V4 MP support, the raw_block MP L2 adapter, reconnect-after-LMCache-restart, and IsolatedLRU per-cache_salt quotas. |
Verified 2026-04-26 inside vllm/vllm-openai:v0.19.1 (sleep-overridden, exec'd in):
| Package | Version in v0.19.1 image | Import works? | Notes |
|---|---|---|---|
vllm | 0.19.1 | OK | — |
lmcache | 0.4.3 | OK | ParallelStrategy class NOT present yet (added 0.4.4) |
nixl | 0.9.0 | OK | — |
mooncake-transfer-engine | 0.3.10.post1 | OK as import mooncake | Pip name vs import name differ |
lmcache CLI | — | /usr/local/bin/lmcache | Server entrypoint ready out of the box |
All three KV connector classes (OffloadingConnector, LMCacheConnectorV1, LMCacheMPConnector) import cleanly in v0.19.1. Bundling is real this time — no pip install at container start needed for v0.19.x. The torch-conflict era of mid-2025 is over.
But: always verify the tag you actually deploy with scripts/verify-bundling.sh <tag>. It builds a sleep-overridden container, runs the import test, prints the version table. ~30 seconds (after pull).
Two containers. The LMCache server is a separate process; vLLM connects over ZMQ to localhost:6555.
# Terminal 1 — LMCache server
docker run --runtime nvidia --gpus all \
--network host --ipc host \
lmcache/standalone:nightly \
/opt/venv/bin/lmcache server \
--l1-size-gb 60 --eviction-policy LRU --max-workers 4 --port 6555
# Terminal 2 — vLLM (connects to LMCache via ZMQ)
docker run --runtime nvidia --gpus all \
--network host --ipc host \
lmcache/vllm-openai:latest-nightly \
Qwen/Qwen3-14B \
--no-enable-prefix-caching \
--disable-hybrid-kv-cache-manager \
--kv-transfer-config '{"kv_connector":"LMCacheMPConnector",
"kv_role":"kv_both",
"kv_connector_extra_config":{"lmcache.mp.port":6555}}'Required Docker flags:
--network host — vLLM container needs to reach LMCache on localhost:6555.--ipc host — CUDA IPC shared-memory transfers require shared /dev/shm.--runtime nvidia --gpus all — both containers see GPUs (the LMCache server uses GPU-side IPC even though it doesn't run inference).Flags on the vLLM side that operators forget:
--no-enable-prefix-caching — vLLM's own prefix cache is OFF. LMCache MP handles prefix caching externally.--disable-hybrid-kv-cache-manager — required by LMCacheMPConnector (raises a clear RuntimeError at startup if missing). Same restriction as OffloadingConnector.The canonical pattern is DaemonSet (LMCache) + Deployment (vLLM): one LMCache server per node serves multiple vLLM pods on that node.
As of operator-v0.1.1 (2026-05), an LMCache Kubernetes Operator reconciles an LMCacheEngine custom resource into the DaemonSet + Service + ConfigMap (image lmcache/lmcache-operator:v0.1.1, install via the install.yaml from that release). Prefer it over hand-rolled manifests for new clusters; the hand-written YAML in references/deployment.md remains the manual alternative and shows what the operator generates.
Example manifests live in the LMCache repo at examples/multi_process/:
lmcache-daemonset.yaml — LMCache server, one per nodevllm-deployment.yaml — vLLM pods that connect to the node-local LMCache via status.hostIPArchitecture details that bite if missed:
status.hostIP. Without hostNetwork, the server's listening port isn't reachable from sibling pods.For the full deployment recipe (sample YAMLs, prereqs, monitoring integration, cleanup), see references/deployment.md.
For the L1+L2 storage architecture (NIXL adapters, fs, mooncake_store, s3, eviction policies), see references/l2-storage.md.
LMCache MP does NOT yet support hybrid models (sliding-window + full attention, or attention + Mamba). Tracker: LMCache#2845.
Open community work: vLLM#38261 (HybridOffloadPlanner + MultiConnector hybrid awareness + mamba alignment) remains open as of 2026-05-28. LMCache#2879 (garbled output fix) was closed without merging (2026-05-21) — that fix did not land via that PR. Hybrid models (Qwen3.5/3.6, Mamba) are still unsupported in MP mode; #2845 comments last reconfirmed this on 2026-05-22. A community-contributed patch in #2845 works for Qwen3.5-27B specifically and is explicitly NOT production-ready.
Don't recommend MP for hybrid-model production today. Either:
vllm/vllm-openai:v0.19.1+ with native --kv-offloading-size (also requires --disable-hybrid-kv-cache-manager — see vllm-caching for the prefix-cache trade-off and the EAGLE/MTP spec-decode interaction).[kv_offload+HMA][N/N] series to complete in vLLM (parts 0–11 merged through 2026-04-25, the final hybrid-aware planner PR still pending). When done, native OffloadingConnector becomes the sanctioned hybrid-model path. See vllm-caching for the timeline.LMCacheMPConnector requires --disable-hybrid-kv-cache-managerSame restriction as OffloadingConnector. Without it the engine fails at startup:
RuntimeError: LMCacheMPConnector only works without hybrid kv cache manager.
Please pass --disable-hybrid-kv-cache-manager when starting vllmSource: vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py:78 (verified 2026-04-26).
Always set --no-enable-prefix-caching on the vLLM side when using LMCacheMPConnector. LMCache handles prefix caching externally. Leaving vLLM's own prefix cache on creates double-counting and inconsistent hit reporting.
ParallelStrategy version hazardvLLM main (post-2026-03) imports ParallelStrategy from lmcache.integration.vllm.vllm_multi_process_adapter. This class does not exist in lmcache 0.4.3 (verified against the v0.4.3 tag on 2026-04-26). It was added in 0.4.4.
| vLLM version | Required lmcache |
|---|---|
| v0.19.0, v0.19.1 | 0.4.0+ (works with bundled 0.4.3) |
| v0.20.0 – v0.21.0 (current stable) | 0.4.4+ (0.4.5 recommended) — verify on the released image |
| main / nightly | 0.4.4+ required (0.4.5 recommended) |
If you mix vLLM main with the v0.19.1 image's bundled 0.4.3, expect:
ImportError: cannot import name 'ParallelStrategy' from
'lmcache.integration.vllm.vllm_multi_process_adapter'Either pin to a matching pair or pip-upgrade lmcache inside the container.
PR #39837 added cache_salt/cache_salts keyword args at the LMCache MP connector call sites, but the repo-local fallback adapter (vllm/distributed/kv_transfer/kv_connector/v1/lmcache_integration/multi_process_adapter.py) still has the old method signatures. The external lmcache package is fine — only the fallback path used when import lmcache.integration.vllm.vllm_multi_process_adapter fails will trip:
TypeError: LMCacheMPSchedulerAdapter.maybe_submit_lookup_request()
got an unexpected keyword argument 'cache_salt'Don't rely on the fallback adapter. Make sure the external lmcache imports successfully (scripts/verify-bundling.sh).
LMCache --l1-size-gb is the total L1 size for that LMCache server, not per-GPU. The LMCache server is a single process. Don't multiply by TP size.
(This is the same direction as vLLM's --kv-offloading-size — total. Opposite of SGLang.)
Defaults (--eviction-policy LRU --eviction-trigger-watermark 0.8 --eviction-ratio 0.2) are fine for bursty traffic. Under sustained pressure, frequent eviction cycles can stutter cache hits. Lower the watermark (0.7) or raise the ratio (0.3) if logs show eviction every few seconds.
--ipc host (Docker) or mounting /dev/shm from the host (K8s) is mandatory. Without it, CUDA IPC shared-memory transfers between vLLM and LMCache pods fail silently or at startup with cryptic errors. The DaemonSet + Deployment example YAMLs show the right volumes/volumeMounts pattern.
The validation method is the same as for native CPU offload — vllm bench serve --dataset-name prefix_repetition, then diff vllm:external_prefix_cache_* Prometheus counters before and after. See vllm-caching for the methodology and right-sizing math (unique_prefix_budget_tokens ≈ l1_size_gib × 1024 × 1024 / kv_bytes_per_token).
Additional MP-specific signals:
{"status":"healthy"} when the engine is initialized. Wire this into K8s liveness/readiness probes.--prometheus-port to override. The MP server publishes its own metrics independent of vLLM's. KV Transfer metrics: GPU_to_CPU_total_bytes=N GPU_to_CPU_total_time=Ts
CPU_to_GPU_total_bytes=M CPU_to_GPU_total_time=UsNon-zero CPU_to_GPU_total_bytes proves the offload path is serving hits back.
Ranked by likelihood:
--no-enable-prefix-caching missing). Both caches racing → worse than either alone.hostNetwork misconfigured, or the vLLM pod scheduled to a node without an LMCache instance, falling through to no-cache or RPC failures./dev/shm.verify-bundling.sh.~/projects/github.com/LMCache/LMCache)docs/source/mp/ in the repo (index.rst, quickstart.rst, deployment.rst, l2_storage.rst, architecture.rst, http_api.rst, observability.rst, tracing_and_debugging.rst)vllm/distributed/kv_transfer/kv_connector/v1/lmcache_mp_connector.py (clone at ~/projects/github.com/vllm-project/vllm)LMCache/LMCache/examples/multi_process/See references/sources.md for verification dates and the inspection ritual.
Last verified: 2026-05-28 (freshen pass — versions + GitHub issue/PR state re-probed; bundling table for v0.21.0/0.4.5 not yet re-captured).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.