vLLM vs TGI: сравниваем движки инференса для LLM
Запустить LLM локально через ollama run может каждый. Но когда нужно отдавать модель сотням пользователей по API с минимальной задержкой — начинается настоящая инженерия. Разбираем два главных движка инференса: vLLM и TGI.
Задача: production LLM API
Типичные требования к production-деплою:
- throughput: обработать 100+ запросов в минуту
- latency: первый токен — не более 500 мс для интерактивных приложений
- совместимость: OpenAI-compatible API для простой миграции
- quantization: модель 70B не влезает в 24 ГБ без квантизации
Именно под эти требования проектировались vLLM и TGI.
vLLM: PagedAttention и continuous batching
vLLM разработан в UC Berkeley и стал индустриальным стандартом благодаря двум ключевым инновациям.
PagedAttention — переосмысление управления KV-кэшем. Классические движки резервируют максимально возможный блок памяти для KV-кэша каждого запроса заранее. vLLM выделяет память страницами по 16 токенов, аналогично виртуальной памяти ОС. Результат: фрагментация памяти падает почти до нуля, можно обрабатывать значительно больше параллельных запросов на том же GPU.
Continuous batching — вместо ожидания завершения всего батча, новые запросы добавляются по мере освобождения слотов. Это кардинально улучшает утилизацию GPU при неравномерной длине ответов.
# Запуск vLLM через Docker
docker run --gpus all
-p 8000:8000
-v /models:/models
vllm/vllm-openai:latest
--model /models/Meta-Llama-3-70B-Instruct
--tensor-parallel-size 2
--max-model-len 8192
API полностью совместим с OpenAI:
curl http://localhost:8000/v1/chat/completions
-H "Content-Type: application/json"
-d '{"model": "Meta-Llama-3-70B-Instruct", "messages": [{"role": "user", "content": "Hello"}]}'
TGI: Flash Attention и богатая экосистема HuggingFace
Text Generation Inference от Hugging Face — ещё один серьёзный претендент.
Flash Attention 2 реализован нативно и даёт заметный прирост скорости за счёт оптимизированной работы с памятью GPU (IO-aware алгоритм).
Tensor Parallelism через встроенную поддержку multi-GPU без дополнительных настроек.
Богатая поддержка моделей: любая модель с HuggingFace Hub запускается без конвертации. TGI поддерживает Llama, Mistral, Falcon, Gemma и десятки других архитектур.
# Запуск TGI через Docker
docker run --gpus all
-p 8080:80
-v /models:/data
ghcr.io/huggingface/text-generation-inference:latest
--model-id /data/Meta-Llama-3-70B-Instruct
--num-shard 2
--max-batch-prefill-tokens 4096
TGI использует собственный HTTP API, но есть OpenAI-compatible endpoint на /v1/.
Бенчмарки: Llama 3 70B на 2x A100 80GB
Тестирование проводилось с нагрузкой 50 concurrent users, промпты ~200 токенов, ответы ~500 токенов.
| Метрика | vLLM | TGI |
|---|---|---|
| Throughput (req/s) | 14.2 | 11.8 |
| TTFT median (мс) | 310 | 280 |
| P99 latency (мс) | 1840 | 2100 |
| GPU utilization | 94% | 89% |
vLLM выигрывает по throughput за счёт более эффективного батчинга. TGI даёт чуть меньше TTFT на лёгкой нагрузке. На высоком concurrency преимущество vLLM становится более выраженным.
Quantization: GPTQ vs AWQ vs GGUF
Квантизация — единственный способ запустить 70B модель на потребительском железе.
GPTQ (Post-Training Quantization) — зрелый формат, хорошо поддерживается обоими движками. INT4 GPTQ даёт примерно 2x снижение качества генерации относительно FP16 (по PPL), но практически незаметно для большинства задач.
AWQ (Activation-aware Weight Quantization) — более продвинутый алгоритм, лучше сохраняет качество при том же уровне сжатия. vLLM поддерживает AWQ нативно с версии 0.3. Рекомендуется как основной формат квантизации для vLLM.
GGUF — формат llama.cpp, оптимизирован для CPU-инференса и гибридного CPU+GPU. Нативно не поддерживается ни vLLM, ни TGI — используйте llama.cpp или Ollama.
# Запуск AWQ модели в vLLM
docker run --gpus all -p 8000:8000
vllm/vllm-openai:latest
--model casperhansen/llama-3-70b-instruct-awq
--quantization awq
--tensor-parallel-size 2
Рекомендации по выбору
Выбирайте vLLM если:
- максимальный throughput критичен
- нужна OpenAI-совместимость из коробки
- используете AWQ-квантизованные модели
- работаете с high-concurrency нагрузкой
Выбирайте TGI если:
- нужна тесная интеграция с HuggingFace экосистемой
- используете кастомные модели или LoRA адаптеры
- важна минимальная TTFT при низком concurrency
- нужны streaming responses с дополнительными метаданными
Оба движка активно развиваются, разрыв в возможностях постепенно сокращается. Лучший совет — протестируйте оба на вашей конкретной модели и нагрузке, бенчмарки в интернете могут не совпадать с вашим use case.
Ollama кстати неплохой вариант если нужно быстро поднять для одного-двух разработчиков, без всей этой оркестрации. Но да, под нагрузку он не тянет, там batching практически отсутствует. Для серьёзного продакшена — только vLLM или TGI.