中文翻译暂不可用,显示俄语原文。
Чем AWQ отличается от GPTQ?
Краткий тезис
GPTQ и AWQ — это два популярных алгоритма пост-тренировочной квантизации (PTQ) для LLM, позволяющие уменьшить размер модели и ускорить инференс. GPTQ — метод, основанный на гессианской оптимизации (Hessian-based), он квантизует все веса равномерно в INT4/INT3, достигая хорошего качества на общих текстовых задачах. AWQ (Activation-aware Weight Quantization) — более новый подход, который анализирует важность весов на основе активаций на калибровочном датасете и защищает 1% критически важных весов, оставляя их в FP16, а остальные квантизует в INT4. Это даёт AWQ преимущество на рассуждающих задачах (reasoning, math, code) при незначительном увеличении памяти (≈1% дополнительно). Выбор между ними зависит от сценария: GPTQ надёжен для general‑purpose, AWQ даёт лучшие результаты, когда требуется «умное» поведение модели.
1. Термин: Квантизация (Quantization) в контексте LLM
Квантизация — это процесс уменьшения точности представления числовых значений (весов и/или активаций) модели, например, с 16-битного числа с плавающей точкой (FP16) до 4-битного целого (INT4). Цель — снизить объём памяти и ускорить вычисления на современном оборудовании (GPU, NPU).
Существует два основных подхода:
- Quantization-Aware Training (QAT) — квантизация встраивается в процесс обучения.
- Post-Training Quantization (PTQ) — квантизация выполняется на уже обученной модели без доступа к обучающим данным, только с использованием небольшого калибровочного датасета.
GPTQ и AWQ относятся именно к PTQ. Оба метода используют калибровочный датасет (обычно несколько сотен примеров) для настройки параметров квантизации. Однако их математическая основа и стратегия защиты весов кардинально различаются.
2. GPTQ: Hessian‑оптимизация для равномерной квантизации
GPTQ (Generative Pre‑trained Transformer Quantization) — алгоритм, предложенный в 2022 году (Frantar et al.). Он основан на методе отсутствующих гессианских коррекций (Optimal Brain Quantization, OBQ). Ключевая идея: квантизация одного веса влияет на остальные, поэтому после округления веса до INT необходимо корректировать остальные веса так, чтобы минимизировать ошибку предсказания (взвешенную гессианом потерь).
2.1. Основные шаги GPTQ
- Вычисление гессиана (матрицы вторых производных) потерь для каждого слоя на калибровочном датасете. Гессиан показывает, насколько чувствительна функция потерь к изменению каждого веса.
- Последовательная квантизация весов слоя: один вес округляется до INT, затем другие веса корректируются с учётом гессиана, чтобы компенсировать ошибку.
- Повторение для всех слоёв.
2.2. Параметры GPTQ
- bits — число бит на вес (обычно 4, реже 3 или 2).
- group_size — размер группы весов, для которой используются одинаковые масштабирующие коэффициенты (scale) и смещения (zero‑point). Типичные значения: 128 или 32. Меньший group_size даёт более точную квантизацию, но требует больше памяти для хранения параметров масштабирования.
- desc_act — опция, позволяющая квантизовать веса в порядке убывания их «важности» (по диагонали гессиана). Обычно включена.
2.3. Свойства GPTQ
- Равномерный подход: все веса квантизуются одинаково, но порядок квантизации и коррекции зависят от гессиана.
- Хорошо масштабируется для очень больших моделей (70B+), так как не требует дополнительного анализа активаций.
- Среднее качество на задачах, требующих рассуждений (по сравнению с AWQ). Однако на общих задачах (perplexity) GPTQ часто демонстрирует конкурентоспособные результаты.
3. AWQ: Защита важных весов на основе активаций
AWQ (Activation‑aware Weight Quantization) — метод, предложенный в 2023 году (Lin et al.). Его основное отличие — предварительный анализ активаций (результатов работы слоёв) на калибровочном датасете. Идея в том, что не все веса одинаково важны: некоторые веса (≈1%) имеют гораздо большее влияние на конечный вывод, когда они задействуются в «критических» паттернах активаций.
3.1. Как AWQ определяет важность весов
- Пропускаем калибровочный датасет через исходную модель (FP16).
- Для каждого слоя собираем статистику активаций (выходных значений после применения весов к входным данным).
- Вычисляем масштаб важности (importance scale) для каждой строки матрицы весов (или для каждого отдельного веса), обычно как среднее или максимальное значение активации по калибровочному набору.
- Определяем 1% самых важных весов (с наибольшим масштабом важности). Эти веса не квантизуются, остаются в FP16.
3.2. Процесс квантизации в AWQ
- Защищаемые веса (salient weights) — ≈1% от общего числа — остаются в FP16.
- Остальные 99% квантизуются в INT4 с использованием обычной процедуры округления с масштабированием (scale). При этом масштаб подбирается так, чтобы максимально сохранить точность после квантизации.
- Важно: защищаемые веса хранятся отдельно в FP16 (например, в виде дополнительной матрицы), что увеличивает общий размер модели примерно на 1%.
3.3. Параметры AWQ
- bits — 4 (основной вариант, реже 3).
- group_size — обычно 128, как и в GPTQ.
- calibration dataset — используется для вычисления активаций. Рекомендуется брать датасет, релевантный целевой задаче (например, для code — набор программного кода).
3.4. Свойства AWQ
- Более высокая точность на задачах, требующих рассуждений: математика (GSM8K, MATH), генерация кода (HumanEval), сложные QA.
- Небольшое увеличение памяти (~1%) из-за хранения защищаемых весов в FP16.
- Скорость инференса практически не отличается от GPTQ (основные 99% весов используют те же INT4 вычисления).
- Требует меньше калибровочных данных, чем GPTQ, и быстрее выполняется (не требует вычисления полного гессиана).
4. Сравнение GPTQ и AWQ в таблице
| Характеристика | GPTQ | AWQ |
|---|---|---|
| Принцип | Оптимизация на основе гессиана (Hessian‑based) | Анализ важности весов по активациям (activation‑aware) |
| Защита весов | Все веса квантизуются (равномерно) | ≈1% важных весов остаются в FP16 |
| Метод коррекции | Последовательная оптимизация с компенсацией ошибки | Простое масштабирование (scale) для неважных весов |
| Дополнительная память | Нет | +1% (хранение FP16 для защищённых весов) |
| Скорость квантизации | Средняя (требует вычисление гессиана) | Быстрая (только сбор активаций + округление) |
| Точность (perplexity) | Хорошая (близка к FP16 на общих доменах) | Сравнима с GPTQ на общих текстах, лучше на reasoning |
| Производительность inference | Высокая (INT4) | Высокая (INT4 + FP16 для 1% весов) |
| Поддержка библиотек | auto‑gptq, transformers, vLLM | awq, transformers, vLLM, TGI |
| Лучшие сценарии | General purpose, большие модели (70B+) | Reasoning, code, math, задачи с логикой |
5. Влияние на качество (бенчмарки)
Практические замеры (на моделях LLaMA‑2 7B‑70B) показывают:
- Perplexity (на Wikitext‑2): GPTQ (group=128) ≈ 5.1, AWQ ≈ 5.0 (разница <1%).
- MMLU (общие знания): GPTQ ≈ 45.7%, AWQ ≈ 46.2% (разница в пределах шума).
- HumanEval (код): GPTQ ≈ 22.3%, AWQ ≈ 26.8% (разница ~20% относительная).
- GSM8K (математика): GPTQ ≈ 36.4%, AWQ ≈ 42.9% (разница ~18%).
Таким образом, AWQ даёт существенный прирост на задачах, где требуется многошаговое рассуждение и точные вычисления.
6. Когда выбирать GPTQ, а когда AWQ
-
Выбирайте GPTQ, если:
- Модель очень большая (70B+) и вы озабочены дополнительной памятью (AWQ добавляет 1%).
- Ваш основной сценарий — генерация общего текста, суммаризация, перевод, где не нужно глубокое рассуждение.
- У вас нет возможности собрать релевантный калибровочный датасет для AWQ.
- Вы используете инструменты, которые хорошо поддерживают GPTQ, но не AWQ (например, некоторые старые версии
vLLM).
-
Выбирайте AWQ, если:
- Модель используется для задач, требующих логики (code‑generation, math, анализ).
- Готовы пожертвовать 1% памяти ради прироста качества на reasoning.
- У вас есть калибровочный датасет, близкий к вашей доменной области.
- Вы используете современные библиотеки (Transformers ≥4.36, AutoAWQ, vLLM ≥0.2.7).
7. Практическая реализация (пример кода)
7.1. Квантизация с GPTQ (используя auto_gptq)
from transformers import AutoModelForCausalLM, AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM
model_name = "meta-llama/Llama-2-7b-hf"
quantize_config = {
"bits": 4,
"group_size": 128,
"desc_act": True,
}
tokenizer = AutoTokenizer.from_pretrained(model_name, use_fast=True)
model = AutoGPTQForCausalLM.from_pretrained(
model_name,
quantize_config=quantize_config,
use_trilu=True
)
# Квантизация на калибровочном датасете (пример: 256 предложений из Wikitext-2)
model.quantize(
tokenizer,
calibration_dataset,
max_samples=256,
batch_size=1,
use_triton=True
)
# Сохранение квантизированной модели
model.save_pretrained("./llama-7b-gptq-4bit")
tokenizer.save_pretrained("./llama-7b-gptq-4bit")
7.2. Квантизация с AWQ (используя awq)
from transformers import AutoModelForCausalLM, AutoTokenizer
from awq import AutoAWQForCausalLM
model_name = "meta-llama/Llama-2-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
model = AutoAWQForCausalLM.from_pretrained(model_name, trust_remote_code=True)
# AWQ требует калибровочного датасета (желательно из той же предметной области)
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "gemm" # или "fast" для большей скорости
}
# Квантизация
model.quantize(calibration_dataset, quant_config)
# Сохранение
model.save_pretrained("./llama-7b-awq-4bit")
tokenizer.save_pretrained("./llama-7b-awq-4bit")
7.3. Инференс (c vLLM поддерживает обе версии)
from vllm import LLM, SamplingParams
# GPTQ
llm_gptq = LLM(model="./llama-7b-gptq-4bit", quantization="gptq")
# AWQ
llm_awq = LLM(model="./llama-7b-awq-4bit", quantization="awq")
output = llm_awq.generate("Реши задачу: 2x + 5 = 13. Найдите x.")
print(output[0].outputs[0].text)
8. Ограничения и альтернативы
- Оба метода не подходят для квантизации активаций (только веса). Для полной квантизации (веса + активации) часто используют методы вроде LLM.int8 (bitsandbytes) или SmoothQuant.
- Bitsandbytes — ещё один популярный метод для 8‑битной и 4‑битной квантизации, работающий непосредственно во время инференса без предварительной квантизации. Однако его скорость и точность уступают специализированным PTQ‑алгоритмам.
- GGUF/llama.cpp — формат для CPU‑инференса, где применяется свой набор квантизаций (Q4_K_M и т.д.). Они также основаны на принципах, близких к GPTQ, но оптимизированы для CPU.
- SqueezeLLM — метод, похожий на AWQ, но с более продвинутой селекцией весов.
- Для мобильных/edge‑устройств часто используют TFLite или CoreML с собственными квантизаторами.
9. Пет-проект для закрепления
Задача Сравнить качество AWQ и GPTQ на модели Mistral-7B на задаче генерации кода (HumanEval).
Инструменты
- Python 3.10+, PyTorch, Transformers,
auto_gptq,awq,vllm(опционально). - Датасеты: HumanEval (для оценки) и небольшой калибровочный датасет кода (C4 Code, CodeSearchNet).
- Метрика: pass@1 (доля правильно решённых задач).
Шаги:
- Загрузите базовую модель
mistralai/Mistral-7B-v0.1в FP16. - Калибровочный датасет: соберите 512 примеров кода из CodeSearchNet (или Hugging Face
bigcode/the-stack). - Примените AWQ (с защитой 1% весов) и GPTQ (group_size=128, desc_act=True).
- Для каждого варианта:
- Загрузите квантизированную модель через
vLLM. - Сгенерируйте ответы на HumanEval (используя один и тот же sampling: temperature=0.2, top_p=0.95).
- Загрузите квантизированную модель через
- Вычислите pass@1 (с помощью библиотеки
human_evalилиbigcode-evaluation-harness). - Замерьте также скорость инференса (токенов/сек) и пиковое потребление VRAM.
Ожидаемый результат
- AWQ покажет pass@1 на ~5–10% выше, чем GPTQ.
- Потребление VRAM для AWQ будет больше на ~1% (≈0.1–0.2 ГБ для 7B модели).
- Скорость инференса будет практически одинаковой (оба метода дают примерно 40–60 ток/с на A100).
10. Связь с другими вопросами из списка
| Вопрос | Тема |
|---|---|
| 208 | Общие методы сжатия моделей |
| 209 | Влияние квантизации на качество |
| 840 | Сравнение AWQ и bitsandbytes |
| 838 | Выбор метода квантизации для GPU |
| 841 | Практические рекомендации по выбору |
| 736 | Проблемы сжатия моделей |
Навигация
- Предыдущий: 838
- Следующий: 840
- Индекс: 00. Индекс разборов