Влияние квантизации на производительность инференса vLLM
Квантизация снижает вычислительные затраты и расход памяти при инференсе, представляя веса и активации типами меньшей разрядности, например 8-битными целыми (int8), вместо обычных 32-битных чисел с плавающей точкой (float32).
Цель этого документа — оценить распространённые методы квантизации в vLLM и их влияние на производительность инференса, особенно пропускную способность при высокой конкурентности.
Выводы
-
Квантизация весов и активаций (например, FP8) даёт значительный прирост производительности при минимальной потере качества и рекомендуется для большинства сценариев. Статическая квантизация обеспечивает более высокую пропускную способность, чем динамическая; точность зависит от калибровочных данных:
- Динамическая FP8: +14.8% TPS, -14.1% TTFT, -21.8% TPOT
- Статическая FP8: +26.7% TPS, -20.4% TTFT, -32.4% TPOT
-
Большинство методов квантизации заметно повышают пропускную способность при ограниченной VRAM; в экспериментах наблюдался прирост до +46%.
-
Квантизация только весов при достаточном объёме VRAM ухудшает TPS, TTFT и TPOT из-за накладных расходов деквантизации.
-
Среди методов квантизации только весов лучшую производительность инференса дают AWQ и GPTQ. bitsandbytes и GGUF не рекомендуются из-за низкой производительности или проблем совместимости.
-
В экспериментах ядра vLLM по умолчанию для AWQ и GPTQ превосходят пользовательские реализации ядер.
-
Квантизация KV-кэша даёт сравнительно небольшой прирост пропускной способности по сравнению с другими методами оптимизации.
Технические сведения
Тип квантизации
| Тип квантизации | Описание |
|---|---|
| Только веса | После обучения квантизуются только веса; активации сохраняют полную разрядность |
| Динамическая | Веса квантизуются заранее; активации — на лету при инференсе |
| Статическая | Веса и активации квантизуются заранее после калибровки на репрезентативных данных |
| Обучение с учётом квантизации | Моделирует квантизацию при обучении, чтобы модель адаптировалась к меньшей разрядности |
Калибровка
Калибровка — этап квантизации, на котором вычисляются диапазоны float32. Для весов это относительно просто, поскольку фактический диапазон известен в момент квантизации. Для активаций ситуация менее определённа, и используются разные подходы:
-
Динамическая квантизация после обучения: диапазон каждой активации вычисляется на лету во время выполнения. Это позволяет получить хорошие результаты без больших усилий, но из-за повторного вычисления диапазонов может быть медленнее статической квантизации. На некотором оборудовании этот вариант недоступен.
-
Статическая квантизация после обучения: диапазон каждой активации вычисляется заранее, на этапе квантизации; обычно через модель пропускают репрезентативные данные и записывают значения активаций. На практике выполняются следующие шаги: - К активациям добавляются наблюдатели для записи их значений - Выполняется некоторое число прямых проходов по калибровочному набору данных (достаточно примерно 200 примеров) - Диапазоны значений для каждого вычисления определяются выбранным методом калибровки
-
Обучение с учётом квантизации: диапазон каждой активации вычисляется во время обучения по той же идее, что и при статической квантизации после обучения. Но вместо наблюдателей применяются операторы «псевдоквантизации»: они записывают значения и одновременно моделируют ошибку квантизации, позволяя модели к ней адаптироваться.
Квантизация 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
- Скрипт бенчмарка:
Результаты эксперимента
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 |