Квантизация в деталях
Квантизация сжимает веса из 16-битных float в меньшее число бит, меняя немного качества на много памяти. Версия в одну строку (Q8 ≈ без потерь, Q4_K_M ≈ золотая середина, ниже Q3 больно) достаточна, чтобы начать. Эта страница спускается уровнем ниже: что теги реально делают, чем K-кванты отличаются от I-квантов и где потеря качества проявляется первой.
Почему 4 бита вообще работают
Обученные веса — не равномерный шум. Значения в каждом тензоре кучкуются в узком, примерно колоколообразном распределении, и поведение сети несёт форма этого распределения — а не последний десятичный знак любого отдельного веса. Это делает веса сжимаемыми: храните каждый вес как маленькое целое плюс общий масштаб — и теряете только мелкие детали.
Одно реальное осложнение: каналы-выбросы. Малая доля каналов несёт активации куда больше остальных. Один масштаб на весь тензор тратит весь свой диапазон на эти выбросы и размазывает всё остальное в кашу. Каждая серьёзная схема квантизации — в основе своей схема обработки выбросов: масштабы на блок, защита с учётом активаций (AWQ) или калибровка на реальных данных (imatrix).
Механика блочной квантизации
Ядро трюка: режем каждый тензор на маленькие блоки, делящие один масштаб. Деквантование веса — одно умножение:
w ≈ s · q # s: масштаб блока, q: сохранённое целое
Q4_0: блок = 32 веса → 1×fp16 масштаб + 32×4-битных целых ≈ 4.5 bpw
K-кванты: суперблок = 256 весов
1×fp16 супер-масштаб + 8×fp8 суб-масштабов + целые ≈ 4.8 bpw
bpw = бит на вес, включая накладные расходы масштаба. Эти накладные — причина, почему ничто не равно ровно 4.0: 4-битный вес — полбайта, а 2-байтовый масштаб, размазанный на 32 веса, добавляет 0.5 bpw. K-кванты амортизируют цену двухуровневым масштабированием — суперблоки на 256 весов, чьи 8 субблоков получают дешёвые fp8-масштабы, — и приземляются на ~4.8 bpw с качеством лучше, чем Q4_0 при похожем размере.
K-кванты и суффиксы _M / _S
Q4_K_M — не «Q4_K в шляпе»: суффикс это смесь. Квантизатор поднимает отдельные тензоры до более высокого кванта, пока основная масса остаётся в Q4_K: обычно проекции внимания (wv, wo) и иногда таблица эмбеддингов токенов уходят в Q6_K. Суффикс ранжирует смесь:
_S(small) — меньше всего поднятий, самый маленький файл_M(medium) — рекомендация по умолчанию, лучший баланс размер/качество_L(large) — больше тензоров в более высокой точности, убывающая отдача
Смесь существует, потому что слои деградируют неравномерно: проекции внимания и эмбеддинги чувствительнее больших полносвязных матриц. Несколько сотен лишних MB там покупают реальное качество — вот почему _M — комьюнити-дефолт, а не чистый Q4_K.
I-кванты: калиброванные, меньше, медленные на CPU
IQ-кванты (IQ4_XS, IQ3_XXS, IQ2_XS…) добавляют шаг калибровки. Сначала считается матрица важности (imatrix) прогоном модели по выборке репрезентативного текста; затем уровни квантования расставляются там, где реально живут важные веса. Выигрыш: то же качество при меньшем размере, чем эквивалентный K-квант — IQ4_XS обходит Q4_K_S при равном или лучшем качестве, а IQ2/IQ3 вообще делают возможными модели 7–8B меньше 3 GB.
Расплата — скорость декодирования. Деквантование I-кванта — не простое умножение: нужны таблицы поиска не по степеням двойки и структурная реконструкция. На CPU эта лишняя математика видна в токенах в секунду; на GPU она прячется за задержками памяти и стоит почти ничего. Правило: K-кванты для CPU-боксов, I-кванты нормальны на GPU, IQ2/IQ3 — только когда VRAM вынуждает.
Лестница качества, честно
Приблизительные размеры файлов для модели 7–8B. Масштабируется примерно линейно с параметрами — 14B примерно вдвое больше:
| Квант | Размер | bpw | Честная заметка о качестве |
|---|---|---|---|
| Q8_0 | 8.5 GB | 8.5 | прозрачно; выдерживает слепое A/B против FP16 |
| Q6_K | 6.6 GB | 6.6 | почти прозрачно; последняя остановка до паранойи |
| Q5_K_M | 5.7 GB | 5.7 | лёгкая потеря, в чате не заметить |
| Q4_K_M | 4.9 GB | 4.8 | золотая середина; падение бенчмарков на единицы процентов |
| IQ4_XS | 4.5 GB | 4.25 | ≈ качество Q4_K_S, меньше; предпочесть на GPU |
| Q3_K_M | 3.9 GB | 3.9 | заметно на фактическом вспоминании и математике |
| IQ3_XXS | 3.2 GB | 3.1 | беглый чат, шаткие факты; реалистично только GPU |
| Q2_K | 3.2 GB | 3.4 | последний ресурс — личность выживает, точность нет |
Относитесь к точным процентам как к фольклорным: потеря зависит от модели, языка и задачи. Порядок стабилен, даже когда величины нет.
Где квантизация бьёт первой
Урон неравномерен по способностям. Грубо в порядке убывания:
- Фактическое вспоминание — имена, даты, числа плывут первыми. Модель в Q3 уверенно приписывает неправильно.
- Математика и многошаговое рассуждение — маленькие ошибки накапливаются по цепочке.
- Связность длинного контекста — извлечение из глубины длинного промпта шатается сильнее, чем предполагает поведение на коротких промптах.
- Языки с меньшими ресурсами — корейский деградирует раньше английского на тяжёлых квантах; корейских токенов в обучении было меньше, поэтому меньше запаса точности. Если корейский вам важен, держитесь Q5+ где можете.
- Беглость чата и стиль — почти не проявляется. Модель в Q2 всё ещё звучит нормально, и это ловушка: беглость — плохой прокси урона.
Маленькие модели страдают сильнее
Ошибка квантизации съедает избыточность, а у маленьких моделей её меньше всего. 70B в Q4 теряет почти ничего; 3B в Q4 теряет заметно больше; ниже ~2B тяжёлые кванты могут выпотрошить модель. Практичное правило: Q6_K или Q8_0 для всего ниже ~4B параметров — абсолютные GB, сэкономленные раздавливанием маленькой модели, и так крошечные. Возьмите базу «размер против возможностей» в параметрах, прежде чем решать, куда тратить биты.
KV-кэш — отдельное решение
Квантизация весов ничего не делает с KV-кэшем — у него собственная строка памяти (fp16 по умолчанию, отдельно квантуется в q8_0/q4_0 в llama.cpp). На длинном контексте кэш может соперничать с весами; бюджетируйте его независимо в KV-кэше.
Практичная лестница решений
Разбор — карта 12 GB, плотная модель 8B, контекст 8k:
веса Q4_K_M 4.9 GB
KV-кэш 8k токенов, fp16 1.0 GB (8B GQA ≈ 128 KiB/токен)
накладные вычислительные буферы + ctx ~1.5 GB
─────────────────────────────────────────
итого ~7.4 GB → влезает с запасом
С учётом математики VRAM, лестница:
- Бюджет: VRAM − контекст − накладные = то, что остаётся на веса.
- Влезает Q6_K → гоняйте Q6_K. Влезает только Q4_K_M → гоняйте Q4_K_M без чувства вины.
- Спускайтесь к IQ4_XS/Q3 только чтобы вместить контекст или избежать оффлоада на CPU — оффлоад стоит больше скорости, чем один шаг кванта стоит качества.
- Если целевая модель не влезает в Q4, лучше шагните на класс размера вниз, чем квантуйтесь в Q2: крепкая 8B в Q4 обычно бьёт раздавленную 14B на практике.
Связанные разделы: математика VRAM · KV-кэш · параметры · форматы моделей