Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

Квантизация моделей: 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 — это реальность уже сейчас.

3 Ответа

  1. AWQ с vLLM это сейчас де-факто стандарт для продакшн деплоя — throughput по сравнению с обычным HuggingFace инференсом отличается в несколько раз.

  1. IQ4_XS квантизация в GGUF реально лучше обычного Q4_K_M при том же размере файла, стоит попробовать если раньше не видели такой суффикс.

  1. Запускал Llama 3.1 70B в Q4_K_M на двух 3090 через llama.cpp с offloading — работает, около 8 токенов в секунду, для личных задач более чем достаточно.