Квантизация LLM (INT8/INT4/GPTQ/AWQ/GGUF) для оптимизации
Квантизация — снижение точности представления весов модели (с fp32 или bf16 до INT8, INT4, INT3 и ниже). Это уменьшает размер модели и ускоряет инференс при незначительной потере качества. Для LLM квантизация — ключевой инструмент деплоя на ограниченном железе.
Форматы квантизации: сравнительная таблица
| Формат | Точность | Сжатие (vs fp16) | Качество | Применение |
|---|---|---|---|---|
| fp16 | 16-bit float | 1× | Baseline | GPU inference |
| INT8 (bitsandbytes) | 8-bit int | 2× | -0.5–1% | GPU, легко |
| GPTQ INT4 | 4-bit group-quant | 4× | -1–2% | GPU, production |
| AWQ INT4 | 4-bit activation-aware | 4× | -0.5–1.5% | GPU, лучше GPTQ |
| GGUF Q4_K_M | 4-bit mixed | 4× | -1–2% | CPU/GPU llama.cpp |
| GGUF Q8_0 | 8-bit | 2× | -0.3–0.5% | CPU/GPU llama.cpp |
| GGUF Q2_K | 2-bit | 8× | -5–10% | Крайний случай |
| EXL2 | 2–8 bit mixed | 2–8× | Configurable | GPU, ExLlamaV2 |
GPTQ: Post-Training Quantization с коррекцией ошибок
GPTQ квантизирует послойно, минимизируя ошибку на небольшом calibration датасете:
from transformers import AutoModelForCausalLM, GPTQConfig
gptq_config = GPTQConfig(
bits=4,
dataset="c4", # Calibration dataset
desc_act=True, # Лучше для perplexity
group_size=128, # Размер группы квантизации
damp_percent=0.1,
)
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/Meta-Llama-3.1-8B-Instruct",
quantization_config=gptq_config,
device_map="auto"
)
model.save_pretrained("./llama3-8b-gptq-int4")
Calibration занимает 30–120 минут на CPU или GPU в зависимости от размера модели.
AWQ: Activation-Aware Weight Quantization
AWQ определяет «важные» веса по активациям и защищает их от агрессивной квантизации:
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model = AutoAWQForCausalLM.from_pretrained("meta-llama/Meta-Llama-3.1-8B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3.1-8B-Instruct")
quant_config = {
"zero_point": True,
"q_group_size": 128,
"w_bit": 4,
"version": "GEMM" # или "GEMV" для малых batch
}
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized("./llama3-8b-awq")
AWQ обычно даёт лучшее качество, чем GPTQ при той же битности, особенно на задачах reasoning.
GGUF: универсальный формат для llama.cpp
GGUF (GGML Universal Format) — формат для деплоя через llama.cpp, поддерживающий CPU-инференс и partial GPU offloading:
# Конвертация HuggingFace модели в GGUF
python convert_hf_to_gguf.py \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--outtype f16 \
--outfile llama3-8b-f16.gguf
# Квантизация в Q4_K_M (рекомендуемый баланс)
./quantize llama3-8b-f16.gguf llama3-8b-q4km.gguf Q4_K_M
Варианты квантизации GGUF (от лучшего качества к меньшему размеру):
- Q8_0: 8-bit, ~8.5GB для 8B модели, отличное качество
- Q6_K: 6-bit, ~6.1GB, высокое качество
- Q5_K_M: 5-bit mixed, ~5.1GB, хорошее качество
- Q4_K_M: 4-bit mixed, ~4.1GB, рекомендуется для большинства задач
- Q3_K_M: 3-bit, ~3.2GB, заметная деградация
Практический пример: выбор формата для on-premise деплоя
Задача: деплой fine-tuned Llama 3.1 8B на сервере с 2×RTX 3090 (48GB VRAM суммарно) для 50 concurrent users.
Требования: latency P95 < 3с, throughput > 100 tok/s.
| Формат | VRAM | Throughput (vLLM) | Latency P95 | Качество (оценка) |
|---|---|---|---|---|
| bf16 | 16 GB | 180 tok/s | 1.8с | 100% |
| AWQ INT4 | 5 GB | 280 tok/s | 1.2с | 98.5% |
| GPTQ INT4 | 5 GB | 260 tok/s | 1.3с | 98% |
| GGUF Q4_K_M | 4.1 GB (CPU) | 40 tok/s | 8с | 98% |
Выбор: AWQ INT4 — умещается в одну 3090 24GB с резервом, throughput 280 tok/s перекрывает требование, качество минимально деградирует.
Инференс квантизованной модели через vLLM
from vllm import LLM, SamplingParams
# AWQ модель
llm = LLM(
model="./llama3-8b-awq",
quantization="awq",
dtype="auto",
gpu_memory_utilization=0.85,
)
# GPTQ модель
llm = LLM(
model="./llama3-8b-gptq-int4",
quantization="gptq",
dtype="auto",
)
outputs = llm.generate(["Привет, как дела?"], SamplingParams(max_tokens=200))
Сроки квантизации
- GPTQ/AWQ квантизация 8B модели: 1–3 часа
- GPTQ/AWQ квантизация 70B модели: 6–18 часов
- GGUF конвертация: 15–60 минут
- Тестирование и выбор оптимального формата: 1–3 дня
- Итого: 2–5 дней







