English translation is not available yet. Showing Russian content.

Сравнить GPTQ vs AWQ на reasoning задачах

ТЕХНИЧЕСКОЕ ЗАДАНИЕ: Сравнить GPTQ vs AWQ на reasoning задачах

1. Цель задачи

Сравнить два популярных метода квантизации LLM — GPTQ и AWQ — на наборе benchmark-задач, требующих логического рассуждения (reasoning). Оценить потери в точности относительно full-precision модели, а также измерить прирост в скорости инференса и уменьшение размера модели. Ключевая гипотеза: AWQ (с адаптивным взвешиванием каналов) сохраняет больше качества на reasoning-задачах и даёт улучшение на 5–10% по метрикам точности по сравнению с GPTQ при сопоставимом сжатии.

Ключевой результат Сравнительная таблица метрик (accuracy / pass@1) на GSM8K, MATH, HumanEval для full-precision модели и её квантизованных версий (GPTQ 4-bit, AWQ 4-bit). Документ с анализом и рекомендацией по выбору метода.


2. Исходные данные

Что нужноОткуда взять
Базовая LLM (например, Llama 3.1 8B / Mistral 7B / Qwen2.5 7B)Hugging Face: meta-llama/Llama-3.1-8B, mistralai/Mistral-7B-v0.3
Датасет для квантизации (калибровочный)Hugging Face: wikitext-2-raw-v1 (GPTQ) или pile-uncopyrighted (AWQ)
Репозиторий инструментов GPTQAutoGPTQ (pip install auto-gptq)
Репозиторий инструментов AWQAutoAWQ (pip install autoawq)
Бенчмарк GSM8KHugging Face: gsm8k (main, 8-shot)
Бенчмарк MATHHugging Face: math_dataset (4-shot)
Бенчмарк HumanEvalHugging Face: openai_humaneval (zero-shot)
GPU с VRAM ≥16 GBЛокально или облако (Google Colab Pro, RunPod, LambdaLabs)
Python 3.10+, PyTorch 2.xУстановка

Если нет реального GPU с достаточной памятью — симулируем ограниченный эксперимент:

  1. Выбрать модель меньшего размера (например, Llama 3.2 1B или Qwen2.5 1.5B).
  2. Использовать только бенчмарк GSM8K (меньше всего вычислительных затрат).
  3. Уменьшить размер калибровочного датасета до 128 сэмплов.
  4. Запустить инференс только на 50 запросах из каждого бенчмарка (seed фиксирован для воспроизводимости).

3. Технологический стек

КомпонентИнструментыНазначение
Управление экспериментамиWeights & Biases / MLflow / CSVЛогирование метрик и конфигураций
Загрузка моделейHugging Face transformersИнференс full-precision модели
Квантизация GPTQauto-gptq (AutoGPTQForCausalLM)4‑битная квантизация
Квантизация AWQautoawq (AutoAWQForCausalLM)4‑битная квантизация
Бенчмаркингlm-evaluation-harness (EleutherAI)Унифицированный запуск GSM8K, MATH, HumanEval
Обработка данныхdatasets (Hugging Face)Загрузка и подготовка бенчмарков
Мониторинг ресурсовnvidia-smi + Python psutilVRAM, время инференса
Визуализацияmatplotlib, seabornПостроение графиков (accuracy vs. VRAM vs. tokens/s)

4. Этапы выполнения

Этап 1: Подготовка окружения и бенчмарков (1 час)

Действия

  1. Установить зависимости
    pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
    pip install transformers datasets accelerate auto-gptq autoawq lm_eval  # lm_eval==0.4.2
    
  2. Скачать базовую модель (например, mistralai/Mistral-7B-v0.3):
    from transformers import AutoModelForCausalLM, AutoTokenizer
    model_name = "mistralai/Mistral-7B-v0.3"
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    model_fp16 = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16, device_map="auto")
    
  3. Загрузить бенчмарки
    from datasets import load_dataset
    gsm8k = load_dataset("gsm8k", "main")["test"]
    math = load_dataset("math_dataset", "algebra__linear_1d")["test"]
    humaneval = load_dataset("openai_humaneval", split="test")
    
  4. Создать структуру директорий
    ./experiments/
       ├── models/          # квантизованные модели (кэш)
       ├── results/         # CSV с метриками
       ├── logs/            # логи инференса
       └── report/          # финальный отчёт
    
  5. Определить baseline (full-precision модель, float16) — прогнать инференс на всех трёх бенчмарках через lm_eval, чтобы получить эталонную точность.

Ожидаемый результат этапа Рабочее окружение, скачанная модель и датасеты, выполнены baseline-замеры full-precision модели.


Этап 2: Квантизация GPTQ и AWQ (2–3 часа)

Действия

  1. GPTQ квантизация (4-bit, group_size=128, desc_act):
    from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
    quantize_config = BaseQuantizeConfig(
        bits=4, group_size=128, desc_act=True, damp_percent=0.01,
    )
    model_gptq = AutoGPTQForCausalLM.from_pretrained(model_name, quantize_config)
    # Калибровочные данные (берём 128 сэмплов из wikitext-2)
    calib_dataset = load_dataset("wikitext", "wikitext-2-raw-v1", split="train")
    calib_texts = [calib_dataset[i]["text"] for i in range(128)]
    model_gptq.quantize(calib_texts, batch_size=1)
    model_gptq.save_quantized("./models/gptq-4bit")
    
  2. AWQ квантизация (4-bit, group_size=128):
    from awq import AutoAWQForCausalLM
    from transformers import AutoTokenizer
    model_awq = AutoAWQForCausalLM.from_pretrained(model_name)
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    # Калибровочные данные (Pile, 128 сэмплов)
    calib = load_dataset("json", data_files="https://the-eye.eu/public/AI/pile/train/00.jsonl.zst", split="train")
    calib_texts = [calib[i]["text"] for i in range(128)]
    model_awq.quantize(tokenizer, calib_texts, quant_config={"bits": 4, "group_size": 128})
    model_awq.save_pretrained("./models/awq-4bit")
    tokenizer.save_pretrained("./models/awq-4bit")
    
  3. Измерить
    • Размер модели на диске (du -sh ./models/*)
    • VRAM при загрузке (использовать torch.cuda.max_memory_allocated())
    • Время квантизации

Ожидаемый результат этапа Две квантизованные версии модели (GPTQ 4-bit, AWQ 4-bit) сохранены локально. Получены метрики сжатия (размер, VRAM).


Этап 3: Оценка на reasoning-задачах (3–4 часа)

Действия

  1. Настроить lm_eval для каждого бенчмарка и модели:
    # Full-precision
    lm_eval --model hf --model_args pretrained=mistralai/Mistral-7B-v0.3,dtype=float16 \
            --tasks gsm8k,math,humaneval --output_path ./results/fp16 --log_samples
    # GPTQ
    lm_eval --model hf --model_args pretrained=./models/gptq-4bit,autogptq=True,gptq_use_triton=False \
            --tasks gsm8k,math,humaneval --output_path ./results/gptq --log_samples
    # AWQ
    lm_eval --model hf --model_args pretrained=./models/awq-4bit,awq=True \
            --tasks gsm8k,math,humaneval --output_path ./results/awq --log_samples
    
  2. Зафиксировать:
    • Accuracy / pass@1 (HumanEval: pass@1)
    • Среднее время генерации одного токена (tokens/s)
    • Пиковое потребление VRAM
  3. Автоматически собрать результаты Python-скриптом:
    import json, os, csv
    metrics = {}
    for method in ["fp16", "gptq", "awq"]:
        results_file = f"./results/{method}/results_*.json"
        with open(os.path.join(glob.glob(results_file)[0])) as f:
            data = json.load(f)
        metrics[method] = {
            "gsm8k": data["results"]["gsm8k"]["acc"],
            "math": data["results"]["math"]["acc"],
            "humaneval": data["results"]["humaneval"]["pass@1"]
        }
    # Сохранить в CSV
    
  4. Повторить каждый эксперимент 3 раза с разными seed (но фиксированными в рамках бенчмарка) для оценки среднеквадратичного отклонения.

Ожидаемый результат этапа Таблица метрик (среднее ± std) для трёх моделей + метрики скорости и памяти.


Этап 4: Анализ результатов и подготовка отчёта (1–2 часа)

Действия

  1. Построить сравнительную таблицу
МодельРазмер (GB)VRAM (GB)Tokens/sGSM8KMATHHumanEval
FP1615.016.24572.3%35.1%40.8%
GPTQ4.36.012069.1%32.0%38.2%
AWQ4.35.812573.5%36.8%42.0%
  1. Рассчитать относительное улучшение AWQ над GPTQ:

    Δ(GSM8K) = (73.5 - 69.1) / 69.1 ≈ +6.4%
    Δ(MATH)  = (36.8 - 32.0) / 32.0 ≈ +15.0%
    Δ(HumanEval) = (42.0 - 38.2) / 38.2 ≈ +9.9%
    

    Проверить гипотезу: AWQ лучше на 5–10% (на примере выше — выполняется).

  2. Визуализировать (гистограммы точности, scatter plot tokens/s vs accuracy).

  3. Сформулировать выводы

    • Какая квантизация даёт лучшее соотношение quality / speed?
    • На каких подзадачах разница особенно заметна?
    • Рекомендуется ли переходить на AWQ в production (с учётом стабильности, поддержки в inference engine)?

Ожидаемый результат этапа Markdown-отчёт (5–10 страниц) с таблицами, графиками и обоснованным recommendation.


Этап 5: Написание сравнительного анализа (1 час)

Действия

  1. Оформление финального документа в формате ТЗ (см. п.6).
  2. Добавить раздел «Технические ограничения»:
    • AWQ требует специфической поддержки в инференс-фреймворках (exllamav2, TGI, vLLM).
    • GPTQ более универсален (поддерживается почти всеми библиотеками).
  3. Подготовить исполняемый рецепт (Makefile / shell-скрипт) для автоматизации всего пайплайна.

Ожидаемый результат этапа Полностью заполненный шаблон результата (раздел 6) — compare_gptq_awq_report.md.


5. Критерии приемки (Definition of Done)

  • Получены метрики точности для full-precision, GPTQ 4-bit, AWQ 4-bit на всех трёх датасетах (GSM8K, MATH, HumanEval) в виде таблицы.
  • Каждый эксперимент выполнен минимум 3 раза (разные seed), указано среднее и std.
  • Измерен пиковый расход VRAM при инференсе (в MB).
  • Измерена скорость инференса (tokens/s) для каждой модели.
  • Вычислено относительное изменение точности AWQ относительно GPTQ (в процентах).
  • Подтверждена или опровергнута гипотеза: AWQ лучше на 5–10% по усреднённой метрике.
  • Создан отчёт (compare_gptq_awq_report.md) с таблицами и графиками.
  • Воспроизводимые инструкции (shell-скрипт или Jupyter notebook) приложены.

6. Ожидаемый результат

Основной артефакт — файл compare_gptq_awq_report.md (или эквивалент PDF/IPYNB), содержащий:

  • Описание эксперимента: модель, датасеты, гиперпараметры квантизации.
  • Сводную таблицу (см. Этап 4, таблица 1).
  • Графики:
    • Accuracy на каждом бенчмарке (bar plot с error bar).
    • Trade-off: Accuracy (среднее по трём задачам) vs. VRAM usage.
  • Анализ:
    • Сравнение по метрикам: на скольких % AWQ превзошёл GPTQ? Есть ли задачи, где GPTQ лучше?
    • Влияние на скорость — стоит ли компромисс?
  • Вывод и рекомендацию: какую квантизацию использовать для reasoning-агентов.
  • Ресурсные характеристики (время квантизации, размер файлов).

Дополнительные ожидаемые артефакты:

  • CSV-файл experiment_results.csv с сырыми значениями.
  • shell-скрипт run_all.sh, воспроизводящий все шаги.

7. Возможные сложности и их решение

СложностьРешение
Не хватает VRAM для загрузки full-precision модели (16 GB)Использовать модель 7B вместо 8B, или перейти на Llama 3.2 3B.
Ошибки совместимости версий auto-gptq / autoawq с transformersИспользовать Conda-окружение, зафиксировать версии (transformers==4.45.0, auto-gptq==0.7.1, autoawq==0.2.6).
lm_eval вылетает с OOM на HumanEval (генерация кода до 1024 токенов)Ограничить max_new_tokens=512, использовать batch_size=1.
Разные версии датасетов дают несопоставимые метрикиИспользовать один и тот же seed для разбивки (load_dataset(..., split="test")) и фиксированный набор промптов.
Квантизация занимает >4 часов (на CPU)Запускать только на GPU (CUDA). Если GPU слабый — уменьшить калибровочный датасет до 64 сэмплов.

8. Бюджет времени (оценка)

ЭтапВремя (часы)
1. Подготовка окружения и baseline1.0
2. Квантизация GPTQ и AWQ2.5
3. Оценка на reasoning-задачах (3 прогона)4.0
4. Анализ и отчёт2.0
5. Оформление финала1.0
Итого10.5

Примечание: В первый раз может потребоваться +2–3 часа на отладку зависимостей и исправление ошибок в конфигурации. Рекомендуется закладывать один полный рабочий день (8–10 часов) на выполнение.


9. Связанные вопросы из базы знаний

ВопросТема
5Методы квантизации LLM (обзор)
12Оценка качества сжатия на NLP-бенчмарках
34GPTQ: алгоритм и практика
47AWQ: адаптивное взвешивание каналов
56Сравнение GPTQ, AWQ, GGUF на speed/quality
78Рецепты для reasoning-задач (Chain-of-Thought)
101Архитектура Llama 3/Mistral и особенности инференса
134Выбор квантизации для multi-agent систем
201HumanEval: пайплайн оценки генерации кода
289Влияние group_size на качество квантизованной модели

10. Чек-лист самопроверки

  • Я скачал модель, датасеты и необходимые пакеты.
  • Я зафиксировал baseline (full-precision) метрики до начала квантизации.
  • Я выполнил квантизацию с одинаковыми параметрами (bits=4, group_size=128) для обоих методов.
  • Я проверил, что квантизованные модели загружаются без ошибок.
  • Я прогнал каждый benchmark минимум 3 раза с разными seed и записал среднее ± std.
  • Я построил таблицу и сравнил точность AWQ и GPTQ — гипотеза подтверждена/опровергнута с обоснованием.
  • Я сохранил результаты в отчёт и приложил скрипт для воспроизведения.