Skip to content

Home.ru

sikkatu edited this page Nov 2, 2026 · 11 revisions

English | Русский | 中文

kv-persistence

Постоянный KV-кэш для vLLM — перезапуск сервера перестаёт быть пересчётом истории.

kv-persistence записывает вычисленные vLLM-ом KV-блоки промптов на общем диске ВМ-диск и восстанавливает их после перезапусков. Разговор в любом OpenAI-совместимом чат-клиенте на 100 тыс.–1 млн токенов, который раньше после каждого рестарта пересчитывался десятки минут, переиспользует кэш вместо повторного prefill.

Чат-клиент → vLLM (TP4) → LMCacheMPConnector → lmcache-сервер (отдельный процесс)
       → постоянный уровень L2 (nixl_store_dynamic, POSIX) → NVMe

Зачем

  • Встроенный prefix cache vLLM живёт в памяти GPU и умирает вместе с процессом. Каждый перезапуск сервера с большими разговорами означал новый предсчёт всей истории.
  • Постоянный слой хранит переиспользуемые KV-чанки на общем диске ВМ. Рестарт vLLM (и даже рестарт сервиса кэша) их не стирает: поиск при промахе уходит на диск, а индекс восстанавливается лениво при старте.

Что гарантируется

  • Персистентность при рестартах — данные переживают и рестарт vLLM, и полный рестарт сервиса кэша (сценарии A и B в разделе Персистентность и восстановление).
  • Ограниченное хранилище — жёсткий лимит (1.5 ТБ по умолчанию; фактическая граница — свободное место на ОБЩЕМ диске ВМ, где также лежат Docker-образы и веса модели) и автоматической эвикцией с мягким порогом (90 %). Кэш никогда сам себя не очищает при старте.
  • Пространства совместимости — ревизия модели, токенизатор, KV-тип и чат-шаблон входят в ключ кэша. Несовместимые конфигурации никогда не читают чужие KV-данные; любая неопределённость даёт промах кэша, а не неверное попадание.
  • Lossless-хранение — уровень L2 работает только без потерь. Чанки хранятся байт-в-байт (LMCACHE_L2_SERDE=none, дефолт) или со lossless-сжатием zstd/lz4; lossy-квантизация (fp8 / turboquant / lbq) отвергается при старте. Каждый фрейм несёт CRC32: повреждение обнаруживается и трактуется как промах кэша, никогда не возвращается как неверный KV.
  • Опциональный мониторинг Prometheus + Grafana — официальный стек наблюдаемости LMCache (OTel Collector + Tempo + Prometheus + Grafana) поставляется в observability/ и поднимается одной командой; кэш полноценно работает и без него.
  • Модельно-агностичное ядро — слой кэш-политики отделён от интеграции с моделью; новые модели добавляют конфигурацию, а не код.

Статус

Реализация завершена, офлайн-тесты проходят (143 unit-теста + ещё 34 офлайн интеграционных/конфиговых = 160 пройдено, 2 пропущено; всего 177 — плюс 302 пройдено из 307 в репозитории sikkatu/recipes). Приёмочные hardware-прогоны на 4× RTX PRO 6000 с MiMo-V2.6-Pro (референсная конфигурация) заскриптованы в scripts/test-recovery.sh / scripts/benchmark.sh и запускаются эксплуатирующей стороной. Непроверенные возможности помечены честно — непроверенное не выдаётся за работающее.

С чего начать

Репозиторий: github.com/sikkatu/kv-persistence (Apache-2.0 + NOTICE: форки и пользователи обязаны упоминать sikkatu / kv-persistence; файл NOTICE).

Clone this wiki locally