Когда память кончается, а модель должна работать
К началу 2026 года ситуация стала абсурдной. Модели вроде Gemma 4 26B или Qwen2.5-72B требуют столько памяти для KV-кэша, что даже RTX 5090 плачет. Контекст в 256К токенов? Забудьте. Пока все обсуждали RotorQuant и его фантастическую скорость, Google тихо доработала TurboQuant. Добавила per-layer outlier-aware K и структурированное вращение FWHT. Результат - сжатие KV-кэша в 16 раз с потерями точности меньше 0.5% на MMLU Pro. Цифры скучные, но смысл простой: теперь можно запихнуть Gemma 4 31B с контекстом 256K на одну видеокарту. Без шуток.
TurboQuant 2026: не просто вращение, а умное вращение
Оригинальный TurboQuant, о котором мы писали раньше, работал на принципе случайных вращений. Брал векторы KV-кэша, крутил их в пространстве, потом квантовал. Проблема была в выбросах - тех самых значениях, которые выскакивали из общего распределения и портили всю статистику. Новый TurboQuant (актуальный на апрель 2026) использует FWHT - быстрое преобразование Уолша-Адамара. Звучит сложно, но на практике это структурированное вращение, которое лучше сохраняет геометрию данных.
1 Per-layer outlier-aware K: где прячутся выбросы
А вот это главное. Раньше TurboQuant обрабатывал все слои модели одинаково. Но в реальности распределение значений в KV-кэше отличается от слоя к слоу. В первых слоях больше выбросов, в последних - меньше. Per-layer outlier-aware K анализирует каждый слой отдельно, определяет пороговые значения для выбросов и применяет разную стратегию квантования. Для слоев с кучей выбросов используется QJL (Quantile-based Joint Limiting) - метод, который изолирует эти выбросы и квантует их отдельно с большей точностью.
Не путайте per-layer outlier-aware K с обычным outlier detection. Это не просто поиск аномалий, а адаптивная стратегия квантования, которая меняет битность для разных частей тензора внутри одного слоя. На 5-м слое Gemma 4 26B может быть 8-битное квантование для 95% значений и 16-битное для оставшихся 5% выбросов.
Сравнение: TurboQuant против RotorQuant и Attn-rot
В марте 2026 все говорили о RotorQuant - методе, который в 10-19 раз быстрее. В апреле ситуация изменилась. Да, RotorQuant все еще быстрее на чистой скорости квантования. Но TurboQuant с per-layer outlier-aware K дает лучшее качество при той же степени сжатия. Для Gemma 4 26B разница в перплексии (PPL) на WikiText-103 достигает 0.15 пунктов в пользу TurboQuant. Много? Для чат-бота нет. Для генерации кода или математических рассуждений - критично.
| Метод | Скорость (A100) | Сжатие KV-кэша | ΔPPL (Gemma 4 26B) | Поддержка Apple Silicon |
|---|---|---|---|---|
| TurboQuant (старый) | 850 мс / 1M токенов | 16x | +2.1% | Нет |
| TurboQuant + per-layer K (2026) | 920 мс / 1M токенов | 16x | +0.4% | Да (через Metal) |
| RotorQuant | 45-85 мс / 1M токенов | 16x | +0.7% | Да (нативный) |
| Attn-rot (llama.cpp) | ~200 мс / 1M токенов | 8x | +1.2% | Да (через GGML) |
Attn-rot в llama.cpp - это облегченная версия TurboQuant, о которой мы уже писали. Она проще в интеграции, но дает меньшее сжатие и больше потерь. Для Qwen3.5-14B это нормально. Для Gemma 4 26B - уже нет.
Как это работает на практике: Gemma 4 и Qwen
Возьмем конкретный пример. У вас есть RTX 5090 с 24GB памяти. Хотите запустить Gemma 4 31B с контекстом 256К. Без квантования KV-кэша это невозможно - только на кэш уйдет 30+ GB. С TurboQuant per-layer outlier-aware K - пожалуйста. Алгоритм такой:
- Загружаем модель в 4-битном квантовании весов (используем метод Bartowski или Unsloth - разница в 10 токенов/сек, как мы уже разбирали).
- Включаем TurboQuant для KV-кэша с параметром per_layer_outlier_aware=True.
- Система автоматически анализирует каждый слой, определяет пороги для QJL, применяет FWHT вращение.
- KV-кэш сжимается в 16 раз, занимая вместо 30GB всего 1.8GB.
- Профит - модель работает, контекст полный, качество падает на доли процента.
Для Qwen2.5-72B сценарий аналогичный, но здесь per-layer outlier-aware K еще важнее. В этой модели выбросы в KV-кэше распределены неравномерно - в средних слоях их концентрация выше на 40%. Старый TurboQuant терял здесь до 3% качества. Новый - всего 0.6%.
Кому это нужно? (Спойлер: почти всем)
Если вы думаете, что TurboQuant с per-layer outlier-aware K - удел исследователей, ошибаетесь. Вот кому это пригодится прямо сейчас:
- Энтузиастам с одной видеокартой - хотите запускать большие модели с длинным контекстом? Это ваш метод. Гайд уже есть.
- Разработчикам локальных приложений - когда нужно держать в памяти несколько экземпляров модели для разных пользователей. Сжатие KV-кэша в 16 раз = можно запустить в 4 раза больше инстансов.
- Исследователям - для экспериментов с длинными контекстами без аренды серверов с терабайтами памяти.
- Всем, кто работает с RAG - потому что в retrieval-augmented generation длинный контекст это не роскошь, а необходимость.
Подводные камни (они всегда есть)
Идеального не бывает. Per-layer outlier-aware K требует предварительного анализа модели - хотя бы одного прохода forward pass для сбора статистики. Это добавляет 5-10 секунд к времени загрузки. Не критично, но неприятно. FWHT вращение, хотя и быстрое, не оптимально для всех архитектур. В Llama 3.3 оно работает лучше, чем в Qwen. Почему? Магия внутренних активаций.
И главное - TurboQuant per-layer outlier-aware K сложнее в реализации, чем RotorQuant или Attn-rot. Нужно правильно определить пороги для QJL, подобрать параметры для каждого типа слоя. Google выложила референсную реализацию, но для интеграции в ваш пайплайн придется попотеть.
Что дальше? Прогноз на 2026
Квантование KV-кэша перестает быть экзотикой. Это стандартная опция, как когда-то 8-битное квантование весов. К концу 2026 жду слияния методов: RotorQuant для скорости + per-layer outlier-aware K для качества. И обязательно появятся аппаратные ускорители, которые будут делать это на лету, без потерь производительности. А пока - выбирайте. Скорость (RotorQuant) или качество (TurboQuant per-layer). Или комбинируйте методы под свою задачу. Главное - не бойтесь экспериментировать. Потому что память - это новый bottleneck, и те, кто научатся ее экономить, получат преимущество.