На прошлой неделе NVIDIA выложила отчёт про QAD и я его проигнорировал. Потому что каждый месяц кто-то "решает квантизацию" и каждый раз на практике всё не так радужно.
Но потом коллега скинул табличку с AIME и я залип.
Контекст такой. У нас на проде крутится модель на FP8, всё более-менее ок, но менеджмент хочет запихнуть 49B модель туда, где сейчас живёт 20B. Потому что "ну там же Blackwell, там же FP4, давайте". Я месяц назад попробовал наивно квантизовать в 4 бита — модель начала нести пургу на математике. Не сильно, но заметно. Закрыл тему, сказал что FP4 не готов.
И тут этот отчёт.
NVFP4 — это 4-битный формат NVIDIA. E2M1 если кому интересно (2 бита экспонента, 1 бит мантисса, знак). На Blackwell обещают 2-3x throughput по сравнению с FP8. Звучит красиво.
Проблема: при 4 битах модели начинают тупить. Особенно на задачах где нужна точность — математика, код, логические цепочки. Чем меньше модель, тем хуже.
Стандартное решение — QAT, quantization-aware training. Берёшь квантизованную модель, дообучаешь, профит. Работает со времён мобильных свёрточек, должно работать и тут.
Не работает.
Вот цифры которые меня зацепили (Nemotron 3 Nano на AIME25):
BF16: 89.1
Просто квантизовали (PTQ): 85.0
QAT: 83.3
QAD: 87.9
QAT хуже чем ничего не делать. Это как?
Я сначала думал что они накосячили с гиперпараметрами. Или данные не те. Но нет, там есть объяснение и оно имеет смысл.
Современные LLM готовят сложно. Pretrain, потом SFT, потом RL (GRPO, RLHF, что угодно). Каждый этап меняет модель. RL особенно — он учит модель думать определённым образом, выстраивать цепочки рассуждений.
Когда ты делаешь QAT, ты берёшь какие-то данные и минимизируешь cross-entropy. Это по сути ещё один раунд SFT. И он переписывает то, чему модель научилась на RL.
У меня не было такой интуиции раньше. Я думал — ну данные те же, лосс тот же, всё должно восстановиться. Но нет. Cross-entropy это про "правильные токены", а не про "как именно модель приходит к ответу".
Идея тупая до безобразия: вместо того чтобы учить квантизованную модель правильным ответам, учим её копировать поведение оригинала.
Берём BF16 модель (учитель), квантизованную модель (ученик), прогоняем один и тот же текст через обе. Минимизируем KL-дивергенцию между распределениями.
L = KL(p_teacher || p_student)
Не рокет саенс. Дистилляция известна сто лет. Но почему-то для квантизации LLM это не было стандартом.
Самое интересное — табличка из статьи, которая всё объясняет:
|
Метод |
KL vs BF16 |
Cross-Entropy |
|---|---|---|
|
BF16 |
0 |
0.408 |
|
QAT |
0.311 |
0.408 |
|
QAD |
0.004 |
0.416 |
Смотри: QAT достигает того же cross-entropy что и оригинал. По этой метрике идеально. Но KL-дивергенция 0.311 — распределение выходов совсем другое.
QAD наоборот: cross-entropy чуть хуже, зато модель ведёт себя практически идентично оригиналу.
Llama Nemotron Super 49B (после SFT):
|
MATH500 |
AIME25 |
GPQA-D | |
|---|---|---|---|
|
BF16 |
95.8 |
46.0 |
66.5 |
|
PTQ |
91.4 |
32.3 |
62.1 |
|
QAT |
94.3 |
41.5 |
63.3 |
|
QAD |
94.6 |
45.6 |
64.5 |
На AIME25 разница между QAT и QAD — 4 пункта. Это много, там каждая задача на вес золота.
AceReason 7B (после RL — вот тут самое мясо):
|
AIME24 |
AIME25 |
LiveCodeBench | |
|---|---|---|---|
|
BF16 |
73.0 |
63.5 |
54.3 |
|
PTQ |
69.4 |
58.7 |
52.0 |
|
QAT |
62.1 |
46.1 |
45.9 |
|
QAD |
71.7 |
62.0 |
53.3 |
QAT уронил модель на 17 пунктов. Семнадцать. Это катастрофа. QAD почти восстановил до оригинала.
Дальше в статье есть эксперимент, от которого у меня немного поехала крыша.
AceReason обучена на математике и коде. Логично делать QAD на математике и коде. А что если взять только код?
|
Данные для QAD |
AIME24 |
AIME25 |
LiveCodeBench |
|---|---|---|---|
|
Math + Code |
71.7 |
62.0 |
53.3 |
|
Только math |
71.0 |
61.7 |
53.1 |
|
Только code |
71.0 |
62.0 |
53.3 |
QAD на данных только по коду восстанавливает математику почти так же хорошо, как QAD на полных данных.
Ладно, может код и математика как-то связаны. Дальше хуже:
|
Данные |
AIME25 |
|---|---|
|
Нормальные данные |
62.0 |
|
Модель сама сгенерировала |
61.3 |
|
Только правильные ответы |
61.6 |
|
Генерация от BOS токена |
60.9 |
|
Рандомные токены |
60.0 |
На рандомных токенах. РАНДОМНЫХ. И модель не развалилась.
Для сравнения — PTQ без всего даёт 58.7. То есть QAD на мусоре лучше чем ничего.
Я пока не понимаю почему это работает. Есть гипотеза что KL-лосс как-то иначе гонит градиенты, но надо думать.
Из статьи, плюс мои догадки:
Learning rate. Для моделей после SFT — низкий, 1e-6 или меньше. Для моделей после RL — выше, 1e-5. Контринтуитивно, но видимо RL-модели более устойчивы к изменениям.
Данные. Llama Nemotron 49B обучали на ~0.3B токенов. Это смешно мало по сравнению с оригинальным post-training. AceReason 7B — ~0.8B токенов.
Температура. T=1 для обоих. Не выпендривайтесь.
Что квантизовать. Все линейные слои в attention и MLP. Если у вас гибрид с Mamba — attention лучше оставить в BF16, SSM слои плохо переносят квантизацию.
Учитель побольше. Не работает. Пробовали 12B учителя для 9B ученика — хуже чем просто 9B на себя.
Честно — настроен скептически к 4 битам для серьёзных задач. Слишком много раз видел как квантизация убивает тонкие способности модели. Отладил, работает, квантизовал, сломалось, откатил.
Но эти результаты выглядят правдоподобно. Не "мы решили квантизацию", а "мы нашли способ не ломать RL при квантизации". Это конкретная проблема с конкретным решением.
Что меня напрягает:
Все эксперименты на моделях NVIDIA. Хочу увидеть это на Llama/Qwen/Mistral.
NVFP4 специфичен для их железа. На десктопе это не запустишь.
Бенчмарки — это бенчмарки. На реальных задачах может быть иначе.
Но идея с KL вместо CE — это я точно попробую. Даже если не FP4, для FP8 тоже должно помочь.
Чекпоинты для нескольких моделей, код для Megatron-LM и HuggingFace. Ссылки в оригинальном отчёте, не буду копипастить.
Жду когда кто-то портирует на llama.cpp. Вот тогда будет понятно, насколько это реально работает вне экосистемы NVIDIA.
Если кто-то уже пробовал — напишите. Интересно сравнить результаты.
https://t.me/tokensaway — иногда пишу про такое, иногда о том, как LLM думают, или просто притворяются.
Источник

