COMRAD404 / GLOSSARY

Квантизация (Quantization)

Quantization

Квантизация — это уменьшение разрядности весов и активаций модели, чтобы сократить память и упростить вывод. Ниже — как она работает, чем PTQ отличается от QAT и когда выбирать dynamic или static quantization.

TL;DR

Снижение разрядности весов и/или активаций модели, чтобы уменьшить память и упростить вычисления при выводе.

Квантизация (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 доступны API quantize_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-а и аппаратной поддержки, поэтому официальные источники везде оставляют место для проверки на вашей модели.

Практический пример

Самый безопасный сценарий для уже обученной модели — начать с пост-тренировочной квантизации, а не сразу перестраивать обучение.

  1. Определите runtime. Если вы целитесь в TensorFlow Lite, используйте PTQ на этапе конвертации. Если модель уже экспортирована в ONNX, выбирайте API ONNX Runtime.
  2. Для TensorFlow Lite включите оптимизацию конвертера. Базовый официальный переключатель выглядит так:
converter.optimizations = [tf.lite.Optimize.DEFAULT]
  1. Если нужен full integer quantization, подготовьте representative dataset. Без него официальный процесс PTQ для full-integer режима не завершает калибровку так, как ожидает документация.
  2. Для ONNX выберите режим по типу модели. Для transformer/RNN начните с quantize_dynamic(); для CNN — с quantize_static().
  3. Если качество упало слишком сильно, переходите к QAT. В TensorFlow QAT имитирует inference-time quantization. В PyTorch актуальные workflows описаны уже в torchao.
  4. Сравните результат с 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-а и набора данных. Практический критерий один: проверяйте квантованную модель на своей валидации.

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

Источники

Вопросы и ответы

Что такое квантизация модели простыми словами?

Это уменьшение разрядности чисел внутри модели, чтобы она занимала меньше памяти и была удобнее для вывода. Обычно речь идет о весах и иногда об активациях.

Квантизация обязательно ухудшает качество?

Потеря качества возможна, поэтому официальные 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.

Источники

SOURCES

Вопросы и ответы

FAQ
Что такое квантизация модели простыми словами?

Это уменьшение разрядности чисел внутри модели, чтобы она занимала меньше памяти и была удобнее для вывода. Обычно речь идет о весах и иногда об активациях.

Квантизация обязательно ухудшает качество?

Потеря качества возможна, поэтому официальные 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.

Читайте также

LINKS