Квантизация LLM (INT8/INT4/GPTQ/AWQ/GGUF) для оптимизации

Проектируем и внедряем системы искусственного интеллекта: от прототипа до production-ready решения. Наша команда объединяет экспертизу в машинном обучении, дата-инжиниринге и MLOps, чтобы AI работал не в лаборатории, а в реальном бизнесе.
Показано 1 из 1 услугВсе 1566 услуг
Квантизация LLM (INT8/INT4/GPTQ/AWQ/GGUF) для оптимизации
Средняя
от 1 рабочего дня до 3 рабочих дней
Часто задаваемые вопросы
Направления AI-разработки
Этапы разработки AI-решения
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1218
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1161
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    853
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1047
  • image_logo-advance_0.png
    Разработка логотипа компании B2B Advance
    561
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    825

Квантизация LLM (INT8/INT4/GPTQ/AWQ/GGUF) для оптимизации

Квантизация — снижение точности представления весов модели (с fp32 или bf16 до INT8, INT4, INT3 и ниже). Это уменьшает размер модели и ускоряет инференс при незначительной потере качества. Для LLM квантизация — ключевой инструмент деплоя на ограниченном железе.

Форматы квантизации: сравнительная таблица

Формат Точность Сжатие (vs fp16) Качество Применение
fp16 16-bit float Baseline GPU inference
INT8 (bitsandbytes) 8-bit int -0.5–1% GPU, легко
GPTQ INT4 4-bit group-quant -1–2% GPU, production
AWQ INT4 4-bit activation-aware -0.5–1.5% GPU, лучше GPTQ
GGUF Q4_K_M 4-bit mixed -1–2% CPU/GPU llama.cpp
GGUF Q8_0 8-bit -0.3–0.5% CPU/GPU llama.cpp
GGUF Q2_K 2-bit -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 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 дней