MAATRIX / Блог / Какое квантование выбрать для Qwen 2.5

Какое квантование выбрать для Qwen 2.5

Какое квантование выбрать для Qwen 2.5

MAATRIX

У qwen2.5:14b в библиотеке Ollama больше двадцати вариантов одного и того же файла — от q2_K на 5,8 ГБ до fp16 на 29,5 ГБ. Разница не только в занятом месте: на одних уровнях модель отвечает как оригинал, на других начинает путаться в числах и выдавать сломанный JSON. Ниже — что означают буквы в имени, сколько теряется на каждом шаге по замерам, как квантование влияет на скорость и какой файл брать под чат, код и вызовы функций.

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Как читается имя кванта: Q4_K_M и все остальные

Формат имени — Q<биты>_<семейство>_<вариант>. Семейств три, и они не взаимозаменяемы.

Legacy (Q4_0, Q4_1, Q5_0, Q5_1, Q8_0) — старая схема: блок из 32 весов, один общий множитель. По качеству на бит проигрывает; смысл сохранил только Q8_0, на восьми битах терять уже нечего.

K-кванты (Q2_K, Q3_K_S/M/L, Q4_K_S/M, Q5_K_S/M, Q6_K) — дефолт последних лет: суперблоки по 256 весов, множители сами квантуются, ошибка на тех же четырёх битах заметно меньше. Суффикс — не про биты, а про то, сколько тензоров подняли на уровень выше: _S жмёт всё подряд, _M оставляет часть слоёв в Q6_K, _L добавляет к ним выходную матрицу.

I-кванты (IQ2_XS, IQ3_M, IQ4_XS, IQ4_NL) — кодовые книги плюс матрица важности (imatrix), собранная прогоном калибровочного текста. Качество на бит выше, но распаковка дороже, и на процессоре это стоит скорости. В библиотеке Ollama для qwen2.5 их нет, только на Hugging Face.

Что скачано сейчас, показывает ollama show:

ollama show qwen2.5:14b
  Model
    architecture        qwen2
    parameters          14.8B
    quantization        Q4_K_M

Короткий тег без суффикса всегда даёт Q4_K_M — и qwen2.5, и qwen2.5:32b, и qwen2.5-coder:7b. Дефолт разумный, но именно из-за него половина людей ничего другого не пробовала.

Сколько весит каждый уровень: таблица по размерам Qwen 2.5

Размеры GGUF для Instruct-версий. Последняя колонка — эффективные биты на вес для 14B, размер × 8 / 14,8 млрд: видно, что «Q4» на деле почти пять бит.

Квант7B14B32B72Bбит/вес (14B)
Q2_K3,02 ГБ5,77 ГБ12,3 ГБ29,8 ГБ3,12
Q3_K_M3,81 ГБ7,34 ГБ15,9 ГБ37,7 ГБ3,97
IQ4_XS4,22 ГБ8,12 ГБ17,7 ГБ39,7 ГБ4,39
Q4_K_S4,46 ГБ8,57 ГБ18,8 ГБ43,9 ГБ4,63
Q4_K_M4,68 ГБ8,99 ГБ19,9 ГБ47,4 ГБ4,86
Q5_K_M5,44 ГБ10,5 ГБ23,3 ГБ54,4 ГБ5,68
Q6_K6,25 ГБ12,1 ГБ26,9 ГБ64,3 ГБ6,55
Q8_08,10 ГБ15,7 ГБ34,8 ГБ77,3 ГБ8,49
fp1615,2 ГБ29,5 ГБ65,5 ГБ145 ГБ15,96

Два следствия. Первое: шаг между соседними уровнями — 10–15 %, а не «вдвое». Между Q4_K_S и Q4_K_M у 14B разница 420 МБ, экономить на ней бессмысленно. Второе: у 72B даже Q2_K — это 29,8 ГБ, то есть машина под 32 ГБ. Ни один квант не превращает 72B в модель для дешёвого VPS. Полный расчёт памяти с KV-кэшем — в разборе сколько RAM нужно для Qwen 2.5; здесь только сам файл весов.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Ollama

Сколько качества теряется: перплексия и KL-дивергенция

Спорить про «на глаз лучше» бессмысленно, когда есть измеримые числа. Прогоняем один и тот же текст через оригинал и через квант:

./llama-perplexity -m Qwen2.5-7B-f16.gguf     -f wiki.test.raw --chunks 200 \
  --kl-divergence-base f16-logits.dat
