Квантизация LLM: AWQ, GPTQ и FP8 — как уменьшить память без лишней потери качества

Что делает квантизация​


Квантизация снижает требования к памяти при загрузке и инференсе модели за счёт хранения весов в формате с меньшей точностью. Исходно веса хранятся в 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-битными весами.

Проверка результата​


После загрузки квантованной модели убедитесь:

  1. vLLM не выдал предупреждений о несовместимости формата с текущим GPU.
  2. Потребление VRAM соответствует ожидаемому (примерно в 4 раза меньше для W4A16 относительно fp16).
  3. Качество генерации на контрольных промптах не деградировало критично.
  4. Throughput (токенов/сек) вырос или остался на приемлемом уровне относительно fp16-базы.

Источники​


 

Похожие темы

Назад
Верх Низ