Что значит Q4_K_M: как устроено квантование k-quants в llama.cpp
Все модели в Еве я загружаю в формате 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_K | 2,5625 |
| Q3_K | 3,4375 |
| Q4_K | 4,5 |
| Q5_K | 5,5 |
| Q6_K | 6,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-кеш, которая с квантованием весов никак не связана.