Что значит Q4_K_M: как устроено квантование k-quants в llama.cpp

· 2 мин · BadRabbit

Все модели в Еве я загружаю в формате Q4_K_M. Это загадочное имя встречается на каждой странице GGUF-модели на Hugging Face, и сегодня я наконец разберусь, что оно значит. Источник — пулл-реквест Ивана Каврукова в llama.cpp, который ввёл k-quants.

Зачем квантовать

Модель на 7 миллиардов параметров в 16-битных float весит около 14 ГБ, а моя видеокарта — 8 ГБ. Квантование хранит каждый вес меньшим числом бит: 4 бита вместо 16 дают модель примерно в 3,5–4 раза меньше.

Наивный подход — найти минимум и максимум весов и разбить диапазон на 16 уровней — плохо работает. Один выброс растягивает диапазон, и все остальные веса превращаются в кашу.

Блоки и суперблоки

Решение k-quants — квантовать маленькими блоками, у каждого свой масштаб. А чтобы масштабы тоже не занимали много места, блоки объединены в суперблоки по 256 весов, и масштабы блоков квантуются ещё раз относительно масштаба суперблока. Масштаб внутри масштаба.

Поэтому реальное число бит на вес получается не круглым:

ТипБит на вес
Q2_K2,5625
Q3_K3,4375
Q4_K4,5
Q5_K5,5
Q6_K6,5625

Лишние полбита — это и есть масштабы.

Что такое _S, _M, _L

Буквы в конце — это смеси. Не все тензоры модели одинаково важны: некоторые веса внимания и feed-forward сильнее влияют на качество. Поэтому в «смешанных» вариантах важные тензоры квантуются точнее, а остальные грубее. Q4_K_M — это «в основном 4 бита, но часть важных тензоров в 6 битах». S — экономнее, L — точнее.

Результаты

На моделях 7B и 13B лучшие k-quants держат перплексию в пределах долей процента от исходной модели в float16. При этом модель в 4–5 бит помещается в карту, куда исходная не влезла бы никогда. Код пулл-реквеста сразу вышел с реализациями для обычного CPU, AVX2, ARM NEON и CUDA.

Мой комментарий

Q4_K_M — тот самый компромисс для 8 ГБ: Aya-8B в нём занимает около 4,5 ГБ, и рядом ещё остаётся место для маленькой Gemma-1B и KV-кеша. Опускаться до Q2_K для 8B-модели я не хочу: на двух битах сильнее всего страдают как раз «длинные хвосты» вроде не-английских языков, а Ева говорит по-русски. А вот Q5_K_M для маленьких моделей иногда оправдан: разница в памяти копеечная, а качество чуть выше.

Завтра разберу вторую половину проблемы памяти, KV-кеш, которая с квантованием весов никак не связана.