Когда упираешься в лимит видеопамяти, а модель просит еще 16 тысяч токенов контекста — хочется закричать. KV Cache пожирает VRAM быстрее, чем Chrome — оперативку. Методов сжатия за последние полгода напилили столько, что глаза разбегаются. Но есть один свежий кандидат, который обещает не просто сжать, а сделать это так, чтобы модель не тупела.
Встречаем OSCAR RotationZoo — инструмент от Together AI (они же авторы OSCAR KV Quant), который затаскивает квантование KV Cache до 2 бит с помощью спектрального вращения. Звучит как магия, но на деле — математика, которая переворачивает тензоры так, чтобы 2-битное представление не разваливало логику. Давай разбираться, как это работает и как прикрутить к себе.
Почему 2 бита? И почему вращение?
Обычное квантование (INT8, FP8) — это грубая сила: делишь на максимальное значение и округляешь. Но KV Cache — штука нервная. Натриешь ошибку в одном слое — и по цепочке поплывёт всё. RotationZoo подходит иначе: сначала применяет ортогональное преобразование (спектральное вращение) к матрицам Key и Value. Что это даёт?
В теории это работает так: у Key/Value есть «горячие» и «холодные» числа. Обычное квантование режет хвосты. Вращение делает распределение более однородным — квантование становится менее болезненным. На практике — ты просто получаешь возможность пихать в тот же VRAM в 3–4 раза больше контекста.
Сравнение с альтернативами: что выигрываем?
Методов сжатия вагон: от бинарного квантования до lossless. Давай приземлим на землю.
| Метод | Биты на элемент | Потери качества (при 4K ctx) | Скорость инференса |
|---|---|---|---|
| Binary KV Cache | 1.58 (бинарный) | ~2-3% падение | Быстро (логика на целых) |
| Delta-KV | 4 | ~0.5% | Средняя (с дельтой и декомпрессией) |
| KVarN | ~2.5 (групповое) | ~1% | Хорошая (оптимизация под GPU) |
| RotationZoo | 2 | ~0.8% | Фактически без тормозов (фьюжн-ядро) |
Binary KV Cache жмёт сильнее, но теряет заметно больше. Delta-KV точнее, но 4 бита — не рекорд. А RotationZoo берёт балансом: почти как беспотерьный, но всего 2 бита. Единственный минус — нужно дообучить или хотя бы калибровать вращение под архитектуру. Но авторы уже накатали готовые веса для популярных моделей.
Кстати, если интересно, как другие борются с квадратичной сложностью — загляни в статью про конец эпохи квадратичной сложности. Там много годных техник.
Ставим RotationZoo: пошаговая инструкция
Репозиторий называется togethercomputer/RotationZoo (на GitHub). Клонируем, ставим зависимости — всё стандартно. Но есть нюансы.
⚠️ RotationZoo собран под PyTorch 2.6+ и CUDA 12.8. На старых драйверах не взлетит. Проверь версии!
1 Клонируем и ставим
git clone https://github.com/togethercomputer/RotationZoo.git
cd RotationZoo
pip install -r requirements.txt
2 Загружаем калибровочные веса вращения
Для каждой архитектуры свои матрицы вращения. Авторы выложили предобученные для Llama 3, Qwen 3.5, Mistral. Качаем через huggingface-cli:
huggingface-cli download together/RotationZoo-llama3-rotation --local-dir ./rotations/llama3
Если модель не в списке — придётся калибровать самому. Скрипт calibrate.py натравит вращение на датасет. Процесс занимает минут 15 на A100.
3 Интегрируем в инференс
RotationZoo встраивается как плагин в популярные фреймворки. Например, для Hugging Face transformers достаточно обернуть модель:
from rotation_zoo import apply_2bit_kv_cache
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-3.1-8B-Instruct")
apply_2bit_kv_cache(model, rotation_path="./rotations/llama3")
# Теперь модель использует 2-битный KV Cache
Живой пример: Qwen 3.5 на 128K контекста на 24 ГБ
Возьмём Qwen 3.5 7B — модель с большим аппетитом. В FP16 её KV-кэш на 128K токенов жрёт около 18 ГБ. Иногда это влезает в одну RTX 4090 впритык, но с запасом для вывода уже не остаётся. Включаем RotationZoo — и кэш сжимается до ~3 ГБ. Разница колоссальная.
Но есть ложка дёгтя: при очень длинных диалогах (больше 200K токенов) ошибки квантования могут накапливаться. Авторы тестировали на 128K — всё ок, на 256K — лёгкая деградация. Совет: если гоняете model с длиннющей историей, лучше комбинировать RotationZoo с методиками вроде proveKV, который даёт 36x lossless — но это уже с потерей скорости.
А если у вас именно Qwen 3.5, то рекомендую почитать наш гайд по настройке Qwen 3.5 в llama.cpp — там есть нюансы про bf16 vs int8, которые тоже важны.
Кому это реально нужно?
Не всем. Если ты запускаешь маленькую модель с короткими промптами — RotationZoo избыточен. Но если:
- ты мучаешься с контекстом 64K+ на одной карте;
- хочешь запихнуть 70B модель в одну A100 за счёт сэкономленного VRAM;
- пилишь RAG-систему, где хранишь гигабайты KV-кэша в памяти;
- просто хочешь сэкономить бюджет на облачных GPU.
Тогда RotationZoo — твой кандидат. Единственное, что напрягает: пока нет встроенной поддержки в llama.cpp (авторы планируют PR), и для production нужно самому компилировать тритоновские ядра. Но это вопрос времени.
Если хочется попробовать что-то ещё из трендов — глянь гид по методам экономии памяти. Там полный обзор, включая более ранние версии.
P.S. Помнишь историю с Q8 KV cache для vision-моделей? Там тоже спектральное вращение помогало не убить перцептивное качество. Похоже, концепция начинает побеждать.