./llama-perplexity -m Qwen2.5-7B-Q4_K_M.gguf  -f wiki.test.raw --chunks 200 \
  --kl-divergence-base f16-logits.dat --kl-divergence

Первая команда сохраняет логиты эталона, вторая сравнивает с ними квант. Перплексия показывает, насколько модель хуже предсказывает текст; KL-дивергенция честнее — она ловит случаи, когда средняя метрика в порядке, а отдельные токены уехали. Результат по 200 чанкам:

КвантРост перплексииМедианная KLВердикт
Q8_0+0,05 %0,0008эталон
Q6_K+0,15 %0,003не отличить вслепую
Q5_K_M+0,4 %0,008не отличить вслепую
Q4_K_M+1,3 %0,025рабочий баланс
IQ4_XS+1,7 %0,031на 10 % меньше Q4_K_M
Q4_K_S+2,1 %0,038ощутимо на коде
Q3_K_M+5,5 %0,10ломается арифметика
Q2_K+19 %0,42на 7B не брать

Проценты не универсальны — они зависят от размера модели. У qwen2.5:32b тот же Q3_K_M даёт около +2 %, а Q2_K — примерно +6 % вместо девятнадцати: чем больше параметров, тем больше избыточности и тем спокойнее модель переживает грубое округление. Обратная сторона — на qwen2.5:1.5b и :3b заметен уже Q4_K_M.

И оговорка про метод: wikitext — английский текст общего содержания, по нему квантование выглядит безобиднее, чем оно есть для русского, кода и структурированного вывода. Русский токенизируется длиннее и живёт на менее натоптанных путях, деградация приходит на полшага раньше. Работаете на русском — «рабочий баланс» в таблице для вас уже нижняя граница.

Почему Q4_K_M — это не «четыре бита»: разбор по тензорам

4,86 бита в таблице выше — не ошибка округления. llama.cpp квантует разные тензоры по-разному: основная масса идёт в Q4_K, но выходная матрица output.weight поднимается до Q6_K, туда же уезжает часть тензоров attn_v и ffn_down в начале и конце сети. Именно это отличает _M от _S, и это видно в логе конвертации:

[   1/ 579] token_embd.weight - [ 3584, 152064,  1,  1], type = f16,
            converting to q4_K .. size =  1039.50 MiB ->  292.36 MiB
[ 579/ 579]   output.weight   - [ 3584, 152064,  1,  1], type = f16,
            converting to q6_K .. size =  1039.50 MiB ->  426.38 MiB

Здесь и вылезает специфика Qwen 2.5. Словарь огромный — 151 936 токенов, а у 7B и старше матрица дополнена до 152 064 строк ради делимости при тензорном параллелизме. Для 7B это 3584 × 152064 ≈ 545 млн параметров во входной матрице и столько же в выходной: 1,09 млрд из 7,62 млрд, то есть 14 % модели — это словарь, и в Q4_K_M на два этих тензора уходит 719 МиБ из 4,68 ГБ.

Отсюда три следствия, которых нет у моделей со словарём на 32–50 тысяч токенов:

  • Агрессивное сжатие экономит меньше, чем ждёте. Переход Q4_K_M → Q3_K_M у 7B срезает всего 870 МБ: выходная матрица как была Q6_K, так и осталась.
  • У 0.5B, 1.5B и 3B эмбеддинги привязаны и занимают до четверти параметров. Жать их ниже Q6_K — менять качество на сотни мегабайт: между qwen2.5:1.5b-instruct-q4_K_M и -q8_0 всего 650 МБ.
  • Сторонние сборки с суффиксом _L (Q4_K_L, Q5_K_L) держат token_embd и output в Q8_0: для Qwen это почти гигабайт сверху на 14B, а выигрыш виден на редкой лексике и на русском.

Скорость: квантование ускоряет генерацию, но не всегда

Генерация на процессоре упирается в пропускную способность памяти: на каждый токен читаются все веса, то есть токенов/с ≈ полоса памяти ÷ размер файла. А обработка промпта считается батчем и упирается в арифметику, поэтому от кванта почти не зависит. Замер на 8 vCPU AMD EPYC, DDR4-3200 (~38 ГБ/с по mbw -n 5 1024), Ubuntu 24.04, контекст 8192, ollama run qwen2.5:7b --verbose:

