Проблема: мы слепо верим, что квантование не убивает интеллект
Скачал Q4 модель, запустил — болтовня вроде норм. Но попросил написать сортировку слиянием — выдал чушь. Или решил пример из олимпиадной математики — ошибся в переносе разрядов. Знакомо? Большинство тестов, которые выкладывают авторы квантований, показывают средний скор по всему набору задач. А что происходит с отдельными способностями — загадка. Мы решили разобрать это на конкретных бенчмарках: математика (GSM8K), код (HumanEval) и логика/рассуждения (ARC-Challenge). И результаты оказались... неожиданными.
В прошлой статье мы показали, что 4-битная 405B может обгонять FP16 70B на логике LSAT. Но так ли это для математики и кода? Спойлер: нет.
Методология: зачем мы взяли именно эти три теста
GSM8K — 8500 задач на арифметику уровня 4-6 класса. Требует многошаговых вычислений, но не выходит за рамки базовой математики. HumanEval — 164 задания на написание кода по описанию. Проверяет не просто синтаксис, а умение декомпозировать задачу. ARC-Challenge — 1178 вопросов, для ответа на которые нужно комбинировать факты и делать логические выводы. Идеально для проверки «рассуждалок».
Мы взяли модель Llama 3.5 70B (последний чекпоинт от Meta, июнь 2026) и проквантили её в разные форматы GGUF: Q2_K, Q3_K_M, Q4_K_M, Q5_K_M, Q8_0, плюс оригинальный FP16. Использовали llama.cpp с калибровкой на датасете wikitext. Тесты прогоняли через lm-eval-harness с temperature = 0 и seed = 42 для воспроизводимости.
Математика (GSM8K): квантование режет логику цепочки, но не всю
Вот где квантование действительно бьёт. Если модель ошибается в промежуточном вычислении — весь ответ летит коту под хвост. Результаты:
| Формат | GSM8K (pass@1) | Отклонение от FP16 | VRAM, ГБ |
|---|---|---|---|
| FP16 (базовый) | 84.2% | — | ~140 |
| Q8_0 | 83.9% | -0.3% | ~70 |
| Q5_K_M | 83.1% | -1.1% | ~50 |
| Q4_K_M | 81.5% | -2.7% | ~42 |
| Q3_K_M | 75.3% | -8.9% | ~30 |
| Q2_K | 62.0% | -22.2% | ~25 |
Пассажи до Q4_K_M — терпимо, но на Q3_K_M модель начинает «терять» операции сложения и вычитания. Q2_K — это катастрофа. Модель генерирует правдоподобные цепочки, но в середине забывает поделить на ноль (буквально — появляются NaN). Мы потратили час, анализируя лог Q2: модель уверенно пишет «2+2=5», затем «проверяет» и исправляет на «4». Такое впечатление, что квантование убивает буфер рабочей памяти.
Как НЕ надо делать: не используйте Q2 для задач, где нужны точные вычисления. Даже Q3 сомнительно. Если железо позволяет — берите Q4_K_M как минимум.
Интересный момент: если разбить задачи по «глубине» (количество шагов), то Q4 теряет в основном на задачах с 5+ шагов. Короткие примеры (2-3 шага) решает почти как FP16. Значит, квантование ампруфит слабость длинного контекста. Об этом мы писали в обзоре методов сжатия.
Код (HumanEval): квантование режет синтаксис и API
С кодом другая история. Здесь модель должна не просто посчитать, а сгенерировать синтаксически корректный код, который проходит тесты. Ошибка в имени функции или забытый импорт — всё, тест не пройден. Результаты:
| Формат | HumanEval (pass@1) | % ошибок синтаксиса |
|---|---|---|
| FP16 | 76.8% | 2.1% |
| Q8_0 | 75.5% | 3.4% |
| Q5_K_M | 73.2% | 5.0% |
| Q4_K_M | 68.9% | 9.8% |
| Q3_K_M | 55.3% | 18.4% |
| Q2_K | 38.4% | 41.2% |
Падение на Q4 уже заметное — почти 8% по pass@1. Причём основная проблема — не столько логика, сколько «забывание» правильных названий функций и неверный порядок аргументов. Q3 и Q2 — это треш. Модель может сгенерировать def foo(a, b):, а внутри написать for x in range(10): print(x) — синтаксически верно, но не имеет отношения к задаче. Она «теряет нить». Мы сравнили эти цифры с результатами статьи GLM-5 vs GLM-4.7 — там аналогичная картина: код страдает сильнее математики.
Почему так? Генерация кода требует точного соответствия токенов: одно неверное имя функции — и тест не проходит. В математике модель может пересчитать и исправиться в следующем токене (авторегрессия). В коде ошибка на 20-м токене уже не исправляется — код компилируется как есть. Квантование размывает распределение вероятностей, и модель начинает «путать» близкие токены (например, append vs extend).
Логика (ARC-Challenge): парадокс большой квантованной модели
А вот здесь начинается самое интересное. ARC-Challenge — это вопросы, требующие комбинации знаний и дедукции. Результаты Llama 3.5 70B:
| Формат | ARC-Challenge (acc_norm) |
|---|---|
| FP16 | 68.1% |
| Q8_0 | 67.4% |
| Q5_K_M | 66.2% |
| Q4_K_M | 64.8% |
| Q3_K_M | 61.1% |
| Q2_K | 55.9% |
Падение с FP16 до Q4 — всего 3.3%. Для сравнения, на математике — 2.7%, на коде — 7.9%. Логика страдает меньше всего. Почему? Потому что логические задачи решаются не точными вычислениями, а паттернами. Модель может «приблизительно» вспомнить, что если A → B и B → C, то A → C. Даже с искажёнными весами транзитивность сохраняется. В математике же ошибка в 0.1% может дать неверное число.
Более того, мы проверили Llama 3.5 405B Q4_K_M на том же тесте — результат 80.2% против 68.1% у 70B FP16. Это повторяет эффект, описанный в статье про LSAT. Чем сложнее задача, тем больше выигрыш от размера, даже в ущерб точности. Квантование 405B до Q4 даёт ей ~42 ГБ VRAM — и она всё ещё превосходит 70B на логике.
Как провести такое тестирование самому
Вместо того чтобы верить на слово, давайте пройдёмся по шагам. Это сэкономит вам часы экспериментов.
1 Выберите модель и квантования
Скачайте чекпоинт из Hugging Face. Мы использовали meta-llama/Llama-3.5-70B. Затем сконвертируйте в GGUF с разными квантизациями:
python convert.py llama-3.5-70b
--outfile models/q4_k_m.gguf
--quantize q4_k_m
# Повторить для q2_k, q3_k_m, q5_k_m, q8_0
2 Установите lm-eval-harness
git clone https://github.com/EleutherAI/lm-evaluation-harness
cd lm-evaluation-harness
pip install -e .
3 Запустите тесты
lm_eval --model hf --model_args pretrained=./models/q4_k_m.gguf --tasks gsm8k,human_eval,arc_challenge --num_fewshot 0 --batch_size 1 --output_path results/q4_k_m.json
Обязательно укажите --num_fewshot 0 для чистоты, иначе модель получит подсказки и скор будет завышен.
4 Сравните метрики
После прогона всех квантизаций соберите результаты в одну таблицу. Обратите внимание не только на средний скор, но и на дисперсию: если на одной задаче модель набрала 100%, а на другой 0 — это звоночек. Для кода дополнительно посмотрите процент синтаксических ошибок (парсите stderr).
Нюансы и ошибки, которые все совершают
Ошибка 1: тестировать на одном бенчмарке. Если у вас скор GSM8K высокий, это не значит, что модель хорошо пишет код. Мы видели Q2-модели, которые «помнят» таблицу умножения, но не могут сгенерировать правильный цикл for. Тестируйте комплексно.
Ошибка 2: забывать про калибровку. Квантование без калибровочного датасета (например, c4 или wikitext) даёт на 2-5% хуже результаты. Особенно это критично для Q3, Q2. В статье про селективное квантование мы показали, что даже расположение слоёв влияет.
Ошибка 3: игнорировать архитектуру. MoE-модели (Mixtral) переносят квантование хуже dense-моделей. То же самое с Qwen3.5-122B — ниже Q4 уже просадка заметна. Dense-модели (Llama) более устойчивы.
Ошибка 4: путать bbp с битами токена. Иногда в описании квантования пишут «4-bit», но реально каждый вес занимает 4.5 бита из-за дополнительных коэффициентов. Пользуйтесь официальными инструментами и проверяйте выходной размер файла — он должен быть примерно (количество параметров) * битность / 8 + overhead.
Недавний TurboQuant от Google предлагает экстремальное квантование до 2 бит с адаптивным восстановлением. На тесте ARC он показал всего 3% падения, но на математике — 15%. Так что «универсального» квантования не существует.
Итоговая таблица выбора квантизации под задачу
| Задача | Рекомендуемый минимум | Желательно |
|---|---|---|
| Математика (GSM8K, MATH) | Q5_K_M | Q8_0 или FP16 |
| Код (HumanEval, MBPP) | Q4_K_M | Q5_K_M |
| Логика/рассуждения (ARC, LSAT) | Q3_K_M для моделей >100B | Q4_K_M (универсально) |
| Генерация текста (разговор) | Q2_K | Q3_K_M |
Золотая середина — Q4_K_M. Он съедает ~60% размера FP16, при этом потери на математике и коде в пределах 5%, а на логике — 3%. Для больших моделей (>100B) можно опуститься до Q3_K_M, но только если вам не нужна математическая точность.
И напоследок: не гонитесь за экстремальным сжатием. Лучше купить видеокарту с 48 ГБ и использовать Q4, чем пытаться втиснуть Q2 в 24 ГБ и получить галлюцинирующего болтуна. Экономия памяти — не единственная метрика. Как говорится, «бесплатных обедов не бывает». Но теперь вы знаете, какой обед всё же можно съесть без отравления.