как вынести KV-cache из VRAM в RAM/NVMe и ускорить длинные LLM-сессии
LMCache · KV cache · vLLM · SGLang · RAM · NVMe · long context

LMCache: как вынести KV-cache из VRAM в RAM/NVMe и ускорить длинные LLM-сессии

Длинный prompt на 100–200 тысяч токенов может дорого стоить не только по памяти: после eviction или перезапуска inference server приходится снова выполнять prefill — заново прогонять весь старый контекст через модель. LMCache превращает KV-cache из временного GPU-состояния в отдельный persistent/reusable слой, который можно держать в CPU RAM, SSD/NVMe, Redis/Valkey, S3 и других backends и затем загружать обратно без полного повторного prefill.

0.5.5 текущий stable PyPI release от 12 сентября 2026 года
11.9k GitHub stars активный PyTorch Foundation ecosystem project
Apache-2.0 · Linux Python 3.10–3.13; Windows — через WSL2/remote Linux
KV-cache как отдельная инфраструктура

LMCache не запускает модель — он сохраняет уже вычисленное внимание

vLLM, SGLang или другой inference engine всё равно загружает веса модели и выполняет inference. LMCache стоит рядом и занимается другим: он перехватывает готовые KV tensors, складывает их в отдельный cache layer и при следующем совпадающем контексте возвращает их обратно.

Prompt 200Kдлинная session/history
→
Prefillдорогой первый расчёт
→
LMCachestore reusable KV
→
Следующий запросrestore вместо полного re-prefill
01Не хранит веса модели вместо VRAM

Это не KTransformers и не CPU-offload model weights.

02Не увеличивает context window модели

Он помогает хранить/повторно использовать состояния уже допустимого контекста.

03Не заменяет vLLM/SGLang

Нужен serving engine с LMCache integration.

04Главная цель — TTFT/prefill

Повторный decode не становится магически быстрее только из-за cache.

Почему KV-cache вообще существует

Без KV-cache модель пересчитывала бы прошлое на каждом следующем токене

При autoregressive generation attention layers используют Key/Value states для уже обработанных токенов. Runtime сохраняет их, чтобы на следующем token не выполнять полный attention pass по старой последовательности заново.

WeightsЗнания модели

Фиксированный основной объём памяти модели.

KV-cacheСостояние конкретного контекста

Растёт вместе с tokens × sessions × architecture.

Compute buffersВременные tensors

Нужны runtime во время вычисления.

LMCache storageВнешний слой KV

Даёт больше virtual capacity за пределами GPU.

В обычном runtime KV-cache живёт в GPU memory. Когда места становится мало, старые blocks eviction'ятся. Если пользователь вернётся к этой session, engine снова обрабатывает длинный prefix. Именно этот повторный prefill LMCache пытается убрать.

У нас уже есть статья про размер контекста — здесь другой intent

Context tuning отвечает «сколько токенов держать», LMCache — «что делать с уже рассчитанным KV»

ТемаОсновной вопросРешение
Context window8K, 32K, 64K или 128K?Настроить лимит context и memory budget
KV quantizationКак уменьшить размер KV?Q8/Q4 cache formats, если runtime поддерживает
LMCacheКак не потерять дорогой KV после eviction?RAM/NVMe/remote storage + reuse
Cache полезен только когда есть reuse

LMCache особенно силён на длинных повторяющихся contexts

Очень подходитCoding-agent 100–200K+

Session постоянно возвращается к большому prefix из repo/system/tools context.

Очень подходитМного-turn chat

История растёт, а старый prefix повторяется почти дословно.

Очень подходитRAG / документы

Одни и те же документы используются в разных запросах.

Очень подходитMulti-engine serving

Standalone cache переживает lifecycle отдельных vLLM instances.

Мало пользыКаждый prompt полностью уникален

Cache hit почти отсутствует.

Мало пользыОчень короткие prompts

Повторный prefill дешевле, чем сложная storage hierarchy.

Первый cold request LMCache не ускоряет.

KV сначала нужно вычислить. Выигрыш появляется только тогда, когда тот же prefix/chunk реально используется снова.

Почему проблема уже не только enterprise

KV-cache длинной session легко занимает десятки гигабайт

