Квантизація 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" для малих batches
}
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 одночасних користувачів.
Вимоги: latency P95 < 3s, 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 днів







