Что делает квантизация
Квантизация снижает требования к памяти при загрузке и инференсе модели за счёт хранения весов в формате с меньшей точностью. Исходно веса хранятся в full-precision (fp32), но уже half-precision (fp16 или bf16) стал стандартом для большинства современных LLM. Квантизация идёт дальше — вплоть до целочисленных представлений int8 и int4.
Компромисс всегда один: меньше бит на параметр → меньше VRAM → потенциальная потеря качества. Задача конкретного метода — минимизировать эту потерю.
Нотация WxAy
В документации vLLM и Hugging Face форматы квантизации записываются как WxAy, где:
- W — битность весов (weights)
- A — битность активаций (activations)
- x / y — количество бит
| Формат | Что квантуется | Типичное применение |
|--------|---------------|--------------------|
| W8A8 | Веса и активации в 8 бит | FP8-инференс на Hopper/Ada |
| W4A16 | Только веса в 4 бита, активации остаются в 16 бит | GPTQ, AWQ |
| W4A8 | Веса в 4 бита, активации в 8 бит | Экспериментальные форматы |
| W8A8 (INT8) | Веса и активации в 8 бит (целочисленные) | INT8-схемы |
Форматы W4A16 означают, что при вычислении активации всё ещё хранятся в fp16/bf16, а квантованные веса деквантуются на лету. Это даёт экономию памяти без необходимости квантовать промежуточные тензоры.
FP8: аппаратная квантизация для новых GPU
FP8 — 8-битный формат с плавающей точкой. В отличие от целочисленных схем, он сохраняет динамический диапазон, характерный для floating-point, что снижает требования к калибровке.
В vLLM FP8 поддерживается через библиотеку LLM Compressor, которая готовит модель к деплою. Формат W8A8 в FP8 квантует и веса, и активации, что даёт ускорение на GPU с аппаратной поддержкой FP8-тензорных ядер.
Ограничения по железу
FP8 требует вычислительной способности не ниже SM 8.9 (Ada Lovelace) или SM 9.0 (Hopper). На более старых архитектурах — Volta (SM 7.0), Turing (SM 7.5), Ampere (SM 8.0/8.6) — FP8 не поддерживается аппаратно, и vLLM не сможет использовать этот формат.
INT4: GPTQ и AWQ
GPTQ и AWQ — методы квантизации весов до 4 бит (формат W4A16). Оба поддерживаются vLLM нативно и перечислены в списке квантизаций наравне с FP8, INT8, GGUF и другими форматами.
Что объединяет оба метода
- Квантуются только веса; активации остаются в fp16/bf16.
- Результат — статический набор квантованных весов, который загружается как обычный checkpoint.
- Экономия VRAM примерно в 4 раза относительно fp16.
- Оба формата поддерживаются vLLM нативно.
Калибровка
Некоторые методы квантизации требуют калибровочного датасета для достижения большей точности при экстремальном сжатии (1–2 бита). Другие работают «из коробки» с квантизацией на лету. Для GPTQ и AWQ калибровка является стандартной практикой: алгоритм оценивает, как квантизация каждого слоя влияет на выход модели, используя representative-примеры.
Когда 4 бита — разумный выбор
- Модель не помещается в доступную VRAM в fp16/bf16.
- Допустима небольшая деградация качества.
- Нужен максимальный throughput на ограниченном железе.
Совместимость с аппаратными платформами
vLLM поддерживает квантизацию на NVIDIA GPU, AMD GPU, x86/ARM/PowerPC CPU, а также через плагины на Google TPU, Intel Gaudi и других ускорителях.
Для NVIDIA GPU ключевой параметр — compute capability (SM-версия). Архитектурные обозначения, принятые в документации vLLM:
| Архитектура | SM |
|-------------|-----|
| Volta | 7.0 |
| Turing | 7.5 |
| Ampere | 8.0 / 8.6 |
| Ada Lovelace | 8.9 |
| Hopper | 9.0 |
Подтверждённые ограничения:
- FP8 доступен только на Ada (SM 8.9) и Hopper (SM 9.0).
- Turing не поддерживает Marlin-ядра для MXFP4 — это ограничение конкретного kernel-бэкенда.
- Полная таблица совместимости форматов и архитектур доступна в документации vLLM и может меняться с развитием проекта.
Практический запуск через vLLM
vLLM принимает квантованные модели напрямую. Если чекпоинт уже содержит квантованные веса и конфигурацию, достаточно указать путь к модели:
Python:
from vllm import LLM
llm = LLM(model="path-to-quantized-model")
Для кастомных или нестандартных методов квантизации параметр
quantization передаётся явно:
Python:
llm = LLM(model="your-model", quantization="my_quant")
Кастомный метод квантизации
vLLM позволяет зарегистрировать собственный метод через декоратор
@register_quantization_config. Это полезно, если вы используете экспериментальный формат, которого ещё нет в основной кодовой базе:
Python:
import torch
from vllm.model_executor.layers.quantization import register_quantization_config
from vllm.model_executor.layers.quantization.base_config import QuantizationConfig
@register_quantization_config("my_quant")
class MyQuantConfig(QuantizationConfig):
def get_name(self) -> str:
return "my_quant"
def get_supported_act_dtypes(self) -> list:
return [torch.float16, torch.bfloat16]
@classmethod
def get_min_capability(cls) -> int:
return -1 # без ограничения по SM
@staticmethod
def get_config_filenames() -> list[str]:
return []
@classmethod
def from_config(cls, config: dict) -> "MyQuantConfig":
return cls()
def get_quant_method(self, layer, prefix: str):
## диспетчеризация по типу слоя
...
Класс
QuantizationConfig требует реализации нескольких абстрактных методов:get_name()— строковый идентификатор метода.
get_supported_act_dtypes()— список поддерживаемых типов данных активаций.
get_min_capability()— минимальная compute capability GPU; значение-1снимает ограничение.
get_config_filenames()— имена файлов конфигурации, которые ищутся в директории модели.
from_config()— создание экземпляра из словаря конфигурации.
get_quant_method()— возвращает объект метода квантизации в зависимости от типа слоя.
Для линейных слоёв возвращается подкласс
QuantizeMethodBase. Для MoE-слоёв (Mixture of Experts) — подкласс FusedMoEMethodBase, который дополнительно реализует create_weights, apply и get_fused_moe_quant_config.LLM Compressor: подготовка модели
LLM Compressor — библиотека для оптимизации моделей под деплой в vLLM. Поддерживаемые форматы:
- FP8 W8A8
- INT4 W4A16
- INT8 W4A8
- INT8 W8A8
Типичный workflow: загрузить исходную модель в fp16/bf16 → прогнать калибровочный датасет → сохранить квантованный чекпоинт → загрузить в vLLM.
Другие поддерживаемые форматы
Помимо GPTQ, AWQ и FP8, vLLM поддерживает:
- GGUF — формат, популярный для CPU-инференса.
- compressed-tensors — формат из экосистемы LLM Compressor.
- ModelOpt — инструмент NVIDIA для оптимизации моделей.
- TorchAO — квантизация через PyTorch.
- MXFP8 / MXFP4 / NVFP4 — новые форматы для Hopper и новее.
Как выбрать метод
| Ситуация | Рекомендуемый формат |
|----------|---------------------|
| GPU Ada/Hopper, нужен максимальный throughput | FP8 W8A8 |
| GPU Ampere или старше, модель не влезает в VRAM | GPTQ или AWQ (W4A16) |
| Нужен баланс между скоростью и качеством на Ampere | INT8 W8A8 |
| Эксперименты с новыми форматами | compressed-tensors, TorchAO, ModelOpt |
Типичные ошибки
Загрузка FP8-модели на Ampere. vLLM не запустит FP8-квантизацию на GPU с SM < 8.9. Ошибка проявится на этапе инициализации модели.
Калибровка на нерепрезентативных данных. Если калибровочный датасет не отражает реальное распределение запросов, качество после квантизации упадёт сильнее, чем ожидалось.
Смешивание форматов. Нельзя загрузить GPTQ-чекпоинт и ожидать, что vLLM применит к нему FP8-ядра. Формат определяется конфигурацией чекпоинта.
Игнорирование размера контекста. Квантизация уменьшает память под веса, но не отменяет рост потребления VRAM при увеличении длины контекста. Для длинных контекстов может потребоваться дополнительная VRAM даже с 4-битными весами.
Проверка результата
После загрузки квантованной модели убедитесь:
- vLLM не выдал предупреждений о несовместимости формата с текущим GPU.
- Потребление VRAM соответствует ожидаемому (примерно в 4 раза меньше для W4A16 относительно fp16).
- Качество генерации на контрольных промптах не деградировало критично.
- Throughput (токенов/сек) вырос или остался на приемлемом уровне относительно fp16-базы.
