Квантизация моделей
| Цель | меньше памяти, выше скорость, ниже стоимость инференса |
|---|---|
| Форматы чисел | FP16, BF16, FP8, INT8, INT4, NF4 |
| Подходы | после обучения (PTQ), с учётом квантизации при обучении (QAT) |
| Методы для LLM | GPTQ, AWQ, bitsandbytes, k-квантизация GGUF |
| Инструменты | llama.cpp, bitsandbytes, AutoGPTQ, TensorRT, ONNX Runtime |
Квантизация (англ. quantization) — способ сжатия нейросетей, при котором веса, а иногда и промежуточные значения (активации), хранятся и обрабатываются в числах пониженной точности: вместо 16 или 32 бит на число — 8, 4 или даже меньше. Модель становится в несколько раз меньше и быстрее при умеренной потере качества. Благодаря квантизации большие языковые модели запускаются на одной видеокарте, ноутбуке или телефоне.[1]
Зачем
Размер модели в памяти ≈ число параметров × байт на параметр:
| Точность | Байт на параметр | Модель 8 млрд параметров | Модель 70 млрд |
|---|---|---|---|
| FP32 | 4 | ~32 ГБ | ~280 ГБ |
| BF16 / FP16 | 2 | ~16 ГБ | ~140 ГБ |
| INT8 / FP8 | 1 | ~8 ГБ | ~70 ГБ |
| 4 бита | ~0,5 | ~4,5 ГБ | ~40 ГБ |
При генерации текста скорость LLM ограничена в основном пропускной способностью памяти: на каждый токен нужно прочитать все веса. Поэтому сжатие весов вдвое почти вдвое ускоряет генерацию — помимо того, что модель вообще помещается в видеопамять.
Как это работает
Диапазон вещественных значений отображается на небольшое множество целых чисел с помощью масштаба (scale) и, возможно, сдвига (zero point):
$$q = \mathrm{round}(x / s) + z, \qquad \hat{x} = s \cdot (q - z)$$
Чем мельче группы, для которых подбирается свой масштаб (по тензору, по каналу, по блокам из 32–128 значений), тем точнее приближение и тем больше накладных расходов на хранение масштабов. Главная трудность — выбросы: в трансформерах отдельные признаки принимают значения в сотни раз больше остальных, и общий масштаб «съедает» точность для всех прочих.[2]
Подходы
- Квантизация после обучения (PTQ, post-training quantization) — модель квантуется готовой, обычно с небольшим калибровочным набором данных. Быстро и дёшево — основной вариант для LLM.
- Обучение с учётом квантизации (QAT, quantization-aware training) — округление имитируется во время обучения, и модель адаптируется к нему. Точнее, но требует ресурсов обучения; применяется для мобильных моделей и при агрессивном сжатии.
- Динамическая и статическая квантизация активаций — масштабы вычисляются на лету или заранее.[6]
Методы для LLM
- LLM.int8() (bitsandbytes) — 8-битное умножение с выделением выбросов в 16-битную часть.[2]
- GPTQ — послойная квантизация до 3–4 бит с компенсацией ошибки на основе приближённой информации второго порядка.[3]
- AWQ — защищает около 1% «важных» весов, выбранных по величине активаций.[4]
- NF4 и QLoRA — 4-битный формат, приспособленный к нормальному распределению весов; позволяет дообучать квантованную модель адаптерами LoRA (см. Fine-tuning и LoRA).[5]
- k-квантизация в GGUF — семейство форматов llama.cpp (
Q4_K_M,Q5_K_M,Q8_0и др.) со смешанной точностью разных слоёв; стандарт для локального запуска.[7] - FP8 и FP4 — аппаратная поддержка на новых GPU позволяет и обучать, и обслуживать модели в 8-битных и 4-битных форматах с плавающей точкой.
# llama.cpp: квантизовать модель до 4 бит
llama-quantize model-f16.gguf model-Q4_K_M.gguf Q4_K_M
# Transformers + bitsandbytes: загрузить модель сразу в 4 битах
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
cfg = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_quant_type="nf4")
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-8B", quantization_config=cfg)
Качество
Практическое правило для LLM: 8 бит почти неотличимы от исходной модели, 5–6 бит — потери едва заметны, 4 бита — разумный компромисс, ниже 3 бит качество падает заметно. Крупная модель в 4 битах обычно лучше маленькой модели той же памяти в 16 битах. Сильнее всего страдают точные задачи — математика, код, длинный контекст, — поэтому квантованную модель стоит проверять на своих задачах (см. Оценка LLM (evals)). Квантуют также KV-кэш, чтобы вместить более длинное контекстное окно.
См. также
Источники
- Hugging Face — Quantization overview
- Dettmers et al. — LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale (2022)
- Frantar et al. — GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers (2022)
- Lin et al. — AWQ: Activation-aware Weight Quantization (2023)
- Dettmers et al. — QLoRA: Efficient Finetuning of Quantized LLMs (2023)
- PyTorch — Quantization (torchao)
- llama.cpp — quantize tool