Квантизация
Квантизация - это процесс преобразования весов LLM из чисел с плавающей точкой высокой точности (обычно 16-битный bfloat или float) в целые числа или числа с плавающей точкой более низкой точности (8-бит, 4-бит, иногда 2-бит), уменьшающий объём памяти и ускоряющий инференс лишь при небольшом ущербе качеству. Современное развёртывание с открытым исходным кодом - llama.cpp, Ollama, vLLM, GPTQ, AWQ - работает почти полностью на квантизированных моделях.
Квантизация - это процесс преобразования весов LLM из чисел с плавающей точкой высокой точности (обычно 16-битный bfloat или float) в целые числа или числа с плавающей точкой более низкой точности (8-бит, 4-бит, иногда 2-бит), уменьшающий объём памяти и ускоряющий инференс лишь при небольшом ущербе качеству. Современное развёртывание с открытым исходным кодом - llama.cpp, Ollama, vLLM, GPTQ, AWQ - работает почти полностью на квантизированных моделях.
Почему это важно
Модель на 70 млрд параметров в нативном 16-битном формате требует ~140 ГБ памяти GPU - вне досягаемости для одной потребительской карты. Та же модель в 4-битной квантизации занимает ~35 ГБ и помещается на двух потребительских GPU, или одной рабочей станции, или даже на Mac Studio. Квантизация - это то, что сделало локальные LLM практичными: Llama 3 70B, Mixtral 8×22B и DeepSeek-V3 все работают на оборудовании за 3000 долларов именно благодаря квантизации. Для разработчиков это разница между "мы не можем позволить себе self-hosting" и "мы можем обслуживать собственные модели".
Как это работает
Уровни точности:
- FP32 (32-битный float): По умолчанию при обучении. 4 байта на вес. Редко используется для инференса.
- FP16 / BF16 (16-бит): По умолчанию при инференсе. 2 байта на вес.
- INT8 (8-битное целое): Вдвое меньше памяти, почти идентичное качество.
- INT4 / FP4 (4-бит): Вчетверо меньше памяти, небольшой ущерб качеству (обычно 1-3% на бенчмарках).
- INT2 (2-бит): Память в восемь раз меньше, заметная потеря качества на большинстве задач.
Процесс квантизации:
- Калибровка: Модель прогоняется на небольшом наборе данных для наблюдения за диапазонами активаций.
- Расчёт масштаба и нулевой точки: Для каждого тензора весов вычисляются масштабирующие коэффициенты, отображающие исходный диапазон на целочисленный диапазон.
- Преобразование весов: Каждый вес квантизируется, сохраняется как целое число плюс масштабирующие коэффициенты по группам или по каналам.
- Деквантизация при инференсе: Во время вычислений веса разворачиваются обратно в числа с плавающей точкой прямо перед матричным умножением.
Методы квантизации
RTN (округление до ближайшего): Самый тупой метод. Просто округлить веса до ближайшего квантизированного значения. Быстро, низкое качество.
GPTQ: Погрупповая постобучающая квантизация, минимизирующая ошибку реконструкции. Стандарт с открытым исходным кодом для 4-бит.
AWQ (квантизация весов с учётом активаций): Сохраняет веса, обрабатывающие большие активации; остальные квантизирует более агрессивно. Очень популярна для 4-битных LLM.
GGUF (Q4_K_M, Q5_K_M и т. д.): Семейство форматов поблочной квантизации от llama.cpp. Варианты K_M балансируют размер и точность. Q4_K_M - формат локального инференса по умолчанию.
SmoothQuant: Переносит выбросы активаций в веса, чтобы и то и другое можно было квантизировать чисто. Позволяет INT8 без большой потери точности на крупных моделях.
QAT (обучение с учётом квантизации): Обучает модель с квантизацией в цикле. Лучшее качество, но требует переобучения.
FP8: Аппаратно нативный 8-битный формат float, поддерживаемый GPU H100/H200. Быстрее INT8 для обучения и инференса.
Компромиссы
Качество против сжатия: Чем ниже точность, тем сильнее деградирует модель. 8-бит почти бесплатно; 4-бит - хороший выбор по умолчанию; 2-бит ощутимо вредит.
Чувствительность к задаче: Математика, код и длинные рассуждения страдают от квантизации сильнее, чем чат или суммирование.
Скорость против памяти: Квантизация экономит память, но не всегда ускоряет инференс на GPU с избытком вычислительной мощности. На оборудовании, ограниченном памятью (потребительские GPU, Apple Silicon), это огромное ускорение.
Качество калибровочных данных: Плохая калибровка может незаметно испортить квантизированные модели. Используйте репрезентативные промпты.
Что и когда использовать
Запуск на потребительском GPU (8-24 ГБ): 4-битный GGUF (Q4_K_M) или AWQ.
Запуск на H100/H200: FP8 или INT8 со SmoothQuant.
Edge / мобильные устройства: Агрессивный 4-битный или 2-битный GGUF; примите потерю качества.
Исследовательский бенчмаркинг: Держите FP16/BF16 как эталон; квантизируйте только для сравнения при развёртывании.
Высокорисковый продакшн: 8-бит или 16-бит. Предельная стоимость стоит гарантии качества.
Распространённые ошибки
Сравнение бенчмарков между уровнями точности без оговорки: Оценка MMLU квантизированной модели не сравнима напрямую с оценкой FP16 той же модели.
Игнорирование дрейфа перплексии: Даже если бенчмарки выглядят нормально, квантизация может деградировать конкретные навыки (особенно математику). Тестируйте на своей реальной нагрузке.
Слишком агрессивно слишком быстро: Прыжок с FP16 сразу на INT2 без тестирования промежуточных шагов скрывает, где сломалось качество.
Использование устаревших калибровочных данных: Модель, откалиброванная только на английском, потеряет качество на корейских промптах.
Отсутствие измерения сквозной задержки: Квантизация влияет и на загрузку памяти, и на вычисления. Иногда пропускная способность не улучшается, потому что узкое место было в другом месте.
Источники: