DKV (DifferentialKV) - это open-source фреймворк для сжатия KV-кэша, решающий проблему запуска больших языковых моделей с длинным контекстом на локальном оборудовании. Проект объединяет четыре техники: представление на основе якорей, совместное низкоранговое сжатие, точное сохранение остатков и разреженное маршрутизированное внимание. Результат - возможность обрабатывать последовательности в 32K, 128K токенов и более на GPU с ограниченным объёмом VRAM или на Apple Silicon с unified memory.
KV-кэш хранит ключи и значения для каждого токена, обеспечивая механизм внимания без повторных вычислений. При длине контекста L и количестве слоёв H его размер растёт как O(L × H). Для модели с 70B параметров на контексте 128K токенов KV-кэш может занимать свыше 100 ГБ - это исключает локальный инференс без сжатия. DKV атакует эту проблему системно, снижая потребление памяти в несколько раз при контролируемой потере качества.
Что такое DKV и почему сжатие KV-cache стало критичным
DKV (DifferentialKV) - фреймворк с открытым исходным кодом, нацеленный на сжатие KV-кэша для инференса LLM на локальных устройствах. KV-кэш - это структура, которая хранит промежуточные представления ключей и значений всех предыдущих токенов в трансформере. Без него каждая генерация следующего токена требовала бы пересчёта внимания для всей последовательности заново. Проблема в том, что с ростом длины контекста кэш становится главным потребителем памяти.
Современные модели выходят на контексты в 128K, 256K, а некоторые заявляют 1M токенов. Для Llama 3 70B на 128K токенов только KV-кэш требует порядка 140 ГБ в FP16. Это больше, чем объём VRAM у любой потребительской карты. Даже RTX 4090 с 24 ГБ не справляется с такими цифрами. Сжатие KV-кэша перестало быть опцией - это обязательное условие для запуска длинных контекстов локально.
DKV решает эту задачу через дифференциальный подход: не хранить всё, а сохранять только отличия от некоторого компактного представления. Фреймворк предоставляет CLI, поддержку бэкендов MLX (Apple Silicon) и CUDA (NVIDIA), а также детальный технический отчёт с бенчмарками. Это не просто теоретическая концепция - код доступен в репозитории, его можно клонировать и запустить.
Аналогичные задачи решают и другие проекты. Например, BeeLLama.cpp v0.4.0 использует variance-normalized квантизацию KVarN и механизм Precision Tail для снижения деградации на длинных контекстах. CachyLLama решает проблему повторной обработки промптов через персистентный SSD-кэш KV-состояний. DKV идёт дальше, предлагая не квантование или кэширование на диске, а структурное сжатие самого представления.
Четыре столпа сжатия: как DKV уменьшает KV-cache без потери качества
Архитектура DKV держится на четырёх техниках, работающих совместно. Каждая решает свою часть проблемы: избыточность представлений, высокую размерность, потерю точности и вычислительную сложность внимания. Вместе они дают кратный выигрыш в памяти при сохранении метрик качества, близких к исходной модели.
Anchor-based representations: якоря для ключей и значений
Первая техника исходит из наблюдения: соседние токены в последовательности часто имеют близкие представления в пространстве ключей и значений. Хранить каждый токен независимо - избыточно. Anchor-based representations решает это через группировку: выбирается набор якорных токенов, а остальные представляются как смещения относительно ближайшего якоря.
Механика напоминает ключевые кадры в видеокодеке: полная информация хранится только для опорных точек, а промежуточные состояния восстанавливаются интерполяцией. В DKV якоря выбираются адаптивно, на основе анализа распределения ключей в скользящем окне. Степень сжатия регулируется параметром - частотой расстановки якорей. При шаге в 4 токена объём кэша сокращается в 4 раза для заякоренной части.
Важный нюанс: якорное представление применяется не ко всем слоям равномерно. Нижние слои, фиксирующие локальный контекст, получают более частую сетку якорей. Верхние слои, отвечающие за глобальные зависимости, могут использовать более редкую расстановку. Это даёт дополнительный выигрыш без удара по качеству.
Joint low-rank compression: низкоранговое сжатие матриц внимания
Вторая техника использует математическое свойство матриц ключей и значений: их эффективный ранг часто значительно ниже номинальной размерности. Матрицу K размера L × d можно аппроксимировать произведением двух меньших матриц: L × r и r × d, где r - целевой ранг. Аналогично для V. При r << d экономия памяти достигает d/r раз.
DKV реализует совместное low-rank сжатие: ключи и значения сжимаются не независимо, а через общую факторизацию. Это сохраняет согласованность между K и V, критичную для вычисления внимания. Технически используется SVD с усечением по сингулярным числам, но с одним важным дополнением: ранг r не фиксирован глобально, а определяется для каждого слоя и каждой головы внимания отдельно. Головы, чувствительные к длинным зависимостям, получают более высокий ранг.
Практический выигрыш: для модели с размерностью d=128 и рангом r=16 сжатие одной матрицы даёт 8-кратное сокращение. С учётом того, что KV-кэш содержит по две матрицы на слой на голову, суммарный эффект набирается быстро. Бенчмарки DKV показывают сжатие KV-кэша в 5-10 раз без выхода перплексии за пределы 5% деградации на задачах LongBench.
Exact residual preservation: точное сохранение остатков для критичных токенов
Low-rank сжатие неизбежно теряет информацию. Остаток - разница между исходной матрицей и её низкоранговой аппроксимацией - содержит детали, которые могут быть критичны для определённых токенов. Например, для токенов, несущих редкие сущности, точные цифры или логические операторы.
DKV решает это через механизм точного сохранения остатков: для наиболее важных токенов остаток не отбрасывается, а сохраняется в исходной точности. Важность токена определяется через норму его вектора внимания: токены, на которые модель «смотрит» с большим весом, получают приоритет на сохранение остатка. Доля сохраняемых токенов - гиперпараметр, обычно 5-15% от длины последовательности.
Это создаёт эффективный компромисс: 85-95% токенов сжимаются агрессивно, а критическое меньшинство сохраняет полную информацию. Результат - качество, близкое к несжатому кэшу, при сжатии общего объёма в 3-8 раз. Схожий подход использует архитектура DWARF, где разрежённое внимание фокусируется на мультимасштабной выборке токенов, а не на всей истории.
Sparse routed attention: разреженное внимание с маршрутизацией
Четвёртая техника атакует не только память, но и вычислительную сложность. В стандартном attention каждая голова обращается ко всем предыдущим токенам - O(L²) операций. Sparse routed attention вводит маршрутизатор, который для каждой головы выбирает подмножество токенов для обработки.
Маршрутизатор обучается предсказывать, какие токены релевантны для каждой головы. Это не статический паттерн вроде sliding window - выбор адаптивен и зависит от содержимого последовательности. Голова, специализирующаяся на синтаксисе, получает близкие токены. Голова, отслеживающая coreference, получает разрежённую выборку по всей длине.
Разреженное внимание органично сочетается с предыдущими техниками: якоря служат естественными кандидатами для маршрутизации, а low-rank сжатие уменьшает объём данных, передаваемых в разрежённые головы. На практике это даёт ускорение инференса в 1.5-2 раза на длинных контекстах дополнительно к экономии памяти.
DKV на практике: CLI, бэкенды и первые результаты
Репозиторий DKV предоставляет полноценный инструментарий для экспериментов. Два бэкенда - MLX для Apple Silicon и CUDA для NVIDIA - покрывают основные платформы для локального инференса. CLI позволяет сжать модель, запустить инференс и сравнить метрики с базовой версией без сжатия.
Быстрый старт: установка и первый запуск
Установка стандартна для Python-проекта:
git clone https://github.com/username/dkv.git
cd dkv
pip install -e .
Для MLX-бэкенда на macOS:
pip install mlx mlx-lm
Для CUDA-бэкенда потребуется PyTorch с поддержкой CUDA 12.1+.
Запуск сжатия и инференса выполняется одной командой:
dkv run --model meta-llama/Meta-Llama-3-8B \
--backend cuda \
--max-context 32768 \
--anchor-interval 4 \
--low-rank-dim 16 \
--residual-ratio 0.1
Эта команда загружает Llama 3 8B, применяет все четыре техники сжатия и запускает инференс с контекстом 32K токенов. Параметры: интервал якорей 4, ранг low-rank сжатия 16, сохранение остатков для 10% токенов. Потребление памяти снижается с ~16 ГБ до ~4 ГБ для KV-кэша на этом контексте.
Бенчмарки: насколько эффективно сжатие?
Технический отчёт DKV приводит результаты на нескольких моделях и задачах. Ключевые цифры:
| Модель | Контекст | Сжатие KV-кэша | VRAM без сжатия | VRAM с DKV | Perplexity (Δ) |
|---|---|---|---|---|---|
| Llama 3 8B | 32K | 6.2x | 16.2 ГБ | 5.1 ГБ | +0.8 |
| Llama 3 8B | 128K | 5.8x | 64.8 ГБ | 14.3 ГБ | +1.2 |
| Mistral 7B | 32K | 7.1x | 14.1 ГБ | 4.0 ГБ | +0.6 |
| Qwen 2 7B | 128K | 6.5x | 56.6 ГБ | 11.8 ГБ | +1.0 |
На задачах LongBench падение точности составляет 1-3% абсолютных для большинства подзадач. Исключение - задачи на извлечение точных фактов из середины длинного документа, где деградация достигает 5-7%. Это плата за агрессивное сжатие, и DKV честно документирует эти случаи.
Сравнение с альтернативами: StreamingLLM на тех же контекстах показывает падение точности на 10-15% при сопоставимом сжатии. H2O даёт лучшие результаты на коротких контекстах, но деградирует быстрее DKV при переходе за 64K токенов. Квантование KV-кэша, как в BeeLLama.cpp с KVarN, ортогонально подходу DKV и потенциально может применяться поверх него для дополнительного выигрыша.
Интеграция с экосистемой: llama.cpp, vLLM, SGLang
На момент написания статьи DKV - standalone-фреймворк. Прямой интеграции с популярными инференс-движками нет. Однако архитектура проекта и открытая лицензия делают такое развитие вероятным.
llama.cpp - основной инструмент для локального инференса на CPU и GPU. Интеграция DKV в llama.cpp дала бы сотням тысяч пользователей доступ к сжатию KV-кэша без смены привычного инструмента. Основная сложность - формат кэша: llama.cpp использует собственную раскладку в памяти, оптимизированную под SIMD-инструкции. Адаптация потребует переупаковки сжатых представлений DKV в тензоры llama.cpp. Технически реализуемо, но требует плотной работы с кодовой базой.
vLLM - стандарт для высокопроизводительного сервинга LLM. Его PagedAttention уже эффективно управляет памятью KV-кэша, разбивая её на блоки. Сжатие DKV могло бы применяться на уровне страниц: блоки, редко используемые или имеющие низкую норму внимания, сжимаются сильнее. Это уменьшило бы общее потребление VRAM и позволило обслуживать больше параллельных запросов на том же оборудовании. Опыт запуска моделей на vLLM, включая конфигурации для специфичного железа, разбирается в статье про инференс DeepSeek-V4-Flash на одном B300, где управление памятью оказалось критичным фактором.
SGLang - фреймворк для структурированных генераций с собственным планировщиком KV-кэша. Интеграция DKV здесь интересна для сценариев с радикс-деревьями и бим-сёрчем, где KV-кэш ветвится. Сжатие уменьшило бы накладные расходы на хранение множества параллельных ветвей.
Практический кейс: сборка бюджетных кластеров для инференса, подобная описанной в разборе запуска GLM-5.2 на 16 AMD MI50, выиграла бы от сжатия KV-кэша напрямую. При ограниченной пропускной способности interconnect снижение объёма передаваемых данных между узлами так же важно, как и экономия локальной VRAM.
Ограничения и когда DKV не подойдет
DKV - проект на ранней стадии. Это означает возможные баги, неполную документацию и отсутствие гарантий стабильности API. Для продакшен-систем с жёсткими требованиями к надёжности стоит дождаться как минимум версии 1.0.
Сжатие KV-кэша не бесплатно. На задачах, требующих точного воспроизведения фактов из середины длинного документа, деградация может быть заметной. Если ваше приложение - юридический анализ контрактов на 100 страниц или извлечение точных цифр из финансовых отчётов, DKV в текущем виде может подвести. Для суммаризации, диалоговых систем и креативных задач потеря качества минимальна.
На коротких контекстах (до 8K токенов) выигрыш от DKV не оправдывает накладных расходов на сжатие и декомпрессию. Стандартный KV-кэш для 8K на Llama 3 8B занимает около 4 ГБ - это укладывается в бюджет большинства современных GPU. Сжатие здесь даст экономию в 2-3 ГБ ценой увеличения latency на 10-15%.
Совместимость с моделями: DKV тестировался на Llama-семействе, Mistral и Qwen. Для других архитектур, особенно с нестандартными механизмами внимания (Grouped Query Attention с экстремальными параметрами, мультимодальные модели с перекрёстным вниманием), работоспособность не гарантирована.
Альтернативы, которые стоит рассмотреть: StreamingLLM для задач, где важнее стабильность, чем максимальное сжатие; H2O для сценариев с выраженным attention sink; Quest для блочно-разрежённого внимания без сжатия представлений. Выбор зависит от конкретного компромисса между памятью, скоростью и качеством в вашей задаче.