Official LMCache FAQ приводит ориентиры для популярных моделей: Qwen3-8B — около 0.1373 GB KV на 1000 tokens, Qwen3-32B — около 0.2441 GB/1000 tokens в указанной TP-конфигурации, Llama-3.1-70B — около 0.3052 GB/1000 tokens. Это reference values для конкретных engine/hardware settings, а не универсальные константы.

Qwen3-8B≈13.7 GB / 100K tokens

Если грубо масштабировать официальный 0.1373 GB/1K reference.

Qwen3-32B≈24.4 GB / 100K tokens

Reference TP=2/H100 configuration.

Llama 70B≈30.5 GB / 100K tokens

Reference TP=4/H100 configuration.

Реальный KV size зависит от architecture и serving config.

GQA/MQA, attention type, dtype, TP, hybrid Mamba/linear-attention groups и cache quantization заметно меняют расчёт.

В 2026 основной path — Multiprocess

LMCache лучше рассматривать как отдельный cache service, а не библиотеку внутри vLLM

Current quickstart поддерживает два режима, но MP mode официально рекомендован. LMCache запускается отдельным процессом, а inference engines подключаются к нему через connector.

MP mode Standalone LMCache server

Лучше масштабируется, имеет HTTP management/observability и умеет обслуживать несколько engines.

In-process LMCache внутри vLLM

Проще для первого single-node experiment, но многие current docs считают этот path legacy/deprecated для продвинутых функций.

GPU KVсамый быстрый и дорогой слой
↕
L1 CPU RAMstandalone LMCache
↕
Secondary storageNVMe · Redis · S3 · InfiniStore · Mooncake

Отделение cache daemon от inference engine означает, что cache может пережить restart/crash serving process и использоваться несколькими engine instances, если model/cache geometry совместимы.

Stable 0.5.5

Установка

Current PyPI release 0.5.5 опубликован 12 сентября 2026. Package metadata: Python >=3.10,<3.14, POSIX/Linux и Apache-2.0.

uv venv --python 3.12
source .venv/bin/activate

uv pip install lmcache vllm

Official current installation docs для full runtime требуют: Linux, современный accelerator runtime и совместимый vLLM/PyTorch stack. Для NVIDIA — compute capability 7.0+ и CUDA 12.1+ как общий baseline.

NIXL optional extra

uv pip install "lmcache[nixl]"

NIXL нужен не каждому: он применяется для P2P/disaggregated prefill-decode и высокопроизводительного KV transfer.

LMCache и vLLM имеют независимые release cycles.

Current compatibility guide прямо предупреждает: одной пары version numbers недостаточно. Нужно одновременно совпадение Python/PyTorch/accelerator ABI, connector API и validation конкретной model/feature.

vLLM + MP mode

Минимальная схема: LMCache server + vLLM connector

1. Запустить cache server

lmcache server \
  --host localhost \
  --port 5555 \
  --l1-size-gb 20 \
  --eviction-policy LRU

Production default chunk size — 256 tokens. В official quickstart меньшие 8/16 используются только чтобы cache traffic было видно на коротком demo prompt.

2. Запустить vLLM

vllm serve Qwen/Qwen3-8B \
  --port 8000 \
  --kv-transfer-config \
  '{"kv_connector":"LMCacheMPConnector",
    "kv_role":"kv_both",
    "kv_connector_extra_config":{
      "lmcache.mp.host":"localhost",
      "lmcache.mp.port":5555
    }}'

Для vLLM ≥0.20 official docs рекомендуют при возможности использовать connector implementation, который ship'ится самим LMCache, потому что он быстрее получает новые protocol fixes/features:

vllm serve Qwen/Qwen3-8B \
  --kv-transfer-config \
  '{"kv_connector":"LMCacheMPConnector",
    "kv_connector_module_path":"lmcache.integration.vllm.lmcache_mp_connector",
    "kv_role":"kv_both"}'

3. Проверить состояние

lmcache ping kvcache
lmcache describe kvcache
MP server имеет два разных network surfaces.

Request endpoint по умолчанию — port 5555; HTTP management frontend — port 8080. Это важно для firewall и security.

Не только vLLM

Current quickstart поддерживает и SGLang integration

uv venv --python 3.12
source .venv/bin/activate

