Что нового в BeeLlama.cpp v0.4.1: KVarN и mixed-precision KV cache
Релиз BeeLlama.cpp v0.4.1 приносит два инструмента, которые меняют правила игры в квантизации KV-кэша: variance-normalized квантизацию (KVarN) и mixed-precision KV cache precision tail. Задача - радикально сократить потребление VRAM без деградации качества генерации. Бенчмарки на Qwen 3.6 27B подтверждают: комбинация KVarN с precision tail длиной 1024 токена позволяет форматам kvarn5 и q6_0 достичь точности q8_0 при значительно меньшем объёме памяти.
Практический результат - запуск больших моделей на потребительских GPU, которые раньше требовали серверных конфигураций. Экономия VRAM достигается без катастрофических потерь в перплексии, что делает v0.4.1 обязательным обновлением для всех, кто работает с квантизацией KV-кэша на длинных контекстах.
KVarN: variance-normalized квантизация KV-кэша
Почему стандартная квантизация KV-кэша неэффективна
KV-кэш хранит ключи и значения для каждого токена в контексте. Проблема в том, что распределение этих значений крайне неравномерно: отдельные каналы содержат выбросы (outliers) с амплитудой, на порядки превышающей среднюю. Стандартная линейная квантизация применяет один масштабный коэффициент на весь тензор, и эти выбросы «растягивают» диапазон, заставляя терять точность на остальных 99% значений. Ошибка квантования концентрируется именно там, где плотность информации максимальна.
Прямое следствие: форматы вроде q4_0 или q2_0 дают приемлемую экономию памяти, но перплексия взлетает до неприемлемых значений. Модель начинает «забывать» детали контекста уже через несколько тысяч токенов.
Как variance normalization решает проблему outlier'ов
KVarN меняет подход на противоположный. Вместо того чтобы подстраивать квантизацию под выбросы, алгоритм сначала нормализует тензор по дисперсии. Процесс включает два шага:
- Преобразование Уолша-Адамара (Walsh-Hadamard Transform) - ортогональное преобразование, которое «размазывает» энергию выбросов по всем каналам, делая распределение более равномерным.
- Балансировка дисперсии Sinkhorn - итеративная процедура, выравнивающая дисперсии строк и столбцов матрицы до заданного порога. Результат - тензор, в котором каждый канал имеет сопоставимый масштаб значений.
После такой подготовки применяется стандартная квантизация, но ошибка распределяется равномерно, а не концентрируется в каналах с выбросами. Формат kvarn5 использует 5 бит на значение, но по точности приближается к 8-битным аналогам без нормализации. Детали реализации KVarN и её сравнение с TurboQuant разбирались в предыдущей версии BeeLlama.cpp v0.4.0.
Mixed-precision KV cache precision tail: точность там, где она нужна
Вторая инновация v0.4.1 - precision tail, механизм смешанной точности хранения KV-кэша. Идея проста и обоснована эмпирически: последние токены контекста сильнее всего влияют на генерацию следующего токена. Хранить весь кэш в высокой точности расточительно, но хранить всё в низкой - значит терять качество на самых важных позициях.
Precision tail решает это противоречие: заданное число последних токенов (tail) сохраняется в BF16 или F16, а весь остальной кэш остаётся в низкобитном формате. Механизм прозрачен для модели - она продолжает работать с кэшем как с единым тензором, но физически «горячие» токены имеют полную точность.
Влияние длины tail на точность и потребление памяти
Выбор длины tail - это компромисс между точностью и VRAM. Бенчмарки KLD на Qwen 3.6 27B показывают чёткую закономерность:
- tail 256 - снижает KLD на 30-40% относительно отсутствия tail, но всё ещё заметно уступает q8_0.
- tail 512 - сокращает разрыв с q8_0 вдвое, прирост VRAM около 5-7% относительно базового формата.
- tail 1024 - достигает паритета по KLD с q8_0, прирост VRAM 10-15%. Оптимальный выбор для большинства сценариев.
- tail 2048 - дальнейшее увеличение почти не улучшает KLD, но VRAM растёт линейно. Избыточно для моделей до 30B параметров.
Значение 1024 выбрано не случайно: это эмпирический порог, после которого влияние токена на текущую генерацию падает ниже уровня шума квантизации. Для MoE-моделей с агрессивной квантизацией, как показано в разборе Qwen3.6 35B A3B, этот порог может сдвигаться.
Бенчмарки: kvarn5 + q6_0 с tail 1024 против q8_0
Методология тестирования и конфигурация
Все замеры выполнены на модели Qwen 3.6 27B с контекстом 32 768 токенов. Метрика - Kullback-Leibler Divergence (KLD) между распределениями вероятностей следующего токена для эталонной конфигурации (FP16 KV-кэш) и тестируемой. Чем ниже KLD, тем ближе поведение модели к эталону. Инференс проводился на одном GPU NVIDIA RTX 4090 24 ГБ с оффлоадингом части слоёв в системную память.
Результаты: точность vs VRAM
| Конфигурация KV-кэша | KLD (×10⁻³) | VRAM под кэш, ГБ | Экономия VRAM vs q8_0 |
|---|---|---|---|
| q8_0 (эталон) | 0.0 | 8.2 | — |
| kvarn5 + q6_0, без tail | 12.4 | 4.3 | 47.6% |
| kvarn5 + q6_0, tail 512 | 4.1 | 4.9 | 40.2% |
| kvarn5 + q6_0, tail 1024 | 1.2 | 5.4 | 34.1% |
| kvarn5 + q2_0, tail 1024 | 8.7 | 3.1 | 62.2% |
Конфигурация kvarn5 + q6_0 + tail 1024 показывает KLD 1.2×10⁻³ - значение, которое на практике неотличимо от эталонного q8_0. Экономия VRAM составляет 34%, что для 27B модели означает возможность уместить контекст 32K в 24 ГБ вместо 32 ГБ. Снижение KLD на 42-76% для агрессивных форматов при добавлении tail подтверждалось ещё в тестах BeeLlama.cpp v0.4.0.
Новые типы стандартного KV cache: q2_0–q3_1, q6_0, q6_1
Помимо KVarN-форматов, v0.4.1 расширяет палитру стандартных типов квантизации KV-кэша. Добавлены шесть новых форматов, закрывающих весь спектр компромиссов между точностью и памятью:
- q2_0, q2_1 - 2-битная квантизация. Максимальная экономия VRAM (в 4 раза относительно q8_0), но KLD высок. Применимо для черновых прогонов, отладки промптов, сценариев с короткими ответами.
- q3_0, q3_1 - 3-битная квантизация. Промежуточный вариант: экономия в 2.7 раза, качество приемлемо для summarization и простых диалогов.
- q6_0, q6_1 - 6-битная квантизация. Близки к q8_0 по точности, но экономят 25% VRAM. Хороший выбор, если KVarN недоступен для конкретной архитектуры модели.
Стандартные типы не используют variance normalization, поэтому на длинных контекстах уступают KVarN-аналогам той же битности. Их преимущество - универсальность: работают с любыми архитектурами без ограничений.
Ограничения для архитектур SWA и как их обойти
Модели с Sliding Window Attention (SWA) - Mistral, Mixtral, некоторые версии Gemma - несовместимы с precision tail. Причина в маске внимания: SWA ограничивает поле зрения фиксированным окном (обычно 4096 токенов), и «последние токены» в понимании precision tail не совпадают с реально значимыми для генерации. Попытка применить tail приведёт к тому, что высокая точность будет расходоваться на токены за пределами окна внимания, а токены внутри окна останутся в низкой точности.
Для SWA-моделей доступны два обходных пути:
- Использовать KVarN без tail - variance normalization работает независимо от паттерна внимания. Формат
kvarn5даст экономию VRAM с минимальной потерей точности. - Использовать стандартные типы q6_0 или q6_1 - компромиссный вариант, если KVarN по каким-то причинам недоступен.
Проверка архитектуры модели перед выбором конфигурации обязательна. Информацию о типе внимания можно найти в конфигурационном файле модели (config.json, параметр use_sliding_window или sliding_window).
Практическое руководство: как включить KVarN и precision tail в BeeLlama.cpp
BeeLlama.cpp сохраняет совместимость с интерфейсом llama.cpp, поэтому все параметры передаются через аргументы командной строки. Базовый синтаксис:
./beellama-cli \
-m qwen3.6-27b-q4_k_m.gguf \
--kv-cache-type kvarn5 \
--kv-cache-precision-tail 1024 \
-c 32768 \
-ngl 99
Параметр --kv-cache-type принимает значения kvarn5, kvarn4, а также все стандартные типы от q2_0 до q8_0. Параметр --kv-cache-precision-tail задаёт длину хвоста в токенах; значение 0 отключает механизм.
Пример конфигурации для максимальной экономии VRAM
Запуск 27B модели на GPU с 16 ГБ VRAM с контекстом 32K:
./beellama-cli \
-m qwen3.6-27b-q4_k_m.gguf \
--kv-cache-type kvarn5 \
--kv-cache-precision-tail 512 \
-c 32768 \
-ngl 20 \
--gpu-layers 20
Эта конфигурация держит 20 слоёв на GPU, остальное в RAM. KV-кэш в формате kvarn5 с tail 512 потребляет около 6.5 ГБ, оставляя 9.5 ГБ под веса модели на GPU. KLD остаётся в пределах 5×10⁻³, что приемлемо для диалоговых сценариев.
Пример конфигурации для сохранения точности q8_0
Рекомендуемая конфигурация из бенчмарков, обеспечивающая паритет с q8_0:
./beellama-cli \
-m qwen3.6-27b-q4_k_m.gguf \
--kv-cache-type kvarn5 \
--kv-cache-precision-tail 1024 \
-c 32768 \
-ngl 99
Все 99 слоёв на GPU, KV-кэш с tail 1024 занимает 5.4 ГБ. Суммарное потребление VRAM - около 21 ГБ, что умещается в 24 ГБ RTX 4090. KLD 1.2×10⁻³ означает, что распределение вероятностей следующего токена статистически неотличимо от эталона.
Техника KVarN уже доказала эффективность на практике: запуск Bonsai-Ternary-27B на контексте 120K токенов с менее чем 10 ГБ VRAM стал возможен именно благодаря variance-normalized квантизации. BeeLlama.cpp v0.4.1 делает этот инструмент доступным в едином фреймворке с precision tail, закрывая вопрос «чем пожертвовать - памятью или точностью».