Přeskočit na obsah
_CORE
AI & Agentic Systems Core Informační Systémy Cloud & Platform Engineering Data Platforma & Integrace Security & Compliance QA, Testing & Observability IoT, Automatizace & Robotika Mobile & Digital Banky & Finance Pojišťovnictví Veřejná správa Obrana & Bezpečnost Zdravotnictví Energetika & Utility Telco & Média Průmysl & Výroba Logistika & E-commerce Retail & Loyalty
Reference Technologie Blog Knowledge Base O nás Spolupráce Kariéra
Pojďme to probrat

Quantizace modelů — GPTQ, GGUF, AWQ

01. 01. 2024 4 min čtení intermediate

Kvantizace je klíčová technika pro zpřístupnění velkých jazykových modelů širší veřejnosti. Umožňuje výrazně snížit paměťové nároky modelů při zachování jejich výkonu pomocí metod jako GPTQ, GGUF nebo AWQ.

Co je quantizace modelů

Quantizace je technika redukce velikosti neural networks pomocí snížení přesnosti datových typů. Místo standardních 32-bitových float hodnot používáme 16-bit, 8-bit nebo dokonce 4-bitové reprezentace. Výsledkem je dramatické snížení paměťových nároků a zrychlení inference, často s minimální ztrátou kvality.

Pro jazykové modely typu GPT je quantizace klíčová - model o velikosti 70B parametrů zabírá v FP16 přibližně 140 GB paměti. Po quantizaci na 4-bit klesne na ~35 GB, což umožní běh na spotřebitelském hardware.

GPTQ: Post-training quantizace s kalibrací

GPTQ (GPT Quantization) je pokročilá metoda post-training quantizace zaměřená na minimalizaci chyb při kompresi. Používá malý calibration dataset k optimalizaci quantizačních parametrů pro každou vrstvu.

Princip fungování GPTQ

GPTQ řeší optimalizační problém pro každou vrstvu nezávisle. Pro matici vah W hledá quantizovanou verzi Q(W), která minimalizuje Frobenius normu rozdílu:

min ||WX - Q(W)X||²_F

Algoritmus postupuje po blocích a využívá Hessian matici pro lepší aproximaci chyby quantizace.

Implementace GPTQ

Pro quantizaci pomocí GPTQ můžeme použít knihovnu AutoGPTQ:

from transformers import AutoModelForCausalLM, AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig

# Načtení původního modelu
model_name = "microsoft/DialoGPT-medium"
tokenizer = AutoTokenizer.from_pretrained(model_name)

# Konfigurace quantizace
quantize_config = BaseQuantizeConfig(
    bits=4,  # 4-bit quantizace
    group_size=128,
    desc_act=False,
)

# Quantizace modelu
model = AutoGPTQForCausalLM.from_pretrained(
    model_name,
    quantize_config=quantize_config,
    device="cuda:0"
)

# Příprava calibration dat
calibration_data = [
    "The quick brown fox jumps over the lazy dog.",
    "Machine learning is transforming technology.",
    # další calibrační věty...
]

# Spuštění quantizace
model.quantize(calibration_data)

# Uložení quantizovaného modelu
model.save_quantized("./quantized_model")

Výhody a nevýhody GPTQ

Výhody:

  • Vysoká kvalita quantizace díky calibraci
  • Podpora různých bit-widths (2, 3, 4, 8 bit)
  • Optimalizace pro GPU inference

Nevýhody:

  • Pomalý quantizační proces
  • Vyžaduje calibrační data
  • Primárně pro NVIDIA GPU

GGUF: Univerzální formát pro CPU inference

GGUF (GPT-Generated Unified Format) je nový binární formát vyvinutý týmem llama.cpp. Nahradil starší formáty GGML a je optimalizovaný pro efektivní načítání a CPU inference.

Struktura GGUF formátu