uv pip install --prerelease=allow lmcache sglang
cat > lmc_config.yaml <<'EOF'
chunk_size: 256
local_cpu: true
use_layerwise: true
max_local_cpu_size: 10
EOF

export LMCACHE_CONFIG_FILE=$PWD/lmc_config.yaml

python -m sglang.launch_server \
  --model-path Qwen/Qwen3-8B \
  --host 127.0.0.1 \
  --port 30000 \
  --enable-lmcache

SGLang integration в current quickstart также ориентируется на MP architecture. При этом validation status конкретных новых hybrid models может отличаться от vLLM.

RAM — только первый внешний tier

LMCache умеет строить реальную storage hierarchy

CPU RAMСамый быстрый external cache

Идеален для hot sessions, но объём конечен.

Local SSD/NVMeБольшой дешёвый persistent tier

Медленнее RAM, зато переживает engine restart и вмещает гораздо больше.

Redis / ValkeyRemote shared KV store

Подходит для нескольких nodes/engines.

S3-compatibleХолодный object storage

Ещё больше capacity, но latency выше.

NIXL / GDSВысокопроизводительный transfer

Для GPU/P2P/disaggregated serving.

Mooncake / InfiniStoreDistributed backends

Интеграции для production-scale cache fabric.

Current README перечисляет CPU RAM, local disk, Redis/Valkey, Mooncake, InfiniStore, S3-compatible storage, NIXL и GDS. Storage plugin framework позволяет добавлять собственные backends.

NVMe offload — не «бесплатная дополнительная VRAM».

Cache hit экономит GPU prefill, но KV всё равно нужно прочитать со storage и передать в engine. Если restore latency выше cold recompute, cache становится бесполезным.

Обычный prefix cache недостаточен для RAG

CacheBlend умеет повторно использовать chunks, даже если они находятся не в начале prompt

Традиционный prefix cache хорош, когда запросы начинаются одинаково. Но RAG часто собирает документы в разном порядке: один и тот же paragraph сегодня стоит первым, завтра третьим.

Prefix cachingA + B + C

Лучше всего повторно используется начало A.

CacheBlendX + B + Y

Может reuse repeated chunk B вне исходной prefix position.

lmcache server \
  --l1-size-gb 20 \
  --eviction-policy LRU \
  --engine-type blend

CacheBlend не просто безусловно вставляет старый KV. Он выборочно recompute'ит часть tokens на границах/смещённых позициях, чтобы восстановить quality.

CacheBlend — продвинутая функция, а не первый шаг настройки.

Сначала добейтесь корректного ordinary prefix reuse, затем измерьте, есть ли у вашего RAG достаточный non-prefix repetition, чтобы blending оправдал сложность.

Почему LMCache снова стал особенно актуален в 2026

Agentic workloads держат огромный context и постоянно возвращаются к нему после tool calls

Agent context 180Ksystem + repo + tools + history
→
Tool callshell / MCP / browser
→
Pause / scheduler evictionGPU KV может исчезнуть
→
Resumerestore KV instead of 180K re-prefill

Именно такие workloads всё чаще обсуждаются в сообществах vLLM/LocalLLaMA: несколько параллельных coding/research agents, 100–200K+ tokens на session и желание вынести холодный context из дорогой GPU memory.

Reddit / vLLMRAM + NVMe tiers

Пользователи сравнивают LMCache, native offload и custom storage layers.

LocalLLaMA200K+ agent sessions

Практические reports отмечают ценность восстановления evicted context без re-prefill.

Long-context modelsContext растёт быстрее VRAM

Qwen hybrid/flash families усиливают спрос на external KV storage.

Forum results нельзя переносить на своё железо как benchmark.

PCIe generation, RAM bandwidth, SSD, model architecture, chunk size, KV dtype и hit ratio полностью меняют итог.

Измерять нужно TTFT и restore latency

Высокий hit rate сам по себе ещё не означает хороший пользовательский опыт

Current LMCache CLI уже имеет отдельные bench, describe, ping, cache inspection и checksum tools.

lmcache describe kvcache
lmcache ping kvcache

lmcache bench server \
  --rpc-url tcp://localhost:5555 \
  --url http://localhost:8080 \
  --end 100
TTFTГлавный user-facing показатель

Сколько ждём первый token после отправки request.

Hit ratioСколько KV реально переиспользовано

