Quantization

quantization — снижение точности чисел ради скорости и памяти

Раздел
Параметры
Обновлено
18.05.26

Quantization (квантизация) — техника снижения точности чисел в модели для экономии памяти и ускорения работы. Стандартные веса FP16 (16 бит) можно сжать до INT8 (8 бит) и даже FP4 (4 бита), уменьшив размер модели в 2–4 раза. Llama 70B в FP16 требует 140 ГБ VRAM, а в Q4 — всего 40 ГБ и запускается на одной RTX 4090. Цена — небольшая потеря качества, на нижних битах заметная.

Коротко

Коротко. Quantization — сжатие весов модели за счёт точности чисел. Вместо 16-битного FP16 хранят 8-битный INT8 или даже 4-битный FP4. Модель в Q4 занимает в 4 раза меньше памяти и работает в 2–3 раза быстрее. Качество немного падает, но обычно незаметно для конечного пользователя. Главный сценарий — запуск больших LLM (70B+) на одной потребительской видеокарте.

Что это такое

Llama 3 70B в полной точности — это 140 ГБ файл. Чтобы загрузить его, нужно два сервера A100 по 80 ГБ. Доступно примерно никому.

А ту же модель в формате Q4_K_M (4 бита на параметр, с улучшениями) — 40 ГБ. Помещается в одну RTX 4090 (24 ГБ VRAM) с offload части слоёв в RAM. И отвечает почти так же, как полная.

Квантизация — это и есть переход от «дорогих» FP16-чисел к «дешёвым» INT8/FP8/FP4. Главная идея: точность весов нейросети на самом деле не нужна вся целиком. Большинство значений лежат в узком диапазоне, и их можно записать меньшим количеством бит без существенной потери.

К 2026-му квантизация используется везде:

  • LLM: GGUF-формат с уровнями Q2–Q8, Llama-Cpp, Ollama, LM Studio.
  • Stable Diffusion: FP8-checkpoints в ComfyUI, NF4-варианты для FLUX.
  • Облачный инференс: TensorRT-LLM, vLLM используют INT8/FP8 по умолчанию.

Как это работает

Каждый вес модели — это число с плавающей запятой. В FP16 на один параметр уходит 2 байта (16 бит). В INT8 — 1 байт. В FP4 — полбайта.

Простейшая квантизация INT8:

  1. Найти диапазон значений — например, веса слоя лежат от -0.95 до +1.03.
  2. Поделить на 256 равных уровней (8 бит = 256 значений).
  3. Каждый вес заменить ближайшим уровнем.
  4. Сохранить scale — коэффициент, по которому потом восстанавливать.

В момент инференса:

real_weight = quantized_weight × scale

Этот пересчёт делается на лету и работает быстрее, чем хранение полной точности.

Уровни в GGUF (формат для llama.cpp):

  • Q8_0 — 8 бит, потеря качества <0.1%, размер в 2 раза меньше FP16.
  • Q6_K — 6 бит, потеря ~0.3%, ×2.7.
  • Q5_K_M — 5 бит, потеря ~0.8%, ×3.2.
  • Q4_K_M — 4 бита, потеря ~2%, ×4. Самый популярный.
  • Q3_K_M — 3 бита, потеря ~5%, ×5.3.
  • Q2_K — 2 бита, потеря 10%+, ×6.5. Только для очень больших моделей.

Пример на практике

Видеомонтажёр хочет запустить локально LLM для написания YouTube-описаний. Бюджет железа — RTX 4070 12 ГБ VRAM. Выбирает между моделями:

Вариант 1: Llama 3 8B FP16. Размер 16 ГБ — не помещается, нужна квантизация.

Вариант 2: Llama 3 8B Q5_K_M. Размер 5,7 ГБ. Запускается с большим контекстом, быстро.

Вариант 3: Llama 3 70B Q4_K_M. Размер 42 ГБ. Часть на VRAM, часть на RAM (offload). Скорость — 2–4 токена в секунду, медленно, но качество выше 8B-модели.

Скачивает llama-3.1-70b-instruct-Q4_K_M.gguf с Hugging Face. Кладёт в LM Studio. Запускает с настройкой n_gpu_layers: 40 (40 слоёв в VRAM, остальные в RAM).

Первый ответ — 12 секунд. Дальше идёт стабильно ~3 токена в секунду. Не быстро, но качество ответов сильно лучше, чем у любой 8B-модели. Для написания YouTube-описаний скорость подходит.