GGUF obsahuje metadata, tensor informace a samotná data v jednom souboru. Podporuje různé quantizační schémata označovaná jako Q4_0, Q5_1, Q8_0 atd., kde číslo označuje počet bitů a písmeno variantu algoritmu.

# Konverze modelu do GGUF formátu
python convert.py --outfile model.gguf \
                  --outtype q4_0 \
                  ./original_model/

# Běh s llama.cpp
./main -m model.gguf \
       -n 128 \
       -p "Explain quantum computing:" \
       -t 8  # počet vláken

Práce s GGUF v Pythonu

Pro práci s GGUF modely můžeme použít llama-cpp-python wrapper:

from llama_cpp import Llama

# Načtení GGUF modelu
llm = Llama(
    model_path="./model.gguf",
    n_ctx=2048,  # context window
    n_threads=8,  # CPU vlákna
    verbose=False
)

# Generování textu
output = llm(
    "Explain the concept of quantization:",
    max_tokens=256,
    temperature=0.7,
    top_p=0.9
)

print(output['choices'][0]['text'])

Quantizační varianty GGUF

  • Q4_0: 4-bit quantizace, nejrychlejší, mírná ztráta kvality
  • Q5_1: 5-bit, lepší kvalita než Q4_0
  • Q8_0: 8-bit, minimální ztráta kvality
  • Q4_K_M: Mixed precision, optimální poměr rychlost/kvalita

AWQ: Activation-aware Weight Quantization

AWQ je relativně nová metoda, která při quantizaci zohledňuje důležitost jednotlivých weights na základě aktivačních vzorů. Místo uniformní quantizace všech vah chrání důležité kanály před degradací.

Klíčové principy AWQ

AWQ identifikuje “salient channels” - kanály s vysokou variancí aktivací, které mají největší vliv na výstup modelu. Tyto kanály jsou buď kvantizovány s vyšší přesností, nebo zůstávají v původní precision.

from awq import AutoAWQForCausalLM
from transformers import AutoTokenizer

model_name = "mistralai/Mistral-7B-v0.1"
quant_path = "mistral-7b-awq"

# Načtení modelu a tokenizeru
model = AutoAWQForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# AWQ quantizace
model.quantize(tokenizer, quant_config={
    "zero_point": True,
    "q_group_size": 128,
    "w_bit": 4,
    "version": "GEMM"
})

# Uložení quantizovaného modelu
model.save_quantized(quant_path)

# Načtení a použití
quantized_model = AutoAWQForCausalLM.from_quantized(
    quant_path, 
    device="cuda:0"
)

Porovnání metod

Metoda Rychlost quantizace Kvalita Ideální použití
GPTQ Pomalá Vysoká GPU inference, produkce
GGUF Rychlá Střední-vysoká CPU inference, edge zařízení
AWQ Střední Velmi vysoká GPU inference, nejlepší kvalita

Praktické tipy pro výběr metody

Při výběru quantizační metody zvažte následující faktory:

  • Hardware: GGUF pro CPU, GPTQ/AWQ pro GPU
  • Latence: GGUF nejrychlejší startup, AWQ nejrychlejší inference na GPU
  • Paměť: Všechny metody dramaticky snižují paměťové nároky
  • Kvalita: AWQ > GPTQ > GGUF (obecně)

Pro vývojáře doporučuji experimentovat s různými bit-width kombinacemi. 4-bit quantizace obvykle poskytuje nejlepší poměr komprese/kvality, zatímco 8-bit zachová téměř původní výkon.

Shrnutí

Quantizace je nezbytná technika pro deployment velkých jazykových modelů na běžném hardware. GPTQ nabízí skvělou kvalitu pro GPU aplikace, GGUF je ideální pro CPU inference a experimentování, zatímco AWQ představuje současný state-of-the-art v quality preservation. Volba správné metody závisí na konkrétních požadavcích aplikace, dostupném hardware a toleranci ke kompromisům mezi rychlostí a kvalitou.

quantizacegptqgguf