Квантизация в машинном обучении — это перевод весов, активаций, а иногда и градиентов из более точного числового формата в менее точный, чтобы уменьшить размер модели и ускорить инференс. На практике чаще всего речь идет о переходе с FP32 на INT8, реже — на 4-битные схемы. Метод полезен, когда упираются в память, пропускную способность или задержку на CPU, мобильных и edge-устройствах. Он не универсален: квантизация может ухудшить качество, особенно у моделей с выбросами в распределениях, у чувствительных к малым ошибкам регрессионных задач и на платформах, где нет эффективной поддержки низкой точности.
Простыми словами
Если упростить, квантизация — это контролируемое округление чисел в модели. Вместо хранения каждого веса как 32-битного числа с плавающей точкой можно хранить его как 8-битное целое число и отдельно держать правило перевода обратно в исходный диапазон. За счет этого модель занимает меньше памяти и обычно требует меньше операций чтения и записи.
Для практики важны три идеи.
- Чем меньше бит, тем дешевле хранение и вычисления. Но тем выше риск потерять точность.
- Не все части модели одинаково чувствительны. Одни слои переносят INT8 спокойно, другие заметно деградируют.
- Квантизация — это не только формат весов. Важно, как квантовать активации, как калибровать диапазоны и какие ядра поддерживает целевая платформа.
В индустриальном разговоре рядом с квантизацией часто упоминают FP16 и BF16. Строго говоря, это не целочисленная квантизация, а снижение точности представления. Но с точки зрения деплоя это соседний класс приемов: задача та же — ускорить и удешевить вычисления без неприемлемой потери качества.
Как это работает
Базовая схема проста: значения из вещественного диапазона отображаются в более узкий целочисленный диапазон. Для этого используются параметры масштаба и, в асимметричном случае, нулевая точка.
q = round(x / scale) + zero_point
x ≈ scale * (q - zero_point)
Где x — исходное вещественное значение, а q — квантованное целое. На практике из этого следуют несколько технических вариантов.
Симметричная и асимметричная квантизация
- Симметричная обычно удобна для весов: диапазон строится вокруг нуля, нулевая точка фиксируется.
- Асимметричная полезна для активаций, если данные смещены и диапазон несимметричен.
Per-tensor и per-channel
- Per-tensor использует один масштаб на весь тензор. Это проще, но грубее.
- Per-channel задает масштаб отдельно для каждого канала или выходного нейрона. Для весов это часто дает заметно лучшее качество при почти той же стоимости.
Основные режимы внедрения
- Посттренировочная квантизация — модель уже обучена, после чего ее переводят в низкую точность. Это самый дешевый путь по инженерным затратам.
- Статическая квантизация — диапазоны активаций оцениваются на калибровочном наборе данных. Подходит, когда есть репрезентативные примеры инференса.
- Динамическая квантизация — веса квантуются заранее, а активации квантуются во время выполнения. Часто применяется к трансформерам на CPU, когда нужен простой выигрыш без калибровки.
- Quantization-aware training, QAT — в обучение добавляют имитацию ошибок квантизации, чтобы модель адаптировалась к будущему формату. Это самый надежный способ для жестких ограничений по битности, но и самый дорогой по времени.
Ключевой инженерный момент: квантизация эффективна только тогда, когда весь стек ее действительно исполняет. Если модель хранится в INT8, но вычисления постоянно разворачиваются обратно в FP32, выигрыша может не быть.
Зачем нужно
Главные причины внедрять квантизацию — операционные, а не теоретические.
- Снижение потребления памяти. Это особенно важно для больших моделей и edge-устройств.
- Уменьшение bandwidth pressure. Часто инференс ограничен не арифметикой, а переносом данных между памятью и вычислительными блоками.
- Снижение задержки. На CPU и специализированных ускорителях INT8 может работать быстрее FP32, если backend и ядра это поддерживают.
- Снижение энергопотребления. Для мобильных и встраиваемых систем это критично.
- Удешевление деплоя. Меньше памяти и более легкий инференс упрощают размещение на массовом железе.
Но выгода зависит от профиля нагрузки. Если узкое место — токенизация, сетевой ввод-вывод, декодирование изображений или неоптимальный batch scheduling, квантизация может почти не изменить общую задержку сервиса.
Практическое правило: сначала измеряйте, где тратится время и память, а уже потом выбирайте формат чисел.
Пример
Практический сценарий: есть сервис классификации обращений, который использует трансформер и работает на CPU. Цель — уменьшить задержку и память без переобучения модели.
- Экспортируйте модель в рантайм, где есть зрелая поддержка квантизации. Например, ONNX Runtime.
- Начните с динамической квантизации. Для трансформерных блоков это часто наименее рискованный первый шаг: линейные слои квантуются заранее, активации — во время выполнения.
- Проверьте метрику задачи на отложенном наборе. Для классификации это может быть accuracy, F1 или business-метрика по критичным классам. Смотрите не только на среднее значение, но и на ошибки в редких категориях.
- Снимите профиль задержки и памяти в тех же условиях, что и в продакшене. Одинаковый batch size, тот же CPU, та же длина входной последовательности.
- Если качество просело слишком сильно, переходите к более точной схеме. Например, используйте per-channel для весов, исключите чувствительные узлы из квантизации или рассмотрите QAT.
Что здесь важно: для такого сценария квантизация уместна, потому что трансформер на CPU часто ограничен памятью и стоимостью матричных операций. Но если модель уже исполняется на GPU в BF16 и упирается в другой участок пайплайна, тот же прием может не дать заметной пользы.
Заблуждения и ограничения
- «INT8 всегда быстрее FP16 и FP32». Нет. Все зависит от аппаратной поддержки и конкретного backend. На одной платформе ускорение будет, на другой — нет или даже будет замедление из-за преобразований типов.
- «Квантизацию можно делать в самом конце без валидации». Нельзя. Даже если средняя метрика почти не изменилась, могут пострадать редкие классы, длинные последовательности или отдельные диапазоны входов.
- «Достаточно квантовать только веса». Иногда этого достаточно, но не всегда. Если основная стоимость сидит в активациях и доступе к памяти, неполная схема даст ограниченный эффект.
- «4 бита — это просто более агрессивный INT8». На сверхнизких битностях поведение моделей становится заметно менее стабильным. Часто требуются специальные схемы, групповая квантизация, компенсация выбросов и адаптация обучения.
- «FP16 — то же самое, что INT8». Нет. У этих форматов разная динамика диапазонов, разная цена ошибок округления и разная поддержка на железе.
Есть и явные противопоказания. Квантизация плохо подходит, если задача чувствительна к малым численным изменениям, если важны редкие хвостовые случаи, если нет репрезентативного калибровочного набора, если модель содержит выраженные выбросы в активациях или если продакшен-стек не поддерживает нужный низкоточный путь без лишних конверсий.
Частые вопросы
Нужно ли переобучать модель для квантизации?
Не всегда. Посттренировочная квантизация часто работает без переобучения. Но если потеря качества заметна, переходят к QAT, где модель обучают с учетом будущих ошибок округления.
Что выбрать первым: FP16 или INT8?
Смотрите на целевую платформу. Если нужен быстрый и безопасный шаг на GPU, часто начинают с FP16 или BF16. Если деплой идет на CPU, мобильные или edge-ускорители, первым кандидатом чаще становится INT8.
Почему нужна калибровка?
Потому что нужно оценить реальные диапазоны активаций. Если диапазон выбран слишком узко, значения будут клиппироваться. Если слишком широко, вы потеряете точность из-за грубого шага квантования.
Можно ли квантовать любую модель до 4 бит?
Технически часто можно, но практический результат зависит от архитектуры и задачи. Для части LLM и рекомендательных моделей нужны специальные методы работы с выбросами, группировкой и выбором чувствительных слоев. Универсального «кнопочного» решения здесь нет.
Связанные понятия
- Посттренировочная квантизация — снижение точности уже обученной модели без изменения основного процесса обучения.
- QAT — обучение с имитацией квантизации, чтобы уменьшить потерю качества при деплое в низкой точности.
- Калибровка — подбор диапазонов активаций по репрезентативному набору данных.
- Смешанная точность — использование разных форматов чисел в разных частях вычислений, например BF16 для матриц и FP32 для аккумулирования.
- Прореживание — удаление части весов или связей для уменьшения размера и вычислений; часто комбинируется с квантизацией.
- Дистилляция — перенос знаний из большой модели в более компактную; иногда это лучший путь, чем агрессивное снижение битности.