Что такое AWQ

Activation-aware Weight Quantization (AWQ) — метод 4-битной квантизации весов, который учитывает распределение активаций при квантизации. Идея: не все веса одинаково важны, и важность определяется не величиной веса, а тем, какие активации он обрабатывает.

Проблема наивной квантизации

Наивная квантизация (round-to-nearest до 4 бит) обращается со всеми весами одинаково. Но в реальных сетях есть критические каналы — нейроны, чьи активации имеют большой динамический диапазон или высокую дисперсию. Для них 4 бита — слишком грубо: ошибка квантизации на этих каналах непропорционально влияет на выход модели.

Остальные ~95% весов спокойно живут в 4 битах. Проблема — именно в этих ~5% «чувствительных».

Как AWQ это решает

AWQ находит критические каналы и защищает их, не повышая битность всей модели (что разорвало бы 4x экономию):

  1. Анализ активаций: на калибровочном наборе (обычно ~128–512 реальных промптов) AWQ замеряет распределение активаций на входах каждого слоя.
  2. Выделение критических каналов: каналы с большими/редкими активациями помечаются как чувствительные к квантизации.
  3. Адаптивное масштабирование: вместо повышения битности 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

МетодБитностьТребование к железуТипичная потеряКомментарий
FP1616любое0базовая линия
AWQ4любое< 1 BLEUactivation-aware, пер-канал scale
GPTQ4любое~1–2 BLEUsecond-order, пост-хок квантизация
FP8 (E4M3)8Hopper/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.

← Tensor Parallelism FP8 квантизация →