Для Stable Diffusion: FP16 — стандарт, FP8 — у FLUX и SDXL.lightning экономит 50% VRAM и почти не теряет качество. NF4 для FLUX (4 бита) запускает модель на видеокартах с 6 ГБ — недостижимо без квантизации.

С чем часто путают

  • Quantization и Pruning — pruning удаляет «ненужные» веса целиком (часто 30–50% становятся нулями). Quantization сохраняет все веса, но в меньшей точности. Это разные техники.
  • Quantization и Compression — общее сжатие (gzip) уменьшает файл без потери данных, но при загрузке всё разворачивается обратно. Quantization меняет сами числа.
  • Quantization и Distillation — distillation это тренировка меньшей модели «учиться у» большой. Quantization не тренирует, просто сжимает.
  • GGUF Q4 и LoRA — это разные слои оптимизации. LoRA можно ставить поверх квантизованной модели (например, Llama-3 Q4 + LoRA).
  • INT8 и FP8 — у INT8 равномерные уровни (целые числа). У FP8 неравномерные (как у FP16/FP32, с порядком величины). FP8 точнее для нейросетей, но требует поддержки от GPU.

Частые ошибки и заблуждения

  • «Q4-модель — это полная модель, которая просто меньше». Не совсем. Это та же модель с округлёнными весами. Качество чуть хуже, на сложных задачах разница заметна.
  • «Чем меньше бит, тем лучше — главное помещается». До определённого предела. Ниже Q3 для маленьких моделей (<13B) качество падает сильно, иногда катастрофически.
  • «Квантизация навсегда — обратно не восстановить». Верно. Когда веса упакованы в 4 бита, исходная точность потеряна. Поэтому всегда сохраняйте FP16-исходник, если планируете тренировать дальше.
  • «Все Q4 одинаковые». Нет. Q4_0, Q4_K_S, Q4_K_M, Q4_K_L, IQ4_XS, AWQ-4 — это разные методы. K_M-варианты обычно лучшие по качеству, IQ-варианты лучшие по сжатию.
  • «Квантизованная модель медленнее». Часто наоборот быстрее: меньше байт читается из памяти. На современных GPU INT8 умножение в 2 раза быстрее FP16.

Связанные термины

  • GGUF — формат для квантизованных LLM, главный носитель квантизации.
  • FP16 / BF16 / FP8 — форматы полной и частичной точности.
  • VRAM — главный ресурс, который экономит quantization.
  • Llama.cpp / Ollama / LM Studio — главные инструменты запуска квантизованных моделей локально.
  • Safetensors — формат, в котором также бывают квантизованные веса.
  • Distillation — альтернативный путь уменьшения модели через тренировку.
  • Pruning — другой способ ужать модель, удалением весов.

Частые вопросы

Какая квантизация лучше для домашнего ПК? Для большинства задач — Q4_K_M или Q5_K_M в формате GGUF. Q4 балансирует размер и качество, Q5 чуть качественнее за ~25% больше памяти.

Сколько RAM/VRAM нужно для Q4 70B-модели? ~42 ГБ. На RTX 4090 (24 ГБ) поместится примерно половина слоёв; остальные в системной RAM. Нужно минимум 32 ГБ системной RAM.

Можно ли квантизовать модель самому? Да. Для LLM: llama.cpp имеет утилиту quantize. Для Stable Diffusion: ComfyUI и kohya-ss поддерживают конвертацию в FP8. Занимает 10–30 минут на CPU.

Что такое «динамическая квантизация»? Веса хранятся в Q4/Q8, но активации (промежуточные значения внутри слоёв) считаются в FP16/FP32. Это компромисс: быстрая загрузка + точное вычисление.

Квантизация ломает мультимодальные модели? Сильно меньше, чем чисто текстовые. Vision-encoder и cross-attention часто оставляют в FP16, квантизуют только text-decoder. Это типичная схема в Llama-3.2-Vision Q4.

Влияет ли квантизация на ComfyUI-workflow? Да. FP8-чекпоинты грузятся в ~2 раза быстрее, занимают вдвое меньше VRAM. Negative prompt и CFG работают так же. Иногда нужно ставить отдельную FP8-ноду в workflow.

Главное

Quantization — это способ запустить большую модель на маленьком железе. Сжимает веса до 4–8 бит вместо 16, что даёт ×2–×4 экономии памяти и ×1.5–3 ускорения. Стандарт для локальных LLM (GGUF Q4_K_M), всё чаще встречается и в Stable Diffusion (FP8, NF4). Качество падает мало — обычно 1–3% на стандартных тестах. Главная оговорка: если планируете тренировать модель дальше, исходную FP16-версию нужно сохранить — обратной дороги нет.