Перейти к содержанию

Влияние квантизации на производительность инференса vLLM

Квантизация снижает вычислительные затраты и расход памяти при инференсе, представляя веса и активации типами меньшей разрядности, например 8-битными целыми (int8), вместо обычных 32-битных чисел с плавающей точкой (float32).

Цель этого документа — оценить распространённые методы квантизации в vLLM и их влияние на производительность инференса, особенно пропускную способность при высокой конкурентности.

Выводы

  1. Квантизация весов и активаций (например, FP8) даёт значительный прирост производительности при минимальной потере качества и рекомендуется для большинства сценариев. Статическая квантизация обеспечивает более высокую пропускную способность, чем динамическая; точность зависит от калибровочных данных:

    • Динамическая FP8: +14.8% TPS, -14.1% TTFT, -21.8% TPOT
    • Статическая FP8: +26.7% TPS, -20.4% TTFT, -32.4% TPOT
  2. Большинство методов квантизации заметно повышают пропускную способность при ограниченной VRAM; в экспериментах наблюдался прирост до +46%.

  3. Квантизация только весов при достаточном объёме VRAM ухудшает TPS, TTFT и TPOT из-за накладных расходов деквантизации.

  4. Среди методов квантизации только весов лучшую производительность инференса дают AWQ и GPTQ. bitsandbytes и GGUF не рекомендуются из-за низкой производительности или проблем совместимости.

  5. В экспериментах ядра vLLM по умолчанию для AWQ и GPTQ превосходят пользовательские реализации ядер.

  6. Квантизация KV-кэша даёт сравнительно небольшой прирост пропускной способности по сравнению с другими методами оптимизации.

Технические сведения

Тип квантизации

Тип квантизации Описание
Только веса После обучения квантизуются только веса; активации сохраняют полную разрядность
Динамическая Веса квантизуются заранее; активации — на лету при инференсе
Статическая Веса и активации квантизуются заранее после калибровки на репрезентативных данных
Обучение с учётом квантизации Моделирует квантизацию при обучении, чтобы модель адаптировалась к меньшей разрядности

Калибровка

Калибровка — этап квантизации, на котором вычисляются диапазоны float32. Для весов это относительно просто, поскольку фактический диапазон известен в момент квантизации. Для активаций ситуация менее определённа, и используются разные подходы:

  1. Динамическая квантизация после обучения: диапазон каждой активации вычисляется на лету во время выполнения. Это позволяет получить хорошие результаты без больших усилий, но из-за повторного вычисления диапазонов может быть медленнее статической квантизации. На некотором оборудовании этот вариант недоступен.

  2. Статическая квантизация после обучения: диапазон каждой активации вычисляется заранее, на этапе квантизации; обычно через модель пропускают репрезентативные данные и записывают значения активаций. На практике выполняются следующие шаги: - К активациям добавляются наблюдатели для записи их значений - Выполняется некоторое число прямых проходов по калибровочному набору данных (достаточно примерно 200 примеров) - Диапазоны значений для каждого вычисления определяются выбранным методом калибровки

  3. Обучение с учётом квантизации: диапазон каждой активации вычисляется во время обучения по той же идее, что и при статической квантизации после обучения. Но вместо наблюдателей применяются операторы «псевдоквантизации»: они записывают значения и одновременно моделируют ошибку квантизации, позволяя модели к ней адаптироваться.

Квантизация KV-кэша

Квантизация KV-кэша уменьшает потребление памяти при инференсе, сохраняя кэш ключей и значений в формате меньшей разрядности. Это позволяет кэшировать больше токенов и повышает пропускную способность. vLLM поддерживает FP8 (E4M3 и E5M2), но не KV-кэш INT8. Исследуются также 4-битные и 2-битные варианты, однако они обычно заметно ухудшают точность, например снижают MMLU.

Ядра квантизации

