Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

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.

4 Ответа

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

  1. По OpenAI совместимости: vLLM реально работает как дроп-ин замена, менял base_url в конфиге клиента и всё. С TGI пришлось чуть поправить обработку stream=True ответов, небольшие отличия в формате всё же есть.

  1. В Kubernetes vLLM неплохо живёт через helm chart от vllm-project, но надо аккуратно настраивать liveness probe — модель грузится долго и дефолтные таймауты убивают под до того как он поднялся. Увеличивайте initialDelaySeconds до 300+ для больших моделей.