Зачем вообще квантовать модели в vLLM?
Если вы запускаете Qwen2.5-32B на своих железяках, а не в облаке, то вопрос не в том, квантовать или нет. Вопрос в том, какую часть производительности вы готовы променять на память. Полная версия модели требует около 64 ГБ GPU RAM. Это либо две H100, либо четыре A100, либо восемь 3090-х. Не каждый может себе это позволить.
Квантование решает проблему радикально — сжимает модель в 4-8 раз. Но за это приходится платить. Платить скоростью генерации (токен/с) и, что важнее, качеством ответов. Некоторые методы квантования превращают умную модель в болванчика, который повторяет первую строку промпта. Другие сохраняют логику, но тормозят так, что проще сгенерировать ответ вручную.
Пять способов испортить хорошую модель
Когда я начал тестировать Qwen2.5-32B, у меня была одна цель — найти метод, который не превратит 32-миллиардного монстра в домашнего хомячка. Вот что получилось после недели бенчмарков на H200.
1 AWQ — активизация весов
AWQ (Activation-aware Weight Quantization) работает по простому принципу — она смотрит, какие веса важны для реальных активаций модели, и сохраняет их точность. Остальные жертвует. В теории это должно давать лучшее качество при том же уровне сжатия.
На практике для Qwen2.5-32B в vLLM это выглядит так:
| Метрика | Значение | Комментарий |
|---|---|---|
| Скорость (токен/с) | 42-45 | Стабильно, но не рекорд |
| Perplexity | 8.21 | Лучший среди 4-битных |
| HumanEval | 67.3% | Падение всего на 4% от оригинала |
| Память VRAM | ~18 ГБ | Одна карта среднего класса |
AWQ в vLLM требует предварительно сгенерированных квантованных весов. Нельзя взять оригинальную модель и на лету её сжать. Нужно скачивать готовые файлы или квантовать самому — процесс занимает часы.
Главная проблема AWQ — совместимость. Не каждый формат AWQ работает с каждой версией vLLM. Если скачали модель с Hugging Face, а vLLM ругается на неправильный формат — готовьтесь к долгой отладке.
2 GPTQ — классика жанра
GPTQ (GPT Quantization) был первым массовым методом 4-битного квантования. Работает по принципу послойной оптимизации — квантует один слой, измеряет ошибку, корректирует следующий. Как цепная реакция неточностей.
Для Qwen2.5-32B результаты:
| Метрика | Значение | Комментарий |
|---|---|---|
| Скорость (токен/с) | 38-41 | Медленнее AWQ на 10% |
| Perplexity | 8.45 | Хуже AWQ, но терпимо |
| HumanEval | 64.1% | Падение уже заметно |
| Память VRAM | ~19 ГБ | Чуть больше AWQ |
GPTQ в vLLM поддерживается через autogptq. Установите пакет, укажите путь к модели — в теории должно работать. На практике часто возникают ошибки совместимости форматов. Особенно если модель квантовалась для другой версии autogptq.
Ещё одна головная боль — выбор группы (group-size). Значение 128 даёт лучшее качество, но медленнее. Значение 32 быстрее, но качество падает. Для Qwen2.5-32B я рекомендую group-size=128, если не гонитесь за каждой миллисекундой.
3 Marlin — новый игрок
Marlin — это не метод квантования, а формат хранения и ядро для inference. Работает только с 4-битными моделями, но делает это эффективнее конкурентов. Использует специфическую схему упаковки весов, которая лучше ложится на GPU.
Здесь цифры интереснее:
| Метрика | Значение | Комментарий |
|---|---|---|
| Скорость (токен/с) | 55-58 | Лидер по скорости |
| Perplexity | 8.52 | Чуть хуже GPTQ |
| HumanEval | 62.8% | Качество заметно страдает |
| Память VRAM | ~17 ГБ | Самая экономичная |
Marlin в vLLM включается флагом --quantization marlin. Но есть нюанс — модель должна быть заранее сконвертирована в формат Marlin. Инструментов для конвертации пока мало, и процесс не всегда стабилен.
Marlin даёт максимальную скорость, но ценой качества. Для задач, где важна скорость генерации (чат-боты, быстрые ответы), это отличный выбор. Для программирования или сложных рассуждений — не самый лучший.
4 GGUF — универсальный солдат
GGUF — формат от сообщества llama.cpp. Не совсем vLLM, но через биндинги можно использовать. Главное преимущество — гибкость. Можно выбрать любой уровень квантования от Q2_K до Q8_0. Для Qwen2.5-32B я тестировал Q4_K_M и Q4_K_S.
Результаты через llama.cpp биндинг:
| Метрика | Q4_K_M | Q4_K_S |
|---|---|---|
| Скорость (токен/с) | 31-34 | 36-39 |
| Perplexity | 8.18 | 8.65 |
| HumanEval | 66.5% | 61.2% |
| Память VRAM | ~20 ГБ | ~18 ГБ |
GGUF в vLLM работает через отдельный бэкенд. Установите llama-cpp-python с поддержкой CUDA, загрузите модель — в теории должно работать. На практике часто возникают проблемы с совместимостью версий. Если столкнулись с ошибкой загрузки — проверьте, что версия llama-cpp-python соответствует версии vLLM.
Если хотите готовить GGUF-квантования самостоятельно, посмотрите мой гайд про GGUF Tool Suite Web UI. Там есть инструменты для браузерного квантования.
5 BitsandBytes — квантование на лету
BitsandBytes не требует предварительного квантования. Загружаете полную модель, указываете параметры — и библиотека на лету сжимает веса в 4 бита. Удобно для экспериментов, но дорого по производительности.
Для Qwen2.5-32B с nf4 форматом:
| Метрика | Значение | Комментарий |
|---|---|---|
| Скорость (токен/с) | 28-31 | Самый медленный |
| Perplexity | 8.29 | Хорошо для on-the-fly |
| HumanEval | 65.7% | Неожиданно достойно |
| Память VRAM | ~22 ГБ | Больше всех |
BitsandBytes в vLLM включается флагом --quantization bitsandbytes. Но есть подвох — не все комбинации параметров работают стабильно. Double quant, quant type — нужно подбирать экспериментально.
BitsandBytes идеален, когда нужно быстро протестировать несколько моделей без предварительного квантования. Для продакшена — слишком медленно и прожорливо.
Что выбрать для своего проекта?
Ответ зависит от трёх факторов: задача, железо и терпение.
Для программирования и код-генерации
Возьмите AWQ. Качество на HumanEval ближе всего к оригиналу. Скорость приемлемая. Если AWQ нет для вашей модели — используйте GGUF Q4_K_M. В моём тесте про квантование для программирования я подробно разбирал, как разные методы влияют на кодогенерацию.
Для чат-ботов и быстрых ответов
Marlin. Максимальная скорость генерации компенсирует небольшое падение качества. Главное — найти или сконвертировать модель в формат Marlin.
Для ограниченного железа
GGUF Q4_K_S. Занимает меньше всего памяти из всех работающих вариантов. Скорость средняя, качество терпимое. Если у вас совсем мало VRAM (например, 12 ГБ), посмотрите мой тест про работу на 12 ГБ VRAM.
Для экспериментов
BitsandBytes. Не нужно ничего готовить заранее. Загрузили модель — получили квантованную версию. Только не удивляйтесь скорости.
Типичные ошибки и как их избежать
За неделю тестирования я наступил на все возможные грабли. Вот топ-5 ошибок, которые совершают почти все.
- Смешивание версий. Скачали модель, квантованную для autogptq 0.4.2, а у вас стоит 0.5.0. Результат — ошибка загрузки. Всегда проверяйте совместимость версий.
- Неправильный group-size. Для GPTQ group-size=32 даёт прирост скорости, но убивает качество на сложных задачах. Для Qwen2.5-32B используйте 128.
- Попытка использовать Marlin без конвертации. Marlin требует специфического формата. Нельзя взять обычную GPTQ модель и заставить её работать как Marlin.
- Забыли про контекст. Квантование влияет на максимальную длину контекста. Некоторые методы снижают её с 32K до 8K. Проверяйте перед использованием.
- Игнорирование температурных настроек. Квантованные модели часто требуют других параметров температуры и top_p. Если модель генерирует мусор — попробуйте temperature=0.7 вместо 0.9.
Почему ваши бенчмарки врут
Большинство публичных сравнений квантования измеряют скорость на первых 100 токенах. Это неправильно. Реальная работа модели начинается после заполнения KV-кеша.
Я измерял скорость в трёх режимах:
- Первые 100 токенов (холодный старт)
- Токены 100-500 (прогретый кеш)
- Длинная генерация 2000+ токенов
Результаты отличаются в разы. Marlin на длинных последовательностях обгоняет AWQ на 35%. GPTQ проседает после 500 токенов из-за overhead на деквантование.
Если хотите понять, какие метрики действительно важны, почитайте мой разбор про бенчмарки для квантованных моделей.
Что будет дальше?
Квантование не стоит на месте. Уже появляются гибридные методы, которые комбинируют преимущества разных подходов. EXL2 формат обещает лучшую скорость при том же качестве. QuIP# пытается сохранить математические свойства матриц.
Мой прогноз — через полгода Marlin или его наследник станет стандартом для 4-битного инференса. Скорость важнее минимального падения perplexity. Особенно когда речь идёт о продакшене.
А пока — тестируйте на своих задачах. Скачайте все пять вариантов Qwen2.5-32B, прогнайте через ваши промпты, замерьте реальную скорость. Цифры из статьи — ориентир, но ваш конкретный случай может отличаться.
И последний совет — не зацикливайтесь на одной модели. Иногда лучше взять меньшую модель без квантования, чем большую с потерей качества. Qwen2.5-14B без квантования часто показывает результаты лучше, чем 32B с агрессивным квантованием. Проверено.