ЗАЧЕМ ВООБЩЕ КВАНТИЗАЦИЯ
Веса LLM по умолчанию хранятся в FP16 или BF16 — два байта на параметр. Простая арифметика: модель на 70 миллиардов параметров в FP16 требует около 140 ГБ только под веса, плюс KV-кэш под контекст. Это три-четыре A100 по 40 ГБ. Дорого, шумно, недоступно из дома.
Квантизация — это сжатие модели за счёт хранения весов в меньшей разрядности: 8, 4, а иногда 3 или 2 бита. Та же 70B в 4-битном варианте занимает уже около 35-40 ГБ и запускается на одной RTX 4090 (24 ГБ) с частичной выгрузкой в RAM или на паре потребительских карт. Ключевая идея: веса нейросети избыточны, и переход с 16 бит на 4 бита теряет заметно меньше качества, чем можно было бы ожидать — по замерам сообщества деградация на бенчмарках вроде MMLU обычно в пределах 1-3% для 4-битных схем.
Отслеживать свежие квантизованные релизы удобно через каталог REDDYX — новые GGUF-сборки популярных моделей появляются там в течение часов после релиза.
КАК ЭТО РАБОТАЕТ ПОД КАПОТОМ
Суть любой квантизации — отобразить диапазон float-значений в маленький набор целых чисел. Берётся группа весов, находится масштаб (scale) и иногда смещение (zero-point), и каждый вес заменяется на целое число плюс формула восстановления. При инференсе веса на лету деквантизуются обратно в float для матричных умножений.
Отличия форматов — в трёх вещах:
- Размер группы — сколько весов делят один масштаб (обычно 32, 64 или 128). Меньше группа — точнее, но больше служебных данных.
- Учёт активаций — «наивная» квантизация игнорирует, какие веса реально важны. Продвинутые методы (AWQ, GPTQ) смотрят на калибровочные данные и защищают критичные каналы.
- Смешанная разрядность — важные слои (например, attention) держат в более высокой точности, остальное жмут агрессивнее.
GGUF — ФОРМАТ ДЛЯ llama.cpp
GGUF (преемник устаревшего GGML) — это не столько метод квантизации, сколько контейнерный формат экосистемы llama.cpp и Ollama. Внутри лежат веса, метаданные, токенизатор и словарь схем квантизации.
Главное достоинство GGUF — гибкая выгрузка слоёв между GPU и CPU. Можно запустить модель, которая не влезает в видеопамять целиком: часть слоёв уходит в VRAM, остальное считается на процессоре и в обычной RAM. Именно поэтому GGUF — король домашних сборок и Mac (Apple Silicon с unified memory).
Расшифровка суффиксов
Схемы вида Q4_K_M читаются так: Q4 — 4 бита, K — «k-quant» с блочной структурой и смешанной точностью, суффикс размера — S (small), M (medium), L (large). На практике:
- Q8_0 — почти без потерь, но тяжёлый; для проверки эталона.
- Q5_K_M — золотая середина, если хватает памяти.
- Q4_K_M — дефолт 2026 года, лучший баланс качество/размер.
- Q3_K_S / IQ3 — когда памяти в обрез; заметная деградация.
- IQ-схемы (imatrix-quant) — используют матрицу важности из калибровки, дают лучшее качество на тех же битах ценой чуть более медленной генерации.
GPTQ — КЛАССИКА GPU-ИНФЕРЕНСА
GPTQ (2022, но живее всех живых) — метод послойной квантизации, который минимизирует ошибку выхода каждого слоя, используя приближение через обратный гессиан на калибровочном наборе. Проще говоря: он не просто округляет веса, а компенсирует ошибку округления в оставшихся весах, чтобы выход слоя почти не менялся.
GPTQ живёт целиком на GPU и требует калибровочные данные (обычно несколько сотен примеров из C4 или подобного). Быстрый инференс на видеокарте, широкая поддержка в exllama/exllamav2. Минус — не умеет выгружаться в CPU, всё должно влезть в VRAM.
AWQ — АКЦЕНТ НА ВАЖНЫЕ ВЕСА
AWQ (Activation-aware Weight Quantization) исходит из наблюдения: не все веса равны. Около 1% каналов дают непропорционально большой вклад в качество. AWQ находит эти важные каналы по статистике активаций и масштабирует их так, чтобы квантизация била по ним меньше — без хранения их в полной точности.
На практике AWQ в 2026-м — предпочтительный формат для продакшена на vLLM и TGI: стабильное качество на 4 битах, отличная пропускная способность при батчинге, хорошая совместимость с serving-стеком. GPTQ и AWQ по качеству близки, но AWQ обычно чуть устойчивее на инструктивных моделях и проще в раздаче.
СРАВНЕНИЕ ФОРМАТОВ
| Критерий | GGUF | GPTQ | AWQ |
|---|---|---|---|
| Основной движок | llama.cpp, Ollama | exllamav2, AutoGPTQ | vLLM, TGI, AutoAWQ |
| Железо | CPU + GPU + Mac | Только GPU (NVIDIA) | Только GPU (NVIDIA) |
| Выгрузка в RAM | Да, послойно | Нет | Нет |
| Нужна калибровка | Нет (IQ — да) | Да | Да |
| Пропускная способность (батч) | Средняя | Высокая | Высокая |
| Типичные биты | 2-8 (гибко) | 3-4-8 | 4 (в основном) |
| Лучший сценарий | Локально, дома, Mac | Одиночные запросы на GPU | Продакшен-serving |
Отдельно стоит помнить про новые схемы 2025-2026: FP8 (нативно на Hopper/Ada и новее — почти без потерь, дефолт для serving свежих карт) и экспериментальные 2-битные квантизации, которые пока годятся скорее для гигантских MoE-моделей, где даже 2 бита оставляют разумное качество.
ПРАКТИКА: КВАНТИЗУЕМ САМИ
Самый воспроизводимый путь — GGUF через llama.cpp. Ниже реальный пайплайн: конвертация из HF-формата в FP16-GGUF и последующее сжатие в Q4_K_M.
# 1. Ставим llama.cpp
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
pip install -r requirements.txt
cmake -B build && cmake --build build --config Release -j
# 2. Скачиваем модель с Hugging Face (пример)
huggingface-cli download meta-llama/Llama-3.1-8B-Instruct \
--local-dir ./models/llama3-8b
# 3. Конвертируем HF -> GGUF (FP16, промежуточный эталон)
python convert_hf_to_gguf.py ./models/llama3-8b \
--outfile ./models/llama3-8b-f16.gguf \
--outtype f16
# 4. Квантизуем FP16 -> Q4_K_M (дефолт 2026)
./build/bin/llama-quantize \
./models/llama3-8b-f16.gguf \
./models/llama3-8b-Q4_K_M.gguf \
Q4_K_M
# 5. Проверяем: запускаем инференс
./build/bin/llama-cli \
-m ./models/llama3-8b-Q4_K_M.gguf \
-p "Объясни квантизацию одним предложением:" \
-n 128 -ngl 99 # -ngl = слоёв на GPU
Для AWQ на Python пайплайн другой — калибровка на реальных данных:
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model_path = "meta-llama/Llama-3.1-8B-Instruct"
quant_path = "./llama3-8b-awq"
model = AutoAWQForCausalLM.from_pretrained(model_path)
tokenizer = AutoTokenizer.from_pretrained(model_path)
# 4-битная квантизация, group_size=128 — стандарт
quant_config = {"w_bit": 4, "q_group_size": 128,
"zero_point": True, "version": "GEMM"}
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized(quant_path)
tokenizer.save_pretrained(quant_path)
# Дальше грузится напрямую в vLLM: --quantization awq
КАК ВЫБРАТЬ ФОРМАТ
- Запускаю дома / на Mac / без топовой видеокарты → GGUF, Q4_K_M. Не хватает памяти — спускайтесь до IQ3, хватает с запасом — берите Q5_K_M.
- Одна NVIDIA-карта, важна скорость одиночных ответов → GPTQ 4-бит на exllamav2 или тот же GGUF с полной выгрузкой в VRAM.
- Продакшен, много параллельных запросов, vLLM/TGI → AWQ 4-бит, либо FP8 если карта Hopper/Ada+.
- Нужен эталон качества для сравнения → держите FP16 или Q8_0 как reference и меряйте деградацию своих квантов на своих же промптах, а не только на публичных бенчмарках.
Главное правило 2026 года: не гоняйтесь за минимальными битами ради цифры. Разница между Q4_K_M и Q3 по памяти невелика, а по качеству — заметна. Готовые кванты под конкретное железо часто уже выложены — искать стоит в каталоге REDDYX, прежде чем квантизовать 8B-модель полдня самому.
Частые вопросы
Что лучше — GGUF или AWQ?
Зависит от железа. GGUF выбирают для локального запуска на CPU, смешанном GPU+RAM и Mac благодаря послойной выгрузке. AWQ — для чистого GPU-инференса в продакшене на vLLM, где важна пропускная способность при батчинге. По качеству на 4 битах оба близки.
Сколько качества теряется при 4-битной квантизации?
По замерам сообщества деградация на 4-битных схемах вроде Q4_K_M или AWQ обычно составляет около 1-3% на бенчмарках типа MMLU. Для большинства задач это незаметно в живом использовании. Сильная просадка начинается на 3 и особенно 2 битах.
Чем отличаются GPTQ и AWQ?
GPTQ минимизирует ошибку округления послойно через приближение гессиана. AWQ вместо этого находит примерно 1% критичных каналов по статистике активаций и защищает их масштабированием. AWQ обычно чуть устойчивее на инструктивных моделях и удобнее для serving.
Нужна ли видеокарта для запуска GGUF?
Нет. GGUF через llama.cpp работает и на голом CPU, просто медленнее. Видеокарта ускоряет генерацию: параметр -ngl задаёт, сколько слоёв выгрузить в VRAM. На Apple Silicon используется unified memory без отдельной GPU.
Форматы квантизации меняются быстрее, чем выходят сами модели: сегодня дефолт Q4_K_M и AWQ, завтра FP8 и 2-битные MoE. Чтобы не пропустить свежие кванты и инструменты для локального запуска, залетайте в Telegram-канал REDDYX AI — новые репозитории каждые 30-60 минут.