Квантизация и оптимизация инференса

Разбираемся, как сделать модель легче и быстрее без переобучения с нуля.

Квантизация — приём, при котором веса модели хранят с меньшей точностью (например, 8 или 4 бита вместо 32), уменьшая размер и ускоряя инференс.

Проблема: модели большие

Большая модель может занимать десятки гигабайт и не помещаться на доступную видеокарту. Квантизация решает это: вместо хранения каждого веса в 32-битном float используют 8-битное целое (int8) или даже 4 бита. Память сокращается в 4–8 раз почти без потери качества.

ТочностьБит на весПамять (условно)
float3232100%
float161650%
int8825%
4-bit4~13%

Идея квантизации на пальцах

Квантизация — это отображение диапазона дробных чисел в небольшой набор целых. Покажем суть на чистом Python (реально запускается):

weights = [-0.9, -0.3, 0.0, 0.5, 0.8]
lo, hi = min(weights), max(weights)
levels = 8  # как будто 3 бита

def quantize(x):
    scaled = (x - lo) / (hi - lo)        # в диапазон 0..1
    return round(scaled * (levels - 1))  # в целое 0..7

q = [quantize(w) for w in weights]
print("исходные:", weights)
print("квантованные:", q)

Вывод:

исходные: [-0.9, -0.3, 0.0, 0.5, 0.8]
квантованные: [0, 2, 4, 6, 7]

Дробные веса превратились в небольшие целые. При инференсе их «разворачивают» обратно приблизительно — небольшая потеря точности обычно почти не влияет на результат.

Другие способы ускорения

  • Дистилляция — обучить маленькую модель имитировать большую (так получили DistilBERT — вдвое меньше, почти та же точность).
  • Батчинг — обрабатывать несколько входов разом, эффективнее загружая GPU.
  • float16/bfloat16 — половинная точность, стандарт для инференса на GPU.

Как работает под капотом

В экосистеме за квантизацию отвечают библиотеки вроде bitsandbytes и интеграции в transformers (параметры загрузки load_in_8bit/load_in_4bit). Веса хранятся в целых, а в момент умножения матриц аппаратно или программно приводятся к нужному виду. Современные GPU имеют специальные блоки для целочисленных и половинных операций, поэтому квантизация даёт и память, и скорость одновременно.

Частые ошибки

  • Ждать нулевой потери качества. Сильная квантизация (4 бита) иногда заметно снижает качество — проверяйте на своей задаче.
  • Квантовать там, где хватает памяти. Если модель и так помещается, лишняя квантизация только усложняет.
  • Путать квантизацию и дистилляцию. Первая меняет точность чисел, вторая — обучает меньшую модель.

Итог

  • Квантизация хранит веса с меньшей точностью, экономя память в разы.
  • int8 и 4-bit позволяют запускать большие модели на скромном железе.
  • Дистилляция, батчинг и float16 — другие способы ускорения.
  • Сильная квантизация может снизить качество — проверяйте.
Проверьте себя
1. Что делает квантизация?
AОбучает модель заново
BХранит веса с меньшей точностью, экономя память и ускоряя инференс
CПереводит текст
DДобавляет новые слои
2. Чем дистилляция отличается от квантизации?
AНичем
BДистилляция обучает маленькую модель имитировать большую, а квантизация меняет точность чисел
CДистилляция переводит текст
DКвантизация добавляет слои
3. Какой риск у сильной квантизации (например, 4 бита)?
AМодель станет больше
BВозможное заметное снижение качества
CНевозможность скачать модель
DПотеря токенизатора