Нужен, но без latency мало о чём говорит.

Restore throughputGB/s или tokens/s из cache tier

Показывает, успевает ли RAM/NVMe за compute.

Cold prefillBaseline

Без него нельзя понять, выгоден ли внешний cache.

Правильный A/B: один и тот же prompt с LMCache и без него.

Official benchmarking guide именно так и строит сравнение: baseline vLLM alone против vLLM + standalone LMCache.

Full runtime = Linux

На Windows LMCache лучше запускать через WSL2 или отдельный Linux server

Current PyPI package classifier — POSIX :: Linux. Full server использует CUDA extensions, POSIX shared memory и Linux-oriented serving ecosystem.

РекомендуетсяWSL2 + NVIDIA CUDA

Ближе всего к official Linux path.

Также хорошоОтдельный Linux AI server

Windows PC остаётся client, vLLM/LMCache живут на server.

Не путатьlmcache-cli работает без CUDA

CLI-only package может работать на любой ОС, но не запускает full cache server.

LMCache — не типичный desktop utility.

Если ваша локальная LLM живёт только в Ollama/LM Studio на Windows, LMCache не добавляется туда одной галочкой. Нужен совместимый serving engine — прежде всего vLLM/SGLang stack.

Очень важный current-docs нюанс

HTTP management frontend по умолчанию слушает 0.0.0.0:8080 и не должен быть публичным

Current MP HTTP API содержит не только health/status. Среди diagnostic routes есть /env, который показывает process environment, и /run_script, который выполняет caller-supplied Python внутри server process.

/envМожет раскрыть secrets

Official docs прямо говорят: environment dump без redaction/auth.

/run_scriptСчитать RCE surface

Docs прямо предупреждают: restricted builtins не являются security sandbox.

8080 default0.0.0.0

Нужен firewall/private network или явный loopback bind.

5555 defaultCache request endpoint

Тоже не публиковать в internet без внешнего network isolation.

Безопасный single-host baseline

lmcache server \
  --host 127.0.0.1 \
  --port 5555 \
  --http-host 127.0.0.1 \
  --http-port 8080 \
  --l1-size-gb 20 \
  --eviction-policy LRU
Не выставляйте port 8080 через обычный router port-forwarding.

Если нужен remote management, используйте VPN/private network и отдельный reverse-proxy/auth layer. Сам LMCache current HTTP API не является hardened public admin panel.

У проекта есть SECURITY.md; vulnerabilities просят отправлять maintainers по email. На дату проверки публичных GitHub Security Advisories проект не показывает.

Fast-moving infrastructure

Совместимость конкретной модели и connector path нужно проверять, а не предполагать

LMCache быстро развивается: stable 0.5.5 вышел 12 сентября, а 20 сентября nightly уже имеет version line 0.5.6.dev54. Количество model-specific recipes и hybrid-attention paths постоянно растёт.

Hybrid Mamba/GDN Исторический open issue #4701

В 0.5.3/0.5.4 + vLLM ≥0.26 reported disk restore мог давать высокий hit rate, но неправильный результат из-за incomplete KV geometry restore.

MP worker lifecycle Issue #4715

Reported idle worker reaping в data-parallel setup; issue отдельно проверял код 0.5.4.

September 0.5.5 Новые compatibility reports продолжаются

Current issue list содержит model/IPC/MP reports уже на 0.5.5-era stack.

Эти issues нельзя автоматически объявлять текущими defects всех 0.5.5 deployments.

Они относятся к конкретным model/engine/connector/geometry combinations. Но именно поэтому перед production rollout нужен validation: cache hit должен давать тот же ответ/quality, что cold prefill, а не только красивый hit-rate metric.

Для новых hybrid models official recipes часто прямо указывают, какие engines, CacheBlend, compression и MTP combinations уже validated, а какие ещё нет.

Не универсальный ускоритель

Есть workloads, где LMCache добавит больше сложности, чем скорости

01Cold prompt остаётся cold

Нечего restore, если контекст ещё ни разу не вычислялся.

02Decode-bound workload почти не выигрывает

LMCache в первую очередь борется с повторным prefill.

03NVMe имеет latency

Slow SSD может оказаться хуже recompute.

04Нужен reuse

Уникальные prompts создают cache pollution вместо пользы.

