vLLM и инференс-серверы

Материал из llmdocs — справочник разработчика
vLLM и инференс-серверы
vLLMUC Berkeley (Sky Computing Lab), 2023
Лицензия vLLMApache 2.0
Ключевая идеяPagedAttention — KV-кэш страницами
APIOpenAI-совместимый (/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.

См. также

Источники

  1. vLLM Documentation
  2. Kwon et al. — Efficient Memory Management for LLM Serving with PagedAttention (SOSP 2023)
  3. SGLang Documentation
  4. NVIDIA TensorRT-LLM
  5. Hugging Face Text Generation Inference
  6. Yu et al. — Orca: A Distributed Serving System for Transformer-Based Generative Models (OSDI 2022)