English translation is not available yet. Showing Russian content.

Чем 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

  1. Вычисление гессиана (матрицы вторых производных) потерь для каждого слоя на калибровочном датасете. Гессиан показывает, насколько чувствительна функция потерь к изменению каждого веса.
  2. Последовательная квантизация весов слоя: один вес округляется до INT, затем другие веса корректируются с учётом гессиана, чтобы компенсировать ошибку.
  3. Повторение для всех слоёв.

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 определяет важность весов

  1. Пропускаем калибровочный датасет через исходную модель (FP16).
  2. Для каждого слоя собираем статистику активаций (выходных значений после применения весов к входным данным).
  3. Вычисляем масштаб важности (importance scale) для каждой строки матрицы весов (или для каждого отдельного веса), обычно как среднее или максимальное значение активации по калибровочному набору.
  4. Определяем 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 в таблице

ХарактеристикаGPTQAWQ
ПринципОптимизация на основе гессиана (Hessian‑based)Анализ важности весов по активациям (activation‑aware)
Защита весовВсе веса квантизуются (равномерно)≈1% важных весов остаются в FP16
Метод коррекцииПоследовательная оптимизация с компенсацией ошибкиПростое масштабирование (scale) для неважных весов
Дополнительная памятьНет+1% (хранение FP16 для защищённых весов)
Скорость квантизацииСредняя (требует вычисление гессиана)Быстрая (только сбор активаций + округление)
Точность (perplexity)Хорошая (близка к FP16 на общих доменах)Сравнима с GPTQ на общих текстах, лучше на reasoning
Производительность inferenceВысокая (INT4)Высокая (INT4 + FP16 для 1% весов)
Поддержка библиотекauto‑gptq, transformers, vLLMawq, 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, если:

    • Модель используется для задач, требующих логики (codegeneration, 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 (доля правильно решённых задач).

Шаги:

  1. Загрузите базовую модель mistralai/Mistral-7B-v0.1 в FP16.
  2. Калибровочный датасет: соберите 512 примеров кода из CodeSearchNet (или Hugging Face bigcode/the-stack).
  3. Примените AWQ (с защитой 1% весов) и GPTQ (group_size=128, desc_act=True).
  4. Для каждого варианта:
    • Загрузите квантизированную модель через vLLM.
    • Сгенерируйте ответы на HumanEval (используя один и тот же sampling: temperature=0.2, top_p=0.95).
  5. Вычислите pass@1 (с помощью библиотеки human_eval или bigcode-evaluation-harness).
  6. Замерьте также скорость инференса (токенов/сек) и пиковое потребление 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Проблемы сжатия моделей

Навигация