05Linux/vLLM complexity

Это инфраструктурный слой, а не простой Windows app.

06Version compatibility важна

LMCache/vLLM/PyTorch/model feature должны совпадать.

07Storage тоже стоит денег

RAM/NVMe/network bandwidth становятся частью inference budget.

08Cache correctness нужно проверять

Высокий hit ratio не доказывает корректный restore на новом hybrid model.

Практический decision tree

Нужен ли LMCache именно вам?

1Есть vLLM/SGLang?

Если только Ollama/LM Studio — сначала нужен другой serving stack.

2Context длиннее 32–64K?

Чем больше repeated prefill, тем выше потенциальный выигрыш.

3Prefixes повторяются?

Если нет — hit rate будет низким.

4GPU KV eviction реально происходит?

Измерить, а не предполагать.

5Есть свободная RAM?

Начать с L1 RAM — самый простой внешний tier.

6RAM не хватает?

Добавлять NVMe/remote backend.

7Сравнить cold vs restore TTFT

Если restore не быстрее — cache tier не окупается.

8Только затем CacheBlend/P2P

Не усложнять систему раньше времени.

Первоисточники

LMCache 0.5.5: MP architecture, storage, CacheBlend, security и compatibility

Материал проверен 21 сентября 2026 года.

Stable PyPI release — 0.5.5 от 12 сентября. Nightly 20 сентября уже использует line 0.5.6.dev54, поэтому compatibility docs перед production install нужно перепроверять.

Вывод

LMCache становится полезен тогда, когда context уже слишком дорог, чтобы постоянно считать его заново

Для домашнего chat с 8–16K context LMCache обычно избыточен. Для coding/research agents с 100K+, нескольких параллельных users, длинного RAG и production vLLM ситуация меняется: repeated prefill начинает стоить ощутимо дороже, чем хранение KV на более дешёвом tier.

Самая разумная последовательность: сначала L1 CPU RAM, измерить TTFT/hit ratio, затем NVMe или remote storage, и только потом CacheBlend/P2P/disaggregated serving.

LMCache не делает GPU быстрее. Он просто не заставляет GPU повторять вычисление, которое уже однажды было выполнено.

FAQ

Частые вопросы про LMCache

Что такое LMCache простыми словами?

Отдельный слой хранения KV-cache для LLM inference: уже вычисленный контекст можно вынести из GPU в RAM/NVMe/remote storage и затем переиспользовать без полного повторного prefill.

LMCache увеличивает VRAM?

Нет. Он увеличивает эффективную/виртуальную ёмкость KV storage за счёт более дешёвых tiers, но GPU memory физически не становится больше.

Можно ли хранить KV на SSD?

Да. Local filesystem/NVMe — один из supported secondary backends. Но нужно сравнивать restore latency с cold prefill.

Работает ли с vLLM?

Да. Это основной integration path; current docs рекомендуют MP mode через LMCacheMPConnector.

Работает ли с SGLang?

Да. Current quickstart содержит SGLang integration и MP-oriented configuration.

Работает ли с Ollama?

Не как drop-in cache layer. LMCache рассчитан на поддерживаемые serving engines вроде vLLM/SGLang/TRT-LLM integration paths.

Нужен ли LMCache для одного короткого чата?

Обычно нет. Он особенно полезен при длинном context, нескольких sessions и повторном использовании больших prefixes/documents.

Работает ли на Windows?

Full runtime официально Linux-oriented. На Windows практичный путь — WSL2 или отдельный Linux server. CLI-only package может работать без CUDA на других ОС.

Почему нельзя просто включить vLLM prefix cache?

In-engine prefix cache ограничен lifecycle и GPU capacity конкретного engine. LMCache добавляет persistent external tiers, cross-engine reuse и non-prefix reuse через CacheBlend.

Какая версия актуальна?

На 21 сентября 2026 current stable PyPI release — LMCache 0.5.5 от 12 сентября.

Длинный context без постоянного re-prefill

Ваш coding-agent каждый раз заново прогоняет 100–200 тысяч токенов после eviction или restart?

Начните с измерения cold TTFT и cache hit rate. Если repeated prefill действительно является bottleneck, LMCache с CPU RAM — самый простой первый шаг, а NVMe/remote tiers добавляются уже после benchmark.