Что такое AWQ
Activation-aware Weight Quantization (AWQ) — метод 4-битной квантизации весов, который учитывает распределение активаций при квантизации. Идея: не все веса одинаково важны, и важность определяется не величиной веса, а тем, какие активации он обрабатывает.
Проблема наивной квантизации
Наивная квантизация (round-to-nearest до 4 бит) обращается со всеми весами одинаково. Но в реальных сетях есть критические каналы — нейроны, чьи активации имеют большой динамический диапазон или высокую дисперсию. Для них 4 бита — слишком грубо: ошибка квантизации на этих каналах непропорционально влияет на выход модели.
Остальные ~95% весов спокойно живут в 4 битах. Проблема — именно в этих ~5% «чувствительных».
Как AWQ это решает
AWQ находит критические каналы и защищает их, не повышая битность всей модели (что разорвало бы 4x экономию):
- Анализ активаций: на калибровочном наборе (обычно ~128–512 реальных промптов) AWQ замеряет распределение активаций на входах каждого слоя.
- Выделение критических каналов: каналы с большими/редкими активациями помечаются как чувствительные к квантизации.
- Адаптивное масштабирование: вместо повышения битности AWQ применяет per-channel scale — критические каналы умножаются на защитный коэффициент перед квантизацией, а компенсирующее деление встраивается в следующие слои. Итог: все веса остаются INT4, но чувствительные каналы квантуются в «безопасной» области.
Результат: INT4 для всех весов при потере качества обычно < 1 BLEU point (и часто незаметной на реальных задачах) против наивного INT4.
Преимущества
- 4x экономия памяти: INT4 против FP16 (2 бита на параметр против 16).
- Минимальная потеря качества: < 1 BLEU point на стандартных бенчмарках.
- Ускорение инференса: меньше данных для чтения из VRAM на каждый токен — decode memory-bound, поэтому меньший размер весов напрямую даёт больше tok/s.
- Нет зависимости от FP8-железа: работает на любой GPU, включая Ampere (RTX 3090), где нативного FP8 нет.
AWQ против GPTQ против FP8
| Метод | Битность | Требование к железу | Типичная потеря | Комментарий |
|---|---|---|---|---|
| FP16 | 16 | любое | 0 | базовая линия |
| AWQ | 4 | любое | < 1 BLEU | activation-aware, пер-канал scale |
| GPTQ | 4 | любое | ~1–2 BLEU | second-order, пост-хок квантизация |
| FP8 (E4M3) | 8 | Hopper/Blackwell (H100/B200) | минимальная | нативная поддержка Tensor Cores |
Когда что выбирать:
- AWQ — ваш основной выбор для 4-бит на consumer/старом железе (3090/4090, Ampere/Ada без FP8). Лучшее качество при 4 битах.
- GPTQ — альтернатива AWQ; иногда лучше на конкретных моделях, но в среднем AWQ чуть точнее.
- FP8 — только на H100/B200: даёт 2x экономию (8 бит) при почти нулевой потере и аппаратном ускорении. На 3090/4090 нативного FP8 нет.
Поддержка в vLLM
vLLM нативно поддерживает AWQ-модели из Hugging Face:
vllm serve Qwen3.8-27B-AWQ-MTP --quantization awq
В большинстве случаев --quantization определяется автоматически по конфигу модели (поле quantization_config), флаг нужен явно для моделей без метаданных.
Что мы видели в референс-деплое
В нашем референс-деплое квантизация — ключевое звено всей архитектуры. Qwen3.8-27B в FP16 — ~54GB весов, в 2×RTX 3090 (48GB суммарно) с KV-cache под 256K это физически не влезает. В AWQ (INT4) веса — ~14GB, и вместе с KV-cache (~18GB на 256K×2) всё укладывается в 46/48GB VRAM.
Без AWQ этой конфигурации бы не существовало: ни 256K контекста, ни 100 tok/s. Квантизация — не «оптимизация», а условие возможности запуска 27B на consumer-железе.
Почему именно AWQ, а не FP8: RTX 3090 — Ampere, нативного FP8-инференса нет (см. FP8). Полный путь подбора модели и квантизации — в части 2, а запуск — в части 3 серии «Наш опыт» и в бенчмарке Qwen на 2×3090.
Как выбрать калибровочный набор
Качество AWQ напрямую зависит от калибровочного набора — реальных промптов, на которых AWQ измеряет активации. Плохой калибровочный набор = плохая квантизация.
Правила:
- Реалистичность: промпты должны быть из вашей реальной нагрузки, а не синтетические. Если вы гоняете код-агента, калибруйте на кодовых промптах. Если RAG — на текстах из вашей базы знаний.
- Разнообразие: 128–512 промптов разного типа (вопросы, команды, длинные контексты). Один тип промптов → AWQ оптимизируется под него и деградирует на остальных.
- Длина: включите промпты разной длины (короткие + длинные), потому что распределение активаций зависит от длины.
- Не используйте данные с ответами: калибровка использует только входы (промпты), не ответы.
Если у вас нет реальных промптов, используйте представительный датасет из вашего домена (например, для кода — HumanEval/MBPP, для общего текста — Wikipedia-выборки).
Частые ошибки
- Калибровка на синтетике: AWQ, откалиброванный на случайных текстах, деградирует на реальных промптах. Всегда используйте реальные данные.
- Слишком маленький набор: < 64 промптов → нестабильная оценка активаций, квантизация «упирается» в шум.
- Один тип нагрузки: калибровка только на коротких чатах → деградация на длинных агентных промптах.
- Игнорирование проверки качества: после квантизации обязательно прогоните eval-набор (BLEU, или ваш внутренний benchmark) и сравните с FP16 baseline. < 1 BLEU point — ок; > 2 — пересмотрите калибровку или выберите другую модель.
Вывод
AWQ — стандартный способ ужать модель в 4 раза по памяти с минимальной потерей качества, без требования к современному железу. Для consumer-инференса (3090/4090) это де-факто единственный путь запустить 27B+ с длинным контекстом. Если у вас H100 — рассматривайте FP8; если 3090/4090 — AWQ. И всегда калибруйте на реальных промптах и проверяйте качество после квантизации.
Смежные материалы: FP8, Tensor Parallelism, PagedAttention.