Квантизация (quantization) — это уменьшение разрядности весов и/или активаций нейросети, чтобы модель занимала меньше памяти и могла выполнять вывод с более простыми вычислениями. В базовой схеме это приближает исходные представления к низкоразрядным и может привести к integer-only inference, где вычисления выполняются целыми числами.
Английский термин: quantization. Также встречается: post-training quantization (PTQ, пост-тренировочная квантизация), quantization-aware training (QAT, квантизация с учетом обучения), dynamic quantization, static quantization; в практических обсуждениях еще говорят «понижение битности модели».
Простыми словами
Грубо говоря, квантизация похожа на сжатие изображения: деталей может стать чуть меньше, зато файл легче хранить и быстрее передавать. Для модели это означает, что числа внутри нее представляются менее точно, но в обмен вы получаете более компактную и часто более удобную для вывода версию.
Важно не путать удобную аналогию с точным описанием. Квантизация не «удаляет половину модели», а меняет способ представления чисел в весах и иногда в активациях, поэтому главный вопрос всегда один: насколько просело качество по сравнению с исходной float-моделью.
Как это работает
В классической постановке, описанной в работе про efficient integer-arithmetic-only inference, веса и активации переводятся в более низкую разрядность, а вычисления выполняются в целочисленной арифметике. Современные фреймворки реализуют это по-разному, но общая последовательность одинакова.
Исходная модель высокой точности
↓
Выбор режима: PTQ после обучения или QAT во время обучения
↓
Квантизация весов и, при необходимости, активаций
↓
Запуск вывода в квантованном runtime
↓
Сравнение с baseline-моделью по метрикам качества
- Шаг 1. Вы выбираете, что именно квантизировать: только веса или веса вместе с активациями.
- Шаг 2. Выбираете момент применения. PTQ выполняется после обучения; QAT имитирует поведение inference-time quantization уже во время обучения.
- Шаг 3. Подбираете инструмент под стек. В актуальной документации PyTorch разработка квантизации централизуется в
torchao, где основной вход —quantize_. В TensorFlow post-training quantization запускается на этапе конвертации в TensorFlow Lite. В ONNX Runtime доступны APIquantize_dynamic()иquantize_static(). - Шаг 4. Проверяете, насколько квантованная модель отличается от исходной. В документации PyTorch для этого отдельно предложены SQNR, normalized L2 error и cosine similarity.
Практически это означает следующее: квантизация — не один алгоритм, а семейство режимов, где вы балансируете размер, удобство деплоя и приемлемую потерю точности.
Где применяется
- PyTorch inference и QAT. Если вы работаете в экосистеме PyTorch, по состоянию на 2026-08-16 официальный вектор развития —
torchao; legacy-потоки quantization из старой документации мигрируют туда. - TensorFlow Lite для мобильного и edge-деплоя. Post-training quantization включается при конвертации в TFLite через
converter.optimizations = [tf.lite.Optimize.DEFAULT]. Если нужен full integer quantization, официальный гайд требует representative dataset. - ONNX Runtime для трансформеров и RNN. Официальная документация рекомендует начинать с
quantize_dynamic()для RNN и transformer-моделей. - ONNX Runtime для CNN. Для сверточных сетей официально рекомендуют
quantize_static(), если модель и pipeline это поддерживают.
Общий паттерн одинаковый: квантизация особенно полезна там, где важны память, размер артефакта и предсказуемый inference-процесс. Но фактический выигрыш зависит от backend-а и аппаратной поддержки, поэтому официальные источники везде оставляют место для проверки на вашей модели.
Практический пример
Самый безопасный сценарий для уже обученной модели — начать с пост-тренировочной квантизации, а не сразу перестраивать обучение.
- Определите runtime. Если вы целитесь в TensorFlow Lite, используйте PTQ на этапе конвертации. Если модель уже экспортирована в ONNX, выбирайте API ONNX Runtime.
- Для TensorFlow Lite включите оптимизацию конвертера. Базовый официальный переключатель выглядит так:
converter.optimizations = [tf.lite.Optimize.DEFAULT]
- Если нужен full integer quantization, подготовьте representative dataset. Без него официальный процесс PTQ для full-integer режима не завершает калибровку так, как ожидает документация.
- Для ONNX выберите режим по типу модели. Для transformer/RNN начните с
quantize_dynamic(); для CNN — сquantize_static(). - Если качество упало слишком сильно, переходите к QAT. В TensorFlow QAT имитирует inference-time quantization. В PyTorch актуальные workflows описаны уже в
torchao. - Сравните результат с baseline. Используйте вашу валидацию, а в PyTorch при необходимости дополнительно смотрите SQNR, normalized L2 error и cosine similarity.
Практический вывод редакции: если вы внедряете квантизацию впервые, начните с PTQ, затем проверьте качество на своей валидационной выборке, и только потом переходите к QAT или к более специализированным форматам.
Чем отличается от…
| Термин | Что означает | Когда применяется | Что важно помнить |
|---|---|---|---|
| Квантизация | Общий класс методов снижения разрядности весов и/или активаций | Когда нужно уменьшить память и упростить вывод | Это зонтичный термин, а не один конкретный алгоритм |
| PTQ | Post-training quantization после завершения обучения | Когда модель уже обучена и нужен быстрый путь к компактному inference | В TensorFlow Lite full integer quantization требует representative dataset |
| QAT | Quantization-aware training, то есть имитация квантизации во время обучения | Когда PTQ дает слишком большую деградацию качества | Поддержка зависит от слоев, backend-ов и фреймворка |
Dynamic vs static quantization
- Dynamic quantization в ONNX Runtime вызывается через
quantize_dynamic()и официально рекомендуется для RNN и transformer-моделей. - Static quantization вызывается через
quantize_static()и официально рекомендуется для CNN. - Для обоих режимов ONNX Runtime требует модель с opset >= 10.
Отдельно не путайте общую квантизацию с форматами и упаковками для LLM. Если вам нужны именно форматы распространения моделей, смотрите материалы про GGUF, GPTQ и AWQ — это соседняя тема, а не синоним слова «квантизация».
Ограничения и заблуждения
- Заблуждение: «квантизация всегда ускоряет модель». Официальные документы описывают ее как способ уменьшить размер и упростить inference, но реальный выигрыш зависит от аппаратного backend-а и поддержки рантайма.
- Заблуждение: «достаточно одного переключателя». На практике TensorFlow Lite может потребовать representative dataset, ONNX Runtime — preprocessing и debugging, а в PyTorch нужно учитывать миграцию API в
torchao. - Заблуждение: «QAT — это то же самое, что обычное дообучение». По официальному описанию TensorFlow, QAT именно имитирует поведение inference-time quantization в процессе обучения.
- Ограничение TensorFlow. В документации QAT явно указаны ограничения по слоям, backend-совместимости, а также поддержка для Keras Sequential/Functional моделей и eager execution.
- Ограничение ONNX Runtime. Для int4 официальная документация требует
opset21, а для некоторых сценариев — ONNX Runtime 1.20. - Ограничение PyTorch. Страница quantization в PyTorch прямо предупреждает, что legacy eager, FX graph mode и PT2E-потоки мигрируют в
torchao, поэтому старые инструкции могут устаревать быстрее, чем статьи в блогах.
Редакционное ограничение: в этом обзоре нет универсальных цифр ускорения, экономии памяти или потери качества, потому что в supplied source pack таких переносимых чисел нет, а официальные источники подчеркивают зависимость от модели, слоя, backend-а и набора данных. Практический критерий один: проверяйте квантованную модель на своей валидации.
Связанные термины и материалы
- Функция активации — чтобы не путать сами активации с их квантованным представлением.
- Валидация (Validation) — как корректно сравнивать baseline и квантованную модель.
- Валидационная выборка — на чем проверять, насколько квантизация ухудшила или сохранила качество.
- Форматы квантизации: GGUF, GPTQ, AWQ — если вы работаете уже не с общим принципом, а с конкретными форматами LLM.
- Квантизация GPTQ vs AWQ: что выбрать — прикладное сравнение двух популярных подходов.
Источники
- First Quantization Example — torchao 0.17 documentation
- Quantized Inference — torchao 0.17 documentation
- Quantization-Aware Training (QAT) — torchao 0.17 documentation
- GitHub – pytorch/ao
- Releases · pytorch/ao
- GitHub – microsoft/onnxruntime
- Releases · microsoft/onnxruntime
- Versioning.md · microsoft/onnxruntime
- Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference
- Quantization — PyTorch 2.13 documentation
- torchao.quantization — torchao 0.17 documentation
- Post-training quantization | TensorFlow Model Optimization
- Quantization aware training | TensorFlow Model Optimization
- Quantize ONNX models | onnxruntime
Вопросы и ответы
Что такое квантизация модели простыми словами?
Это уменьшение разрядности чисел внутри модели, чтобы она занимала меньше памяти и была удобнее для вывода. Обычно речь идет о весах и иногда об активациях.
Квантизация обязательно ухудшает качество?
Потеря качества возможна, поэтому официальные workflow в разных фреймворках предполагают сравнение с исходной моделью. Если PTQ ухудшает результат слишком сильно, рассматривают QAT.
Чем PTQ отличается от QAT?
PTQ делается после обучения уже готовой модели. QAT встраивает имитацию квантизации в обучение, чтобы модель лучше адаптировалась к будущему квантованному inference.
Когда выбирать dynamic, а когда static quantization в ONNX Runtime?
По официальной документации ONNX Runtime, dynamic quantization рекомендуют для RNN и transformer-моделей, а static quantization — для CNN.
Нужен ли representative dataset?
В TensorFlow Lite он нужен для full integer quantization в PTQ-процессе. Для других сценариев требования отличаются, поэтому матрицу совместимости лучше сверять в документации конкретного runtime.