中文翻译暂不可用,显示俄语原文。
Сравнить 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) |
| Репозиторий инструментов GPTQ | AutoGPTQ (pip install auto-gptq) |
| Репозиторий инструментов AWQ | AutoAWQ (pip install autoawq) |
| Бенчмарк GSM8K | Hugging Face: gsm8k (main, 8-shot) |
| Бенчмарк MATH | Hugging Face: math_dataset (4-shot) |
| Бенчмарк HumanEval | Hugging Face: openai_humaneval (zero-shot) |
| GPU с VRAM ≥16 GB | Локально или облако (Google Colab Pro, RunPod, LambdaLabs) |
| Python 3.10+, PyTorch 2.x | Установка |
Если нет реального GPU с достаточной памятью — симулируем ограниченный эксперимент:
- Выбрать модель меньшего размера (например, Llama 3.2 1B или Qwen2.5 1.5B).
- Использовать только бенчмарк GSM8K (меньше всего вычислительных затрат).
- Уменьшить размер калибровочного датасета до 128 сэмплов.
- Запустить инференс только на 50 запросах из каждого бенчмарка (seed фиксирован для воспроизводимости).
3. Технологический стек
| Компонент | Инструменты | Назначение |
|---|---|---|
| Управление экспериментами | Weights & Biases / MLflow / CSV | Логирование метрик и конфигураций |
| Загрузка моделей | Hugging Face transformers | Инференс full-precision модели |
| Квантизация GPTQ | auto-gptq (AutoGPTQForCausalLM) | 4‑битная квантизация |
| Квантизация AWQ | autoawq (AutoAWQForCausalLM) | 4‑битная квантизация |
| Бенчмаркинг | lm-evaluation-harness (EleutherAI) | Унифицированный запуск GSM8K, MATH, HumanEval |
| Обработка данных | datasets (Hugging Face) | Загрузка и подготовка бенчмарков |
| Мониторинг ресурсов | nvidia-smi + Python psutil | VRAM, время инференса |
| Визуализация | matplotlib, seaborn | Построение графиков (accuracy vs. VRAM vs. tokens/s) |
4. Этапы выполнения
Этап 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 - Скачать базовую модель (например, 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") - Загрузить бенчмарки
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") - Создать структуру директорий
./experiments/ ├── models/ # квантизованные модели (кэш) ├── results/ # CSV с метриками ├── logs/ # логи инференса └── report/ # финальный отчёт - Определить baseline (full-precision модель, float16) — прогнать инференс на всех трёх бенчмарках через lm_eval, чтобы получить эталонную точность.
Ожидаемый результат этапа Рабочее окружение, скачанная модель и датасеты, выполнены baseline-замеры full-precision модели.
Этап 2: Квантизация GPTQ и AWQ (2–3 часа)
Действия
- 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") - 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") - Измерить
- Размер модели на диске (
du -sh ./models/*) - VRAM при загрузке (использовать torch.cuda.max_memory_allocated())
- Время квантизации
- Размер модели на диске (
Ожидаемый результат этапа Две квантизованные версии модели (GPTQ 4-bit, AWQ 4-bit) сохранены локально. Получены метрики сжатия (размер, VRAM).
Этап 3: Оценка на reasoning-задачах (3–4 часа)
Действия
- Настроить 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 - Зафиксировать:
- Автоматически собрать результаты 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 - Повторить каждый эксперимент 3 раза с разными seed (но фиксированными в рамках бенчмарка) для оценки среднеквадратичного отклонения.
Ожидаемый результат этапа Таблица метрик (среднее ± std) для трёх моделей + метрики скорости и памяти.
Этап 4: Анализ результатов и подготовка отчёта (1–2 часа)
Действия
- Построить сравнительную таблицу
| Модель | Размер (GB) | VRAM (GB) | Tokens/s | GSM8K | MATH | HumanEval |
|---|---|---|---|---|---|---|
| FP16 | 15.0 | 16.2 | 45 | 72.3% | 35.1% | 40.8% |
| GPTQ | 4.3 | 6.0 | 120 | 69.1% | 32.0% | 38.2% |
| AWQ | 4.3 | 5.8 | 125 | 73.5% | 36.8% | 42.0% |
-
Рассчитать относительное улучшение 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% (на примере выше — выполняется).
-
Визуализировать (гистограммы точности, scatter plot tokens/s vs accuracy).
-
Сформулировать выводы
- Какая квантизация даёт лучшее соотношение quality / speed?
- На каких подзадачах разница особенно заметна?
- Рекомендуется ли переходить на AWQ в production (с учётом стабильности, поддержки в inference engine)?
Ожидаемый результат этапа Markdown-отчёт (5–10 страниц) с таблицами, графиками и обоснованным recommendation.
Этап 5: Написание сравнительного анализа (1 час)
Действия
- Оформление финального документа в формате ТЗ (см. п.6).
- Добавить раздел «Технические ограничения»:
- Подготовить исполняемый рецепт (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).
- Графики:
- Анализ:
- Вывод и рекомендацию: какую квантизацию использовать для 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. Подготовка окружения и baseline | 1.0 |
| 2. Квантизация GPTQ и AWQ | 2.5 |
| 3. Оценка на reasoning-задачах (3 прогона) | 4.0 |
| 4. Анализ и отчёт | 2.0 |
| 5. Оформление финала | 1.0 |
| Итого | 10.5 |
Примечание: В первый раз может потребоваться +2–3 часа на отладку зависимостей и исправление ошибок в конфигурации. Рекомендуется закладывать один полный рабочий день (8–10 часов) на выполнение.
9. Связанные вопросы из базы знаний
| Вопрос | Тема |
|---|---|
| 5 | Методы квантизации LLM (обзор) |
| 12 | Оценка качества сжатия на NLP-бенчмарках |
| 34 | GPTQ: алгоритм и практика |
| 47 | AWQ: адаптивное взвешивание каналов |
| 56 | Сравнение GPTQ, AWQ, GGUF на speed/quality |
| 78 | Рецепты для reasoning-задач (Chain-of-Thought) |
| 101 | Архитектура Llama 3/Mistral и особенности инференса |
| 134 | Выбор квантизации для multi-agent систем |
| 201 | HumanEval: пайплайн оценки генерации кода |
| 289 | Влияние group_size на качество квантизованной модели |
10. Чек-лист самопроверки
- Я скачал модель, датасеты и необходимые пакеты.
- Я зафиксировал baseline (full-precision) метрики до начала квантизации.
- Я выполнил квантизацию с одинаковыми параметрами (bits=4, group_size=128) для обоих методов.
- Я проверил, что квантизованные модели загружаются без ошибок.
- Я прогнал каждый benchmark минимум 3 раза с разными seed и записал среднее ± std.
- Я построил таблицу и сравнил точность AWQ и GPTQ — гипотеза подтверждена/опровергнута с обоснованием.
- Я сохранил результаты в отчёт и приложил скрипт для воспроизведения.