Квантизация моделей: GPTQ, AWQ, GGUF на практике
Квантизация моделей: GPTQ, AWQ, GGUF на практике
Llama 3.1 70B в полной точности (fp16) занимает около 140 ГБ VRAM — два A100 80GB впритык. После квантизации до 4 бит тот же самый 70B поместится в 40 ГБ, а качество просядет совсем немного. Квантизация — это искусство делать большие модели доступными без значительной потери качества. Разберём три главных формата: GPTQ, AWQ и GGUF.
Что такое квантизация
Нейронная сеть — это миллиарды чисел с плавающей точкой (веса). В обучении используют fp32 или bf16 (16 бит на число). Квантизация снижает точность до 8, 4 или даже 2 бит на вес. Модель занимает меньше памяти, инференс быстрее, но появляются ошибки округления — качество немного падает.
Ключевой вопрос: как именно квантизировать, чтобы потерять как можно меньше качества.
GGUF: формат для CPU-инференса
GGUF (преемник GGML) — формат разработанный для библиотеки llama.cpp. Его главная особенность: модель можно запускать на CPU, а если GPU есть — выгрузить часть слоёв на него. Это позволяет запускать большие модели на машинах с небольшим количеством VRAM.
# Ollama использует GGUF под капотом
ollama run llama3.1:70b-instruct-q4_K_M
# Или напрямую через llama.cpp
./llama-cli
-m ./models/llama-3.1-70b-instruct-q4_K_M.gguf
-ngl 35 # кол-во слоёв на GPU
--temp 0.7
-p "Объясни квантизацию простыми словами"
Суффиксы в названии GGUF файлов:
Q4_K_M— 4-битная квантизация, средний размер K-quant (хороший баланс)Q5_K_M— 5 бит, лучше качество, больше размерQ8_0— 8 бит, почти как fp16, но вдвое меньше памятиIQ4_XS— улучшённые importance quants, лучший результат на 4 битах
GPTQ: GPU-квантизация с калибровкой
GPTQ (Generalization Post-Training Quantization) использует небольшой калибровочный датасет для умной квантизации: веса которые сильнее влияют на выход сохраняются точнее.
pip install auto-gptq transformers
from auto_gptq import AutoGPTQForCausalLM
from transformers import AutoTokenizer
# Загрузить уже квантизированную модель с HuggingFace
model = AutoGPTQForCausalLM.from_quantized(
"TheBloke/Llama-2-13B-GPTQ",
device="cuda:0",
use_triton=True,
)
tokenizer = AutoTokenizer.from_pretrained("TheBloke/Llama-2-13B-GPTQ")
# Квантизировать самостоятельно
from auto_gptq import BaseQuantizeConfig
quantize_config = BaseQuantizeConfig(bits=4, group_size=128)
model = AutoGPTQForCausalLM.from_pretrained(
"meta-llama/Llama-2-13b-hf",
quantize_config=quantize_config
)
model.quantize(calibration_dataset)
model.save_quantized("./llama-13b-gptq-4bit")
AWQ: лучшее качество на 4 битах
AWQ (Activation-Aware Weight Quantization) — более новый метод. Вместо равномерной квантизации он анализирует активации и защищает наиболее важные 1% весов от потери точности. Результат: при том же размере качество выше чем у GPTQ.
pip install autoawq
from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer
model = AutoAWQForCausalLM.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen2.5-7B-Instruct")
quant_config = {"zero_point": True, "q_group_size": 128, "w_bit": 4, "version": "GEMM"}
model.quantize(tokenizer, quant_config=quant_config)
model.save_quantized("./qwen2.5-7b-awq-4bit")
Практическое сравнение
| Формат | Железо | Сложность | Качество (4-bit) |
|---|---|---|---|
| GGUF Q4_K_M | CPU + GPU | Минимальная | Хорошее |
| GPTQ 4-bit | GPU | Средняя | Хорошее |
| AWQ 4-bit | GPU | Средняя | Лучшее |
Как выбрать
- Нет мощного GPU / нужен CPU: GGUF — единственный разумный выбор
- Есть GPU, нужна лучшая производительность инференса: AWQ с vLLM
- Хотите развернуть через HuggingFace Transformers: GPTQ или AWQ, оба хорошо поддерживаются
- Продакшн с высокой нагрузкой: vLLM поддерживает AWQ и GPTQ, даёт батчинг и максимальный throughput
Квантизация сделала LLM доступными для обычного железа. 70B модель на двух потребительских GPU — это реальность уже сейчас.
AWQ с vLLM это сейчас де-факто стандарт для продакшн деплоя — throughput по сравнению с обычным HuggingFace инференсом отличается в несколько раз.