КвантФайлГенерацияОбработка промпта
q8_08,10 ГБ4,1 tok/s44 tok/s
q6_K6,25 ГБ5,3 tok/s41 tok/s
q5_K_M5,44 ГБ6,1 tok/s40 tok/s
q4_K_M4,68 ГБ7,4 tok/s39 tok/s
IQ4_XS4,22 ГБ5,9 tok/s26 tok/s
q3_K_M3,81 ГБ8,6 tok/s37 tok/s

Две строки ломают ожидания. IQ4_XS меньше Q4_K_M на 10 %, но генерирует на 20 % медленнее, а промпт жуёт в полтора раза дольше — распаковка через кодовые книги на процессоре съедает весь выигрыш от размера. Отсюда правило: IQ-кванты нужны на видеокарте, где важно влезть в VRAM, и почти бесполезны на CPU. Вторая строка — q8_0: вдвое медленнее q4_K_M при разнице в 1,3 % перплексии. Скачавший Q8_0 «чтобы получше» меняет полтора процента метрики на удвоение времени ответа.

Отдельный случай — процессоры ARM (Ampere, Graviton): llama.cpp на лету перепаковывает Q4_0 под инструкции i8mm и sdot, и там q4_0 жуёт промпт в 2–3 раза быстрее K-квантов при том же размере. На x86 с AVX2 выигрыша нет, и q4_0 просто хуже q4_K_M. Прочие причины низкой скорости — в разборе Ollama медленно генерирует токены.

Какой квант под какую задачу и как его скачать

Сначала по бюджету памяти: на фиксированном объёме всегда стоит вопрос «модель побольше пожатее или поменьше поточнее».

ПамятьКандидатыЧто брать
8 ГБ7b-q4_K_M (4,7) vs 3b-q8_0 (3,3)7B в Q4_K_M
16 ГБ14b-q4_K_M (9,0) vs 7b-q8_0 (8,1)14B в Q4_K_M для текста, 7B в Q6_K для кода
32 ГБ32b-q4_K_S (18,8) vs 14b-q6_K (12,1)32B в Q4_K_S при контексте ≤ 8k
64 ГБ32b-q6_K (26,9) vs 72b-q4_K_M (47,4)32B в Q6_K: у 72B на CPU 0,6 tok/s

Общее правило: следующий размер в Q4_K_M почти всегда лучше предыдущего в Q8_0 — но только пока вы не опускаетесь ниже Q4_K_M. На Q3 и Q2 оно переворачивается: qwen2.5:7b-q4_K_M осмысленнее, чем qwen2.5:14b-q3_K_S.

Дальше — поправки по типу задачи:

  • Чат и суммаризация на русском — Q4_K_M рабочий минимум, Q5_K_M ровнее в согласованиях и терминах.
  • Qwen2.5-Coder — не ниже Q5_K_M: пропущенная скобка ломает файл целиком, тогда как проза ошибку в одном токене переживает. Мелкие Coder-модели для автодополнения в IDE (qwen2.5-coder:1.5b, :3b) берите сразу в Q8_0 — они и так быстрые, а FIM-разметка с токенами <|fim_prefix|>, <|fim_suffix|>, <|fim_middle|> страдает от сжатия первой.
  • Вызовы функций и строгий JSON — Q5_K_M. Шаблон tool-calls требует ровных тегов <tool_call> и валидного JSON внутри; на Q3 модель теряет закрывающий тег и путает типы полей, и парсер падает вместо ответа.
  • Классификация, роутинг, извлечение полей — тут можно идти вниз смело: короткий выход и жёсткий набор вариантов переживают даже Q3_K_M на 14B.

Качается уровень полным тегом, и регистр в нём имеет значение — Ollama имена не нормализует:

$ ollama pull qwen2.5:14b-instruct-q4_k_m
Error: pull model manifest: file does not exist

Правильно q5_K_M: q и цифры строчные, буквы семейства и варианта заглавные. I-квантов и _L-сборок в библиотеке Ollama нет, за ними идут на Hugging Face: ollama run hf.co/bartowski/Qwen2.5-14B-Instruct-GGUF:IQ4_XS. Переквантовать скачанный файл не выйдет — Ollama сжимает только из fp16/fp32 и отвечает Error: quantization is only supported for F16 and F32 models, так что «скачал Q8_0, сожму сам» требует сперва выкачать 29,5 ГБ fp16.

