vLLM и инференс-серверы
| vLLM | UC Berkeley (Sky Computing Lab), 2023 |
|---|---|
| Лицензия vLLM | Apache 2.0 |
| Ключевая идея | PagedAttention — KV-кэш страницами |
| API | OpenAI-совместимый (/v1/chat/completions) |
| Другие серверы | SGLang, TGI, TensorRT-LLM, LMDeploy, llama.cpp server |
| Железо | NVIDIA, AMD, Intel, TPU, CPU |
Инференс-серверы LLM — программы, которые загружают большую языковую модель на GPU и обслуживают запросы многих пользователей одновременно, выжимая максимум из дорогого железа. Самый популярный открытый сервер — vLLM, созданный в Калифорнийском университете в Беркли. Он и его аналоги — SGLang, TGI, TensorRT-LLM — предоставляют HTTP API, совместимый с OpenAI, поэтому существующие клиенты и фреймворки работают с ними без изменений.
Почему нужен специальный сервер
Наивный запуск модели через model.generate() обрабатывает запросы по одному и использует GPU на несколько процентов. Генерация текста состоит из двух фаз:
- prefill — обработка всего промпта сразу; упирается в вычисления;
- decode — генерация по одному токену за шаг; упирается в пропускную способность памяти, потому что на каждом шаге нужно прочитать все веса модели.
Чтобы decode был эффективным, нужно обрабатывать много запросов в одном батче. Но запросы разной длины начинаются и заканчиваются в разное время, а для каждого хранится KV-кэш — промежуточные ключи и значения механизма внимания для всех предыдущих токенов, — который занимает гигабайты и растёт с длиной контекста.
Ключевые техники
PagedAttention. Главная идея vLLM: хранить KV-кэш не сплошным куском под максимальную длину, а блоками фиксированного размера, как страницы виртуальной памяти в операционной системе.[2] Это почти устраняет фрагментацию (в ранних системах до 60–80% памяти KV-кэша пропадало), позволяет держать в батче в несколько раз больше запросов и разделять общие префиксы между запросами без копирования.
Непрерывный батчинг (continuous batching). Новые запросы добавляются в батч на каждом шаге генерации, а завершённые сразу освобождают место — не нужно ждать окончания самого длинного ответа.[6]
Кэширование префиксов. KV-кэш общего начала промптов (системная инструкция, документ) переиспользуется между запросами — локальный аналог кэширования промптов у облачных провайдеров. SGLang развивает эту идею структурой RadixAttention.[3]
Прочее. Спекулятивное декодирование (маленькая модель предлагает токены, большая проверяет), chunked prefill, тензорный и конвейерный параллелизм на нескольких GPU, квантизация (FP8, AWQ, GPTQ), обслуживание нескольких адаптеров LoRA поверх одной модели, структурированный вывод по JSON-схеме.
Запуск vLLM
pip install vllm
vllm serve Qwen/Qwen2.5-7B-Instruct \
--max-model-len 32768 --gpu-memory-utilization 0.9
Сервер слушает http://localhost:8000/v1 и принимает запросы в формате OpenAI:[1]
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")
r = client.chat.completions.create(
model="Qwen/Qwen2.5-7B-Instruct",
messages=[{"role": "user", "content": "Что такое PagedAttention?"}],
)
print(r.choices[0].message.content)
Модели загружаются с Hugging Face; для больших моделей добавляют --tensor-parallel-size 4, чтобы распределить веса по четырём GPU. Есть официальный Docker-образ и Helm-чарты для Kubernetes.
Сравнение серверов
| Сервер | Разработчик | Особенности |
|---|---|---|
| vLLM | UC Berkeley и сообщество | самая широкая поддержка моделей и железа, стандарт де-факто |
| SGLang | LMSYS | RadixAttention, быстрый структурированный вывод, сильная производительность |
| TensorRT-LLM | NVIDIA | максимальная скорость на GPU NVIDIA, компиляция движка под модель[4] |
| TGI | Hugging Face | интеграция с экосистемой HF[5] |
| LMDeploy | Shanghai AI Lab | быстрый движок TurboMind, квантизация |
| llama.cpp server, Ollama | сообщество | CPU, Apple Silicon, потребительские GPU, формат GGUF |
Для одного пользователя на ноутбуке удобнее llama.cpp и Ollama; для сервиса с десятками одновременных запросов на серверных GPU — vLLM или SGLang.
Метрики
- TTFT (time to first token) — задержка до первого токена, важна для чатов;
- TPOT / ITL — время на каждый следующий токен, определяет скорость «печати»;
- пропускная способность — токенов в секунду на весь сервер при заданной нагрузке;
- стоимость — рублей или долларов за миллион токенов.
Эти метрики конфликтуют: больший батч повышает пропускную способность, но увеличивает задержку каждого запроса. Настройку проверяют нагрузочным тестом (vllm bench serve) на реалистичных длинах промптов и ответов, а в продакшене экспортируют метрики сервера в Prometheus.