vLLM предлагает несколько реализаций ядер квантизации для методов AWQ и GPTQ. По умолчанию AWQ использует официальное ядро AWQ, а модели GPTQ — ExLlamaV2. Также доступны оптимизированные ядра Marlin и Machete, повышающие производительность, особенно при больших батчах.

Снижение качества инференса

Квантизация может ухудшать качество инференса. Хотя этот документ посвящён главным образом показателям производительности, для оценки влияния на качество приведены следующие материалы:

Бенчмарки модели Qwen3-8B с разными методами квантизации:

Quantization CEVAL MMLU GSM8K HUMANEVAL
BF16 79.27 74.78 87.79 63.41
FP8-Static 78.23 74.79 86.96 62.20
FP8-Dynamic 78.45 74.75 87.64 62.80
INT8-Dynamic 78.01 74.84 86.96 67.07
INT4-GPTQ 77.19 73.26 86.43 62.20
INT4-AWQ 76.15 73.59 86.96 63.41

Подробности см. в бенчмарках AngelSlim.

Условия эксперимента

  • Модель: Qwen3-8B
  • Оборудование: NVIDIA RTX 4090 24GB / A100 80GB / H100 80GB
  • Версия vLLM: v0.9.2
  • Набор данных: ShareGPT
  • Скрипт бенчмарка:
    1
    2
    3
    4
    5
    # Prepare the ShareGPT dataset
    wget https://huggingface.co/datasets/anon8231489123/ShareGPT_Vicuna_unfiltered/resolve/main/ShareGPT_V3_unfiltered_cleaned_split.json
    
    # Benchmark on ShareGPT dataset
    vllm bench serve --model Qwen/Qwen3-8B --endpoint-type openai-chat --endpoint /v1/chat/completions --dataset-name sharegpt --dataset-path ShareGPT_V3_unfiltered_cleaned_split.json --num-prompts 1000
    

Результаты эксперимента

RTX 4090

Метод квантизации Пропускная способность (tok/s) Среднее TTFT (ms) Среднее TPOT (ms)
BF16 3869.3 15385.7 63.45
AWQ 5653.4 (+46.1%) 7913.4 87.7
AWQ Marlin 5536.7 (+43.1%) 8133.8 90.42
GPTQ (Int8) 4918.98 (+27.1%) 8415.70 96.07
GPTQ Marlin 5025.82 (+29.9%) 8143.93 93.05

A100 80GB

Метод квантизации Пропускная способность (tok/s) Среднее TTFT (ms) Среднее TPOT (ms)
BF16 10338.25 3412.85 200.02
GPTQ-Marlin (Int4) 8146.73 10336.24 261.81
GPTQ (Int4) 8129.27 10414.74 261.64
AWQ 9611.61 3950.64 249.06
AWQ Marlin 8066.03 10506.70 264.33
GPTQ Marlin (Int8) 7119.60 12359.22 309.37
GPTQ (Int8) 7100.46 12380.82 309.34
bitsandbytes 5916.34 9115.43 252.91
GGUF (Q4_K_M) N/A N/A N/A

Примечание

Модель GGUF с архитектурой qwen3 не поддерживается.

H100 80GB

Метод квантизации Пропускная способность (tok/s) Среднее TTFT (ms) Среднее TPOT (ms)
FP8 Статическая 16452.52 (+26.7%) 4116.87 (-20.4%) 85.57 (-32.4%)
FP8 Динамическая 15275.64 (+14.8%) 4445.10 (-14.1%) 98.94 (-21.8%)
Int4-W4A16 13605.46 5302.14 130.54
BF16 13305.38 5172.78 126.55
AWQ 9756.06 8794.29 209.13
GPTQ N/A N/A N/A

Примечание

Реализация GPTQ не работает; см. issue vLLM.

Квантизация KV-кэша

Конфигурация Пропускная способность (tok/s) Среднее TTFT (ms) Среднее TPOT (ms)
BF16 (Базовая конфигурация) 13305.38 5172.78 126.55
BF16 + KV Cache FP8 (E4M3) 13513.19 (+1.6%) 5688.39 103.21