На видеокарте формат другой: у Qwen есть официальные сборки -AWQ и -GPTQ-Int4/Int8 под vLLM, GGUF там не нужен. Известная грабля — Qwen2.5-72B-Instruct-GPTQ-Int4 не стартует с --tensor-parallel-size 8: размер 29568 не делится на 8 групп по 128, и vLLM падает с ValueError: The input size is not aligned with the quantized weight shape. Ставьте 4 или 2. Про железо — в выборе GPU-сервера под инференс LLM.

Какой сервер под выбранный квант взять в MAATRIX

Выбор кванта и выбор тарифа — одна задача с двух сторон. Есть сервер — квант берётся из таблицы выше. Есть требование к качеству — считаем обратно: файл нужного уровня плюс 10 % на буферы, плюс KV-кэш под контекст, плюс 1,5 ГБ системе.

Минимум — 4 vCPU / 8 ГБ RAM / 80 ГБ NVMe. Это qwen2.5:7b-instruct-q4_K_M, контекст 8k, около 7 токенов в секунду. Честное ограничение: подняться до Q5_K_M здесь уже нельзя — 5,44 ГБ весов плюс кэш плюс система упрутся в потолок, и первый длинный диалог закончится убитым по OOM процессом. Восемь гигабайт — ровно один квант, без права на эксперимент.

Комфортный вариант — 8 vCPU / 16 ГБ RAM / 160 ГБ NVMe. Здесь появляется собственно выбор: 14b-q4_K_M для связного русского текста, 7b-q6_K для кода и вызовов функций, 7b-q5_K_M с контекстом 32k под RAG. Два-три кванта лежат рядом, и сравнивать можно на своих задачах, а не на чужих таблицах. Про диск не забудьте: 7B в пяти квантах — это 27 ГБ в /usr/share/ollama/.ollama/models, а под 32B в Q6_K с парой запасных вариантов разумный минимум — 320 ГБ.

Локация — Лондон (UK). Сетевая задержка локальной модели безразлична: веса лежат у вас, наружу ничего не ходит. Важно, откуда вы качаете. Hugging Face из России отвечает нестабильно, и попытка вытащить IQ-квант или _L-сборку регулярно заканчивается так:

Error: pull model manifest: Get "https://huggingface.co/v2/bartowski/...":
dial tcp: i/o timeout

С европейской площадки этого нет, а 9-гигабайтный файл по гигабитному каналу приезжает за полторы минуты. Лондон даёт заодно 15–30 мс до пользователей в ЕС и европейскую юрисдикцию, если через модель проходят клиентские данные. Российская площадка нужна в одном случае — персональные данные россиян и 152-ФЗ.

Ollama из каталога apps.maatrix.io ставится автоматически при заказе — вставлять команды не нужно, автоустановка работает на Ubuntu и Debian. Доступы появляются в личном кабинете, в разделе «Доступ»; дальше остаётся один ollama pull с нужным тегом. Оплата — картами российских банков, по СБП, криптовалютой или токеном MAAT. Не уверены в уровне — напишите задачу, язык и контекст: подберём связку «размер + квант + тариф» без переплаты. Установка по шагам — в статье как запустить Qwen 2.5 на VPS.

Развернуть за пару минут

Готовый образ на VPS MAATRIX: NVMe, AMD EPYC, root-доступ. Локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Развернуть Ollama

Обсудить статью, задать вопрос или начать новую тему

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Частые вопросы

Что взять на 16 ГБ: 14B в Q4_K_M или 7B в Q8_0?

Для текста, рассуждений и русского — 14B в Q4_K_M: разница в размере модели перевешивает 1,3 % потерь от квантования. Для кода, строгого JSON и вызовов функций — 7B в Q6_K: вдвое быстрее и надёжнее в форматировании.

Стоит ли брать IQ4_XS вместо Q4_K_M ради экономии памяти?

На процессорном сервере нет: файл меньше на 10 %, но генерация медленнее на 20 %, а обработка промпта — в полтора раза. На видеокарте, где вопрос «влезет в VRAM или нет», IQ-кванты оправданы.

Насколько ниже Q4_K_M можно опускаться?

На 32B и 72B Q3_K_M ещё годен для несложных задач, на 7B он уже ломает арифметику и длинные инструкции, на 1.5B и 3B неприемлем даже Q4. Не влезает в Q4_K_M — берите размер ниже в Q4_K_M, а не тот же размер в Q3.

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.