Quantization
quantization — представление чисел меньшим набором уровней
Quantization переводит веса или активации модели в более компактное числовое представление. Памяти и передач становится меньше, но значения округляются, а выигрыш в скорости зависит от метода, данных и поддержки на устройстве.
Коротко
Коротко. Quantization, или квантизация, заменяет множество точных числовых значений меньшим набором представимых уровней. Так веса и активации занимают меньше памяти и требуют меньше передачи данных. Цена — ошибка округления, которая иногда почти незаметна, а иногда ухудшает результат модели.
Что это такое
Веса нейросети — большие массивы чисел. Одни значения немного отличаются друг от друга, хотя для итогового вычисления эта разница может быть несущественной.
Представим ряд стеклянных стержней разной высоты. В исходном наборе каждый стержень вырезан точно по своему значению. После квантизации есть только несколько допустимых ступеней. Каждый стержень перемещается к ближайшей из них.
Получается ступенчатое приближение исходной формы. Оно компактнее, потому что для записи номера ступени требуется меньше бит. Но точные исходные высоты уже не хранятся.
Квантизовать можно:
- веса модели;
- активации между слоями;
- кэш внимания;
- входы, выходы или отдельные операции;
- разные части сети с разной точностью.
Поэтому фраза «модель в четырёх битах» не описывает всю схему. Веса могут быть низкой точности, а вычисления и активации — более высокой.
Как значения попадают на уровни
В распространённой линейной схеме диапазон исходных значений связывают с диапазоном целых кодов.
Для этого нужны два параметра:
- scale задаёт расстояние между соседними уровнями;
- zero point указывает, какой код соответствует нулю.
Упрощённая запись выглядит так:
q = round(x / scale + zero_point)
Затем значение можно приблизительно восстановить:
x̂ = scale × (q - zero_point)
x — исходное число, q — компактный код, x̂ — восстановленное приближение. Округление и ограничение диапазона создают квантизационную ошибку.
В симметричной схеме ноль часто совпадает с центром кодов. В асимметричной zero point сдвигается, чтобы лучше покрыть несимметричный диапазон.
Гранулярность
Один scale можно применить ко всему тензору. Это просто и дёшево, но плохо работает, если разные участки имеют сильно отличающиеся диапазоны.
Более точные варианты используют отдельные параметры:
- для каждого канала;
- для строки или столбца матрицы;
- для небольшой группы значений;
- для блока фиксированной формы;
- для отдельных важных слоёв.
Мелкая гранулярность лучше подстраивается под данные, но требует хранить больше scales и усложняет вычисления. Размер и точность зависят не только от числа бит, но и от того, как значения разбиты на группы.
Что происходит с памятью
Если исходный вес хранится в 32-битном формате, а новый код занимает 8 бит, сырые коды номинально требуют примерно четверть места. Четырёхбитные коды занимают половину от восьмибитных.
Реальный файл и расход памяти больше простой арифметики, потому что остаются:
- scales и zero points;
- выравнивание и упаковка битов;
- неквантизованные слои;
- активации и рабочие буферы;
- копии для преобразования и вычислений;
- метаданные формата.
Поэтому уменьшение битности весов не означает такое же уменьшение всей VRAM во время работы.
Когда становится быстрее
Компактные веса требуют меньше чтения из памяти. Для модели, которая большую часть времени ждёт данные, это способно заметно ускорить инференс.
Но низкая точность полезна только при подходящей реализации. Устройство и библиотека должны уметь:
- хранить данные в упакованном виде;
- быстро распаковывать или использовать их напрямую;
- выполнять матричные операции нужной точности;
- накапливать результат в подходящем формате;
- избегать лишних преобразований между слоями.
Если специального kernel нет, программа может распаковывать значения в более высокую точность перед вычислением. Тогда память для хранения уменьшается, а скорость почти не растёт или даже падает из-за дополнительной работы.
Квантизация — не синоним ускорения. Она создаёт возможность экономить память, пропускную способность и вычисления, а фактический выигрыш определяет вся система.
Откуда берётся потеря качества
Каждое исходное число заменяется приближением. Маленькая ошибка одного веса выглядит безобидно, но сеть выполняет много операций, и ошибки могут накапливаться.
Особенно чувствительны:
- значения с редкими большими выбросами;
- слои, где небольшой сдвиг сильно меняет выход;
- активации с быстро меняющимся диапазоном;
- задачи, требующие точной числовой границы;
- очень низкая битность без адаптации модели.
Качество нельзя описать одной универсальной потерей в процентах. Оно зависит от метода, модели, данных для калибровки и того, какой показатель важен в продукте.
Post-Training Quantization
PTQ применяется к уже обученной модели. Параметры квантизации оцениваются по весам и, если требуется, по небольшому набору репрезентативных входов.
Плюс подхода — исходное обучение не повторяется. Минус — модель не успевает приспособиться к ошибкам округления. Чем агрессивнее схема, тем важнее выбор гранулярности и калибровочных данных.
Quantization-Aware Training
QAT имитирует квантизацию во время обучения или дообучения. Прямой проход видит округлённые значения, а оптимизация подстраивает веса так, чтобы модель сохраняла качество после реального преобразования.
Такой процесс дороже PTQ, но способен лучше удерживать результат при низкой точности. Он не устраняет ограничения формата, а учит модель жить внутри них.
Статическая и динамическая квантизация
При статической квантизации scales для активаций определяются заранее по калибровочным данным.
При динамической они вычисляются во время работы для текущего тензора или блока. Это помогает подстроиться под меняющийся диапазон, но добавляет вычисление параметров на лету.
Веса и активации могут использовать разные режимы. Названия схем в конкретных библиотеках различаются, поэтому важнее смотреть, какие именно тензоры квантизованы и когда определяются их scales.
Смешанная точность
Не все части модели одинаково чувствительны. Практическая схема может оставить некоторые слои в высокой точности, а остальные хранить компактнее. Накопление суммы тоже часто выполняется с большим числом бит, чем исходные множители.
Смешанная точность позволяет распределить ошибку разумнее: экономить там, где модель устойчива, и беречь чувствительные участки.
С чем часто путают
- С обычным сжатием файла. Архиватор хранит числа без потери и разворачивает их обратно. Quantization меняет сами значения.
- С pruning. Pruning удаляет или обнуляет часть связей. Квантизация сохраняет параметры, но уменьшает точность их представления.
- С distillation. При дистилляции меньшая модель учится повторять большую. Квантизация не обязана менять архитектуру.
- С округлением вывода. Округление показанного пользователю числа не уменьшает веса и вычисления внутри сети.
- С типом контейнера. Один файловый формат может хранить несколько схем квантизации; расширение не гарантирует конкретную битность и гранулярность.
- С low-precision training. Обучение в половинной или смешанной точности связано с той же идеей экономии, но имеет свои требования к градиентам и устойчивости.
Частые ошибки
- Судить только по числу бит. Две четырёхбитные схемы могут заметно различаться по группировке, scales и качеству.
- Ожидать одинакового ускорения на любом устройстве. Без подходящих kernel компактное представление не превращается в быстрые вычисления.
- Оценивать только размер файла. Активации и рабочая память способны остаться главным потребителем VRAM.
- Калибровать на случайных данных. Диапазоны активаций могут не соответствовать реальной нагрузке.
- Проверять только средний показатель. Редкие типы запросов иногда страдают сильнее общей метрики.
- Считать преобразование обратимым. Из квантизованных кодов можно получить приближение, но не точные исходные числа.
- Квантизовать всё одинаково. Чувствительные слои и выбросы могут потребовать другой точности или гранулярности.
Частые вопросы
Всегда ли меньше бит означает меньшую модель?
Сырые веса становятся компактнее, но scales, упаковка и неквантизованные части уменьшают разницу. Для всей модели важна не только номинальная битность.
Квантизация всегда ускоряет инференс?
Нет. Она ускоряет только поддерживаемые операции и особенно полезна при ограничении пропускной способностью памяти. На неподходящем железе распаковка и преобразования могут съесть выигрыш.
Можно ли восстановить исходную модель?
Точно — нет. Dequantization возвращает значения на выбранных уровнях, а потерянные дробные различия не восстанавливаются.
Почему активации сложнее квантизовать, чем веса?
Веса после обучения фиксированы, их диапазон можно изучить заранее. Активации зависят от каждого входа и способны содержать меняющиеся выбросы.
Обязательно ли квантизовать и веса, и активации?
Нет. Weight-only схема уменьшает хранение и передачу весов, сохраняя активации в более высокой точности. Другие схемы преобразуют обе стороны операции.
Как понять, что качество сохранилось?
Сравнение проводят на тех задачах и данных, ради которых модель используется. Общий benchmark полезен, но не заменяет проверку чувствительных сценариев продукта.
Главное
Quantization отображает множество точных чисел в меньшее число уровней. Так веса и активации занимают меньше памяти и требуют меньше передачи данных, но получают ошибку округления. Размер, скорость и качество определяются не одной битностью, а схемой, гранулярностью, калибровкой и поддержкой вычислений на конкретном устройстве.