localaiforum
Войти
Руководство › Модели и форматы

Квантизация в деталях

Квантизация сжимает веса из 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 последний ресурс — личность выживает, точность нет

Относитесь к точным процентам как к фольклорным: потеря зависит от модели, языка и задачи. Порядок стабилен, даже когда величины нет.

Где квантизация бьёт первой

Урон неравномерен по способностям. Грубо в порядке убывания:

  1. Фактическое вспоминание — имена, даты, числа плывут первыми. Модель в Q3 уверенно приписывает неправильно.
  2. Математика и многошаговое рассуждение — маленькие ошибки накапливаются по цепочке.
  3. Связность длинного контекста — извлечение из глубины длинного промпта шатается сильнее, чем предполагает поведение на коротких промптах.
  4. Языки с меньшими ресурсами — корейский деградирует раньше английского на тяжёлых квантах; корейских токенов в обучении было меньше, поэтому меньше запаса точности. Если корейский вам важен, держитесь Q5+ где можете.
  5. Беглость чата и стиль — почти не проявляется. Модель в 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, лестница:

  1. Бюджет: VRAM − контекст − накладные = то, что остаётся на веса.
  2. Влезает Q6_K → гоняйте Q6_K. Влезает только Q4_K_M → гоняйте Q4_K_M без чувства вины.
  3. Спускайтесь к IQ4_XS/Q3 только чтобы вместить контекст или избежать оффлоада на CPU — оффлоад стоит больше скорости, чем один шаг кванта стоит качества.
  4. Если целевая модель не влезает в Q4, лучше шагните на класс размера вниз, чем квантуйтесь в Q2: крепкая 8B в Q4 обычно бьёт раздавленную 14B на практике.

Связанные разделы: математика VRAM · KV-кэш · параметры · форматы моделей