Квантизация и оптимизация инференса
Разбираемся, как сделать модель легче и быстрее без переобучения с нуля.
Квантизация — приём, при котором веса модели хранят с меньшей точностью (например, 8 или 4 бита вместо 32), уменьшая размер и ускоряя инференс.
Проблема: модели большие
Большая модель может занимать десятки гигабайт и не помещаться на доступную видеокарту. Квантизация решает это: вместо хранения каждого веса в 32-битном float используют 8-битное целое (int8) или даже 4 бита. Память сокращается в 4–8 раз почти без потери качества.
| Точность | Бит на вес | Память (условно) |
| float32 | 32 | 100% |
| float16 | 16 | 50% |
| int8 | 8 | 25% |
| 4-bit | 4 | ~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 — другие способы ускорения.
- Сильная квантизация может снизить качество — проверяйте.