Квантование — это техника, позволяющая уменьшить требования к памяти и вычислениям для моделей за счёт перевода весов и активаций из высокоточных форматов (например, FP32) в низкоразрядные форматы, такие как int8, int4 или даже int2.
Чем меньше бит используется, тем меньше памяти требуется модели. Например:
- 7B-модель в формате FP32 очень точная, но только веса занимают 28 ГБ памяти.
- Та же модель в FP16 использует вдвое меньше памяти.
- Ещё более низкие форматы (int8, int4) ещё сильнее сжимают модель, значительно уменьшая размер.
Эти цифры касаются только весов. Во время работы также требуется память для attention-кэшей, активаций и накладных расходов фреймворка.
Зачем нужно квантование#
Квантование широко применяется, потому что:
- Снижает использование памяти — позволяет запускать большие модели на меньших GPU, уменьшает размер KV-кэша на токен. Это увеличивает пропускную способность: больше токенов помещается в ту же память.
- Ускоряет инференс, особенно на edge-устройствах и при пакетной обработке.
- Снижает требования к вычислениям, что уменьшает стоимость и энергопотребление.
Этот компромисс между точностью и размером сопровождается некоторым снижением точности. Для многих задач это не критично, особенно при использовании современных методов квантования.
Форматы квантования#
Разные форматы квантования позволяют балансировать между экономией памяти и точностью. Краткая таблица:
| Формат | Размер относительно FP32 | Потеря точности | Сценарий | Память | Примечания |
|---|---|---|---|---|---|
| FP32 | 100% | Нет | Обучение | Высокая | Полная точность, но медленно |
| FP16 | 50% | Минимальная | Обучение и инференс | Средняя | Стандарт для большинства LLM |
| FP8 | 25% | Низкая | Обучение и инференс | Низкая | Новый формат |
| int8 | 25% | Низкая | Инференс | Низкая | Хороший компромисс |
| int4 | 12.5% | Средняя | Инференс | Очень низкая | Требует методов GPTQ/AWQ |
| int2 | 6.25% | Высокая | Редко/экспериментально | Крошечная | Точность часто низкая |
Что квантовать#
Обычно стоит фокусироваться на том, что больше всего потребляет память, но не сильно влияет на качество.
- Чаще всего квантуют веса модели — они стабильны и занимают основную часть памяти.
- Активации тоже можно квантовать, но это сложнее и может сильнее снижать точность.
Когда использовать квантование#
Квантование — хороший выбор, если:
- Вы разворачиваете модель на железе с ограниченной памятью GPU (например, 24 ГБ и меньше).
- Вам нужна низкая задержка инференса.
- Нужно снизить стоимость обслуживания.
- Требуется высокая параллельность (уменьшение KV-кэша на токен позволяет обслуживать больше запросов одновременно).
- Вы готовы мириться с небольшой потерей точности.
Квантование не подходит, если:
- Требуется максимальная точность (например, для критичных задач).
- Модель и так маленькая (выгода от квантования минимальна).
- Ваше железо не поддерживает квантованные форматы.
Методы квантования#
Разработано множество современных методов квантования, позволяющих сделать LLM эффективнее без значительной потери качества.
Вот самые популярные подходы:
AWQ#
Activation-aware Weight Quantization (AWQ) — метод для запуска LLM на edge-устройствах и в условиях ограниченных ресурсов. Ключевая идея: не все веса одинаково важны для качества. Разработчики считают, что только ~1% весов «значимы» и требуют особого подхода при квантовании. Поэтому AWQ избирательно защищает наиболее важные веса на основе распределения активаций, а не только самих весов.
В целом, AWQ масштабирует важные каналы весов на основе статистики активаций, собранной офлайн.
Метод отлично подходит для низкоразрядного квантования моделей, развёрнутых на edge или в задачах с низкой задержкой.
SmoothQuant#
SmoothQuant — универсальный метод post-training quantization (PTQ), не требующий дообучения, позволяющий эффективно квантовать и веса, и активации в 8 бит (W8A8).
Квантовать веса относительно просто, а вот активации — сложнее из-за выбросов, которые могут сильно снижать точность. SmoothQuant «сглаживает» выбросы активаций, математически переводя сложность квантования с активаций на веса. В результате достигается до 2× экономии памяти и до 1.56× ускорения для LLM.
SmoothQuant отлично подходит, если нужно:
- Полное INT8-квантование (веса и активации)
- Высокая эффективность без дообучения
- Минимальная потеря точности
- Совместимость с большинством трансформеров
Это готовое решение для продакшн-сценариев, где важны эффективность и простота.
GPTQ#
GPTQ — быстрый post-training метод, позволяющий сжимать большие трансформеры до 3–4 бит на вес с минимальной потерей точности. Разработан для масштабирования на сотни миллиардов параметров без дообучения.
Преимущества:
- Эффективен на больших моделях: квантует OPT-175B или BLOOM-176B за ~4 GPU-часа.
- Минимальная потеря точности даже при сильном сжатии.
- Поддержка экстремального квантования: 2 бита и тернарное квантование.
- Позволяет запускать огромные модели на одной A100 или двух A6000.
- Пользовательские GPU-ядра дают ускорение ~3.25× по сравнению с FP16.
GPTQ широко используется в open-source пайплайнах, особенно с AutoGPTQ. Это один из лучших вариантов для быстрого и экономного инференса больших моделей.
Вместо самостоятельного квантования часто можно взять уже готовую квантованную модель на Hugging Face. Там есть множество 8- и 4-битных моделей, готовых к инференсу и оптимизированных для низкой памяти и быстрой работы. Также доступны полноточные базовые модели, если вы хотите применить свою стратегию квантования.
Дополнительные ресурсы#
- Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference
- AWQ: Activation-aware Weight Quantization for LLM Compression and Acceleration
- GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers
- SmoothQuant: Accurate and Efficient Post-Training Quantization for Large Language Models
