Быстрый старт vLLM: высокопроизводительный serving LLM — в 2026 году
Установка, обслуживание и настройка vLLM в 2026 году
vLLM — это высокопроизводительный, энергоэффективный движок вывода и обслуживания для больших языковых моделей (LLM), разработанный лабораторией вычислений Sky Computing Лейденского университета Беркли (UC Berkeley).
Алгоритм PagedAttention в vLLM обрабатывает кэш KV (ключ-значение) подобно страницам виртуальной памяти операционной системы и сочетается с непрерывным батчингом — это комбинация, которая сделала vLLM стандартным движком для продакшен-обслуживания LLM. Чтобы узнать, как vLLM соотносится с Ollama, Docker Model Runner, LocalAI и облачными провайдерами, включая компромиссы между стоимостью и инфраструктурой, ознакомьтесь со статьёй Размещение LLM: локальное, self-hosted и облачная инфраструктура: сравнение.

Это руководство актуально для версии vLLM v0.31.0 (октябрь 2026 г.). Если вы приходите из старых руководств, обратите внимание на два недавних изменения: команда python -m vllm.entrypoints.openai.api_server признана устаревшей (deprecated) и выводит предупреждение — теперь стандартным CLI является vllm serve — а предсобранные колёса (wheels) по умолчанию используют CUDA 12.9, а не 11.8.
Что такое vLLM?
vLLM (virtual LLM) — это open-source библиотека для быстрого вывода и обслуживания LLM, которая быстро стала отраслевым стандартом для продакшен-развёртываний. Выпущенная в 2023 году, она ввела PagedAttention — революционную технику управления памятью, которая значительно повышает эффективность обслуживания.
Ключевые возможности
Высокая пропускная способность: Бенчмарки эпохи запуска vLLM сообщали о 14–24-кратном увеличении пропускной способности по сравнению с HuggingFace Transformers на том же оборудовании, и движок сохранил это лидерство благодаря непрерывному батчингу, оптимизированным ядрам CUDA и алгоритму PagedAttention, который устраняет фрагментацию памяти.
Совместимость с API OpenAI: vLLM включает встроенный API-сервер, полностью совместимый с форматом OpenAI. Это позволяет бесшовно мигрировать с OpenAI на self-hosted инфраструктуру без изменения кода приложения. Просто направьте API-клиент на эндпоинт vLLM, и всё будет работать прозрачно.
Алгоритм PagedAttention: Ядром инноваций в производительности vLLM является PagedAttention, который применяет концепцию пейджинга виртуальной памяти к механизмам внимания. Вместо выделения непрерывных блоков памяти для кэшей KV (что приводит к фрагментации), PagedAttention разделяет память на блоки фиксированного размера, которые могут быть выделены по мере необходимости. Это снижает потери памяти до 4 раз и позволяет использовать гораздо большие размеры батчей.
Непрерывный батчинг (Continuous Batching): В отличие от статического батчинга, когда вы ждете завершения всех последовательностей, vLLM использует непрерывный (скользящий) батчинг. Как только одна последовательность завершается, новая может быть добавлена в батч. Это максимизирует использование GPU и минимизирует задержки для входящих запросов.
Поддержка многоядерного GPU: vLLM поддерживает тензорный параллелизм и конвейерный параллелизм для распределения больших моделей по нескольким GPU. Он может эффективно обслуживать модели, которые не помещаются в память одного GPU, поддерживая конфигурации от 2 до 8+ GPU.
Широкая поддержка моделей: Совместим с популярными архитектурами моделей, включая LLaMA, Mistral, Mixtral, Qwen, Phi, Gemma и многие другие. Поддерживает как instruction-tuned, так и базовые модели из HuggingFace Hub.
Когда использовать vLLM
vLLM демонстрирует лучшие результаты в конкретных сценариях, где его сильные стороны проявляются наиболее полно:
Продакшен API-сервисы: Когда вам нужно обслуживать LLM для многих одновременных пользователей через API, высокая пропускная способность и эффективный батчинг vLLM делают его лучшим выбором. Компании, работающие с чат-ботами, помощниками по коду или сервисами генерации контента, выигрывают от его способности обрабатывать сотни запросов в секунду.
Нагрузки с высокой конкурентностью: Если ваше приложение имеет множество одновременных пользователей, делающих запросы, непрерывный батчинг и PagedAttention в vLLM позволяют обслуживать больше пользователей на том же оборудовании по сравнению с альтернативами.
Оптимизация затрат: Когда стоимость GPU является важным фактором, превосходная пропускная способность vLLM означает, что вы можете обслуживать тот же трафик с меньшим количеством GPU, напрямую снижая инфраструктурные затраты. Четырёхкратная эффективность памяти от PagedAttention также позволяет использовать более мелкие и дешёвые инстансы GPU.
Развёртывание в Kubernetes: Бессостоятельный дизайн (stateless design) и контейнерная архитектура vLLM делают его идеальным для кластеров Kubernetes. Его стабильная производительность под нагрузкой и простота управления ресурсами хорошо интегрируются с облачными нативными инфраструктурами.
Когда НЕ использовать vLLM: Для локальной разработки, экспериментов или сценариев с одним пользователем инструменты вроде Ollama или llama.cpp обеспечивают лучший пользовательский опыт с более простой настройкой. Сложность vLLM оправдана, когда вам нужны его преимущества в производительности для продакшен-нагрузок.
Как установить vLLM
Предварительные требования
Перед установкой vLLM убедитесь, что ваша система соответствует этим требованиям:
- ОС: Linux с glibc 2.35 или новее (Ubuntu 22.04+, Debian 12+, RHEL 9+)
- GPU: NVIDIA GPU с вычислительной возможностью 7.5 или выше (T4, A10, A100, L4, H100, B200, серии RTX 20/30/40/50). Старые карты поколения 7.0, такие как V100, больше не поддерживаются. GPU AMD поддерживаются через отдельные ROCm колёса — см. ROCm vs Vulkan для локального хостинга LLM на AMD для конкретных образов AMD, флагов устройств и оговорок относительно покрытия ядер.
- CUDA: Стандартные колёса pip скомпилированы против CUDA 12.9; варианты 12.8 и 13.0 публикуются рядом с ними. GPU Blackwell (B200, GB200) требуют CUDA 12.8+. Ваш драйвер NVIDIA должен быть достаточно новым для устанавливаемой версии CUDA.
- Python: 3.10 до 3.13 — рекомендуемая версия 3.12 (колёса ROCm только для 3.12)
- VRAM: Минимум 16 ГБ для моделей 7B, 24 ГБ+ для 13B, 40 ГБ+ для более больших моделей
Установка через pip
Рекомендуемый способ установки — использование uv для создания окружения Python 3.12 и автоматического выбора соответствующего бэкенда PyTorch CUDA (--torch-backend=auto инспектирует установленный драйвер). Чтобы углублённо рассмотреть сам uv, см. uv: Новый менеджер пакетов и проектов Python:
uv venv --python 3.12 --seed
source .venv/bin/activate
uv pip install vllm --torch-backend=auto
# Проверка установки
python -c "import vllm; print(vllm.__version__)"
Обычный pip также работает:
python3 -m venv vllm-env
source vllm-env/bin/activate
pip install vllm
Стандартные колёса скомпилированы против CUDA 12.9. Если вам нужна другая версия CUDA, возьмите соответствующий индекс колёс PyTorch — например, для CUDA 12.8:
pip install vllm --extra-index-url https://download.pytorch.org/whl/cu128
Старые фиксированные колёса, такие как vllm==0.4.2+cu121, больше не существуют в таком виде. Смешивание vLLM в существующем окружении с другой сборкой PyTorch — частая причина сбоев установки; проект рекомендует создавать новое окружение, а при необходимости настраивать сборку из исходников для кастомных целей CUDA.
Установка с Docker
Docker предоставляет наиболее надёжный метод развёртывания, особенно для продакшена. Фиксируйте образ на версии релиза вместо latest, чтобы обновления были осознанными, и имейте в виду, что существуют варианты образов для CUDA 12.9 (суффикс тега -cu129), AMD ROCm (vllm-openai-rocm), CPU (vllm-openai-cpu) и Intel XPU (vllm-openai-xpu):
# Загрузка официального образа vLLM
docker pull vllm/vllm-openai:v0.31.0
# Запуск vLLM с поддержкой GPU
docker run --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-p 8000:8000 \
--ipc=host \
vllm/vllm-openai:v0.31.0 \
--model Qwen/Qwen3-8B
Флаг --ipc=host важен для конфигураций с несколькими GPU, так как он обеспечивает правильную межпроцессную связь.
Сборка из исходного кода
Для последних функций или кастомных модификаций собирайте из исходного кода:
git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .
Быстрый старт с vLLM
Запуск первой модели
Запустите vLLM с моделью, используя командную строку:
# Скачивание и обслуживание модели с OpenAI-совместимым API
vllm serve Qwen/Qwen3-8B \
--port 8000
vllm serve — это текущий CLI для OpenAI-совместимого сервера. Старый вызов python -m vllm.entrypoints.openai.api_server по-прежнему работает, но выводит предупреждение об устаревании и может быть удалён в будущем релизе, поэтому обновите любые скрипты или манифесты Kubernetes, которые по-прежнему его используют.
vLLM автоматически скачает модель из HuggingFace Hub (если она не кеширована) и запустит сервер. Вы увидите вывод, указывающий на готовность сервера:
INFO: Started server process [12345]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000
Отправка API-запросов
После запуска сервера вы можете отправлять запросы, используя Python-клиент OpenAI или curl:
Использование curl:
curl http://localhost:8000/v1/completions \
-H "Content-Type: application/json" \
-d '{
"model": "Qwen/Qwen3-8B",
"prompt": "Explain what vLLM is in one sentence:",
"max_tokens": 100,
"temperature": 0.7
}'
Использование Python-клиента OpenAI:
from openai import OpenAI
# Направление на ваш сервер vLLM
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed" # vLLM игнорирует это, если вы не запустите сервер с --api-key
)
response = client.completions.create(
model="Qwen/Qwen3-8B",
prompt="Explain what vLLM is in one sentence:",
max_tokens=100,
temperature=0.7
)
print(response.choices[0].text)
API чат-комплитов (Chat Completions):
response = client.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "What is PagedAttention?"}
],
max_tokens=200
)
print(response.choices[0].message.content)
Продвинутая конфигурация
vLLM предлагает множество параметров для оптимизации производительности:
vllm serve Qwen/Qwen3-8B \
--port 8000 \
--gpu-memory-utilization 0.95 \ # Использовать 95% памяти GPU
--max-model-len 32k \ # Максимальная длина последовательности (работают и 8192, и 32k)
--tensor-parallel-size 2 \ # Использовать 2 GPU с тензорным параллелизмом
--dtype float16 \ # Использовать точность FP16
--max-num-seqs 256 # Максимальный размер батча
Ключевые параметры:
--gpu-memory-utilization: Доля памяти GPU для менеджера модели (по умолчанию 0.92). Более высокие значения позволяют использовать более крупные батчи, но оставляют меньше запаса для всплесков памяти.--max-model-len: Максимальная длина контекста. Принимает количество токенов или человекочитаемые значения, такие как32k. Уменьшение этого значения освобождает память для более крупных батчей.--tensor-parallel-size: Количество GPU, на которые следует разделить модель.--dtype: Тип данных для весов (auto,float16,bfloat16,float32).autoследует типу данных чекпоинта, что обычно является желаемым поведением.--max-num-seqs: Максимальное количество последовательностей в батче.--max-num-active-seqs: Ограничивает допуск в состояние RUNNING независимо отmax_num_seqs(новое в v0.31.0) — полезно для ограничения задержек без сужения окна батча планировщика.
vLLM vs Ollama
vLLM спроектирован для высокопроизводительного, многопользовательского продакшен-обслуживания с непрерывным батчингом, PagedAttention и поддержкой нескольких GPU. Ollama оптимизирован для быстрого локального запуска, удобства для одного пользователя и простого управления моделями.
Для подробного руководства по принятию решений, охватывающего сигналы миграции, этапы планирования, настройку Docker Compose и практический чек-лист, см. Ollama to vLLM: Когда мигрировать ваш локальный LLM-сервер.
vLLM vs Docker Model Runner
Model Runner от Docker — их официальное решение для локального развёртывания ИИ-моделей. Как он сравняется с vLLM?
Философия архитектуры
Docker Model Runner стремится быть «Docker для ИИ» — простым, стандартизированным способом запуска ИИ-моделей локально с той же лёгкостью, что и запуск контейнеров. Он абстрагирует сложность и предоставляет согласованный интерфейс для разных моделей и фреймворков.
vLLM — это специализированный движок вывода, сфокусированный исключительно на обслуживании LLM с максимальной производительностью. Это инструмент нижнего уровня, который вы контейнеризироваете с помощью Docker, а не полноценная платформа.
Настройка и старт
Установка Docker Model Runner проста для пользователей Docker:
docker model pull llama3:8b
docker model run llama3:8b
Это сходство с рабочим процессом Docker с образами делает его мгновенно знакомым разработчикам, уже использующим контейнеры; полный набор команд находится в Шпаргалке по Docker Model Runner.
vLLM требует более сложной начальной настройки (Python, CUDA, зависимости) или использования готовых Docker-образов:
docker pull vllm/vllm-openai:latest
docker run --runtime nvidia --gpus all vllm/vllm-openai:latest --model <model-name>
Характеристики производительности
vLLM обеспечивает превосходную пропускную способность для многопользовательских сценариев благодаря PagedAttention и непрерывному батчингу. Для продакшен API-сервисов, обрабатывающих сотни запросов в секунду, оптимизации vLLM обеспечивают в 2–5 раз лучшую пропускную способность по сравнению с общими подходами к обслуживанию.
Docker Model Runner фокусируется на удобстве использования, а не на максимальной производительности. Он подходит для локальной разработки, тестирования и умеренных нагрузок, но не реализует продвинутые оптимизации, которые делают vLLM выдающимся при масштабировании.
Поддержка моделей
Docker Model Runner предоставляет курируемую библиотеку моделей с доступом к популярным моделям одной командой. Он поддерживает несколько фреймворков (не только LLM), включая Stable Diffusion, Whisper и другие ИИ-модели, что делает его более универсальным для различных ИИ-нагрузок.
vLLM специализируется на выводе LLM с глубокой поддержкой трансформерных языковых моделей. Он поддерживает любую LLM, совместимую с HuggingFace, но не распространяется на другие типы ИИ-моделей, такие как генерация изображений или распознавание речи.
Продакшен-развёртывание
vLLM апробирован в продакшене в таких компаниях, как Anthropic, Replicate и многих других, обслуживающих миллиарды токенов ежедневно. Его характеристики производительности и стабильность под высокой нагрузкой делают его фактическим стандартом для продакшен-обслуживания LLM.
Docker Model Runner новее и позиционируется скорее для сценариев разработки и локального тестирования. Хотя он может обслуживать продакшен-трафик, ему не хватает проверенного времени использования и оптимизаций производительности, необходимых для продакшен-развёртываний.
Экосистема интеграций
vLLM интегрируется с инструментами продакшен-инфраструктуры: Kubernetes-операторы, метрики Prometheus, Ray для распределённого обслуживания и расширенная совместимость с API OpenAI для существующих приложений.
Docker Model Runner естественно интегрируется с экосистемой Docker и Docker Desktop. Для команд, уже стандартизированных на Docker, эта интеграция обеспечивает целостный опыт, но с меньшим количеством специализированных функций обслуживания LLM.
Когда использовать каждый
Используйте vLLM для:
- Продакшен LLM API-сервисов
- Высокопроизводительных, многопользовательских развёртываний
- Стоимость-чувствительных облачных развёртываний, требующих максимальной эффективности
- Kubernetes и облачных нативных сред
- Когда вам нужна доказанная масштабируемость и производительность
Используйте Docker Model Runner для:
- Локальной разработки и тестирования
- Запуска различных типов ИИ-моделей (не только LLM)
- Команд, глубоко вовлечённых в экосистему Docker
- Быстрых экспериментов без настройки инфраструктуры
- Обучающих и образовательных целей
Гибридный подход: Многие команды разрабатывают локально с Docker Model Runner для удобства, а затем развёртывают с vLLM в продакшене для производительности. Образы Docker Model Runner также можно использовать для запуска контейнеров vLLM, объединяя оба подхода.
Лучшие практики продакшен-развёртывания
Развёртывание с Docker
Создайте готовый к продакшену конфигурацию Docker Compose:
version: '3.8'
services:
vllm:
image: vllm/vllm-openai:latest
runtime: nvidia
environment:
- CUDA_VISIBLE_DEVICES=0,1
volumes:
- ~/.cache/huggingface:/root/.cache/huggingface
- ./logs:/logs
ports:
- "8000:8000"
command: >
--model Qwen/Qwen3-8B
--tensor-parallel-size 2
--gpu-memory-utilization 0.90
--max-num-seqs 256
--max-model-len 8192
restart: unless-stopped
shm_size: '16gb'
deploy:
resources:
reservations:
devices:
- driver: nvidia
count: 2
capabilities: [gpu]
Развёртывание в Kubernetes
Разверните vLLM в Kubernetes для продакшен-масштаба:
apiVersion: apps/v1
kind: Deployment
metadata:
name: vllm-server
spec:
replicas: 2
selector:
matchLabels:
app: vllm
template:
metadata:
labels:
app: vllm
spec:
containers:
- name: vllm
image: vllm/vllm-openai:latest
args:
- --model
- Qwen/Qwen3-8B
- --tensor-parallel-size
- "2"
- --gpu-memory-utilization
- "0.90"
resources:
limits:
nvidia.com/gpu: 2
ports:
- containerPort: 8000
volumeMounts:
- name: cache
mountPath: /root/.cache/huggingface
volumes:
- name: cache
hostPath:
path: /mnt/huggingface-cache
---
apiVersion: v1
kind: Service
metadata:
name: vllm-service
spec:
selector:
app: vllm
ports:
- port: 80
targetPort: 8000
type: LoadBalancer
Мониторинг и наблюдаемость
OpenAI-совместимый сервер по умолчанию exposes метрики Prometheus на /metrics — дополнительные флаги не нужны:
curl -s http://localhost:8000/metrics | grep '^vllm:'
Ключевые метрики для мониторинга:
vllm:num_requests_running/vllm:num_requests_waiting/vllm:num_requests_swapped— запросы в состояниях планировщика RUNNING, WAITING и SWAPPEDvllm:kv_cache_usage_perc— доля используемых блоков кэша KV (0–1)vllm:time_to_first_token_seconds— гистограмма TTFT (время до первого токена)vllm:time_per_output_token_seconds— скорость генерации на токенvllm:num_preemptions_total— накопленные преэмции (preemptions); растущий счётчик означает, что кэш KV переполнен, и запросы пересчитываются
Для дашбордов, примеров PromQL и порогов тревог вокруг обслуживания LLM, см. Мониторинг вывода LLM в продакшене (2026): Prometheus & Grafana для vLLM, TGI, llama.cpp.
Настройка производительности
Оптимизация использования памяти GPU: По умолчанию значение 0.92; настраивайте на основе наблюдаемого поведения. Более высокие значения позволяют использовать более крупные батчи, но несут риск ошибок OOM во время всплесков трафика.
Настройка максимальной длины последовательности: Если вашему сценарию не нужен полный контекст, уменьшите --max-model-len. Это освобождает память для более крупных батчей. Например, если вам нужен только контекст 4K, установите --max-model-len 4096, а не используйте максимум модели (часто 8K–32K).
Выбор подходящей квантизации: Для моделей, которые это поддерживают, используйте квантованные версии (8-bit, 4-bit), чтобы снизить потребление памяти и увеличить пропускную способность:
--quantization awq # Для AWQ квантованных моделей
--quantization gptq # Для GPTQ квантованных моделей
Кэширование префиксов (Prefix Caching): Кэширование префиксов включено по умолчанию в текущем движке, поэтому запросы, разделяющие префикс промпта (фиксированный системный промпт, шаблон контекста RAG), повторно используют его кэш KV без каких-либо флагов. Отключите его с помощью --no-enable-prefix-caching для нагрузок со многими уникальными длинными промптами, где учёт кэша ничего не даёт.
Диагностика типовых проблем
Ошибки нехватки памяти (Out of Memory)
Симптомы: Сервер аварийно завершает работу с ошибками CUDA out of memory.
Решения:
- Уменьшите
--gpu-memory-utilizationдо 0.85 или 0.80 - Уменьшите
--max-model-len, если это позволяет ваш сценарий - Снизьте
--max-num-seqs, чтобы уменьшить размер батча - Используйте квантованную версию модели
- Включите тензорный параллелизм для распределения по большему количеству GPU
Два различных типа OOM требуют разных исправлений. OOM при запуске происходит до любого запроса: vLLM профилирует память и не может выделить даже минимальный кэш KV, поэтому снижение --max-num-seqs не помогает — уменьшите --max-model-len или увеличьте --gpu-memory-utilization, если у вас есть запас. OOM во время работы под нагрузкой может быть вызвано памятью, захваченной CUDA-graph, которая масштабируется с --max-num-seqs, но находится вне учёта кэша KV; запустите один раз с --enforce-eager, чтобы проверить, являются ли CUDA-графы недостающей памятью, и протестируйте точную ту же конфигурацию перед тем, как винить кэш. Если запуски на идентичном оборудовании продолжают успешно завершаться с тем же выделением, передайте значение --kv-cache-memory-bytes, которое vLLM логирует при запуске, чтобы пропустить этап профилирования при последующих запусках.
На одиночной карте 16 ГБ большинство этих ошибок OOM сводятся к бюджету кэша KV, а не только к весам — Кэш KV на GPU с 16 ГБ рассматривает точную формулу, тип данных KV-кэша FP8 и компромиссы кэширования префиксов за --max-model-len и --max-num-seqs до того, как вы перейдёте к более маленькой модели.
Медленный запуск
Симптомы: Серверу требуются минуты от запуска до “Application startup complete”.
Решения:
- Загрузка весов, компиляция и захват CUDA-graph доминируют при запуске —
--enforce-eagerпропускает обе компиляцию и захват и показывает, сколько времени они занимают, ценой снижения скорости декодирования в стационарном режиме - Повторно используйте залогированное значение
--kv-cache-memory-bytes, чтобы пропустить этапы профилирования памяти и оценки CUDA-graph при повторяющихся запусках - В v0.30.0+ команда
vllm preloadзапускает постоянный демон кэша весов, который держит квантованные веса в памяти GPU, поэтому перезапуски движка отображают веса через CUDA IPC вместо повторного чтения с диска (--load-format ipc_cache) - Для чекпоинтов NVFP4, которые получают OOM во время компиляции при запуске, ограничение потоков сборки с помощью
MAX_JOBS=4иNVCC_THREADS=4— широко используемое исправление — это замедляет JIT-сборку, но останавливает OOM
Низкая пропускная способность
Симптомы: Сервер обрабатывает меньше запросов, чем ожидается.
Решения:
- Увеличьте
--max-num-seqs, чтобы позволить более крупные батчи - Увеличьте
--gpu-memory-utilization, если у вас есть запас - Проверьте, является ли CPU узким местом с помощью
htop– рассмотрите более быстрые CPU - Проверьте использование GPU с помощью
nvidia-smi– оно должно быть 95%+ - Включите FP16, если используете FP32:
--dtype float16
Медленное время первого токена
Симптомы: Высокая задержка перед началом генерации.
Решения:
- Используйте более мелкие модели для приложений, чувствительных к задержкам
- Кэширование префиксов включено по умолчанию — проверьте, что оно активно, вместо повторного добавления флага
- Уменьшите
--max-num-seqs, чтобы приоритизировать задержки над пропускной способностью - Рассмотрите спекулятивное декодирование для поддерживаемых моделей
- Оптимизируйте конфигурацию тензорного параллелизма
Сбои при загрузке модели
Симптомы: Сервер не запускается, не может загрузить модель.
Решения:
- Убедитесь, что название модели точно совпадает с форматом HuggingFace
- Проверьте сетевое соединение с HuggingFace Hub
- Убедитесь в наличии достаточного дискового пространства в
~/.cache/huggingface - Для закрытых моделей установите переменную окружения
HF_TOKEN - Попробуйте скачать вручную с помощью
hf download <model>(илиhuggingface-cli download <model>в старых установках)
Продвинутые функции
Спекулятивное декодирование
vLLM поддерживает спекулятивное декодирование, где меньшая модель-черновик предлагает токены, которые большая целевая модель проверяет. Это может ускорить генерацию в 1.5–2 раза. Для комплексного руководства по методам спекулятивного декодирования — модель-черновик, EAGLE-3, P-EAGLE и n-gram — см. Спекулятивное декодирование: Более быстрый вывод без потери качества.
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--speculative-config '{"method": "draft_model", "model": "meta-llama/Llama-3.2-1B-Instruct", "num_speculative_tokens": 4}'
Старые флаги --speculative-model и --num-speculative-tokens исчезли — конфигурация переместилась в единственный аргумент JSON --speculative-config, который также выбирает метод (draft_model, ngram, семейство EAGLE или MTP для моделей с нативными головками предсказания нескольких токенов).
Адаптеры LoRA
Обслуживайте несколько адаптеров LoRA поверх базовой модели, не загружая несколько полных моделей:
vllm serve meta-llama/Llama-3.1-8B-Instruct \
--enable-lora \
--lora-modules sql-lora=/path/to/sql-adapter \
code-lora=/path/to/code-adapter
Затем укажите, какой адаптер использовать для каждого запроса, поместив его имя в поле model — этот же механизм масштабируется до десятков задач-специфичных адаптеров (специфичных для клиента или доменных вариантов) с только базовой моделью, резидентной в памяти:
response = client.completions.create(
model="sql-lora", # Использование SQL-адаптера
prompt="Convert this to SQL: Show me all users created this month"
)
Кэширование префиксов
Кэширование префиксов избегает пересчета кэша KV для общих префиксов промптов и включено по умолчанию в текущем движке.
Оно даёт наибольший эффект для:
- Чат-ботов с фиксированными системными промптами
- Приложений RAG с согласованными шаблонами контекста
- Промптов few-shot обучения, повторяющихся между запросами
Для запросов, разделяющих префикс, время до первого токена значительно снижается, поскольку префилл для общей части пропускается.
Примеры интеграции
Интеграция с LangChain
from langchain_community.llms import VLLMOpenAI
llm = VLLMOpenAI(
openai_api_key="EMPTY",
openai_api_base="http://localhost:8000/v1",
model_name="Qwen/Qwen3-8B",
max_tokens=512,
temperature=0.7,
)
response = llm("Explain PagedAttention in simple terms")
print(response)
Приложение FastAPI
from fastapi import FastAPI
from openai import AsyncOpenAI
app = FastAPI()
client = AsyncOpenAI(
base_url="http://localhost:8000/v1",
api_key="not-needed"
)
@app.post("/generate")
async def generate(prompt: str):
response = await client.completions.create(
model="Qwen/Qwen3-8B",
prompt=prompt,
max_tokens=200
)
return {"result": response.choices[0].text}
Бенчмарки производительности
Данные о реальной производительности помогают проиллюстрировать преимущества vLLM. Ниже приведены цифры из документации эпохи запуска проекта и ранних замеров сообщества — рассматривайте их как показатели порядка влияния архитектуры, а не как текущие результаты для поколения моделей сегодня:
Сравнение пропускной способности (Mistral-7B на GPU A100):
- vLLM: ~3 500 токенов/секунду с 64 одновременными пользователями
- HuggingFace Transformers: ~250 токенов/секунду с той же конкурентностью
- Ollama: ~1 200 токенов/секунду с той же конкурентностью
- Результат: vLLM обеспечивает 14-кратное улучшение по сравнению с базовыми реализациями
Эффективность памяти (LLaMA-2-13B):
- Стандартная реализация: 24 ГБ VRAM, 32 одновременные последовательности
- vLLM с PagedAttention: 24 ГБ VRAM, 128 одновременных последовательностей
- Результат: В 4 раза больше одновременных запросов при той же памяти
Задержки под нагрузкой (Mixtral-8x7B на 2xA100):
- vLLM: P50 задержка 180 мс, P99 задержка 420 мс при 100 req/s
- Стандартное обслуживание: P50 задержка 650 мс, P99 задержка 3 200 мс при 100 req/s
- Результат: vLLM сохраняет стабильные задержки при высокой нагрузке
Анализ затрат
Понимание последствий для затрат при выборе vLLM:
Сценарий: Обслуживание 1 млн запросов/день
Со стандартным обслуживанием:
- Необходимо: 8x A100 GPU (80 ГБ)
- Стоимость AWS: ~$32/час × 24 × 30 = $23 040/месяц
- Стоимость за 1 млн токенов: ~$0.75
С vLLM:
- Необходимо: 2x A100 GPU (80 ГБ)
- Стоимость AWS: ~$8/час × 24 × 30 = $5 760/месяц
- Стоимость за 1 млн токенов: ~$0.19
- Экономия: $17 280/месяц (снижение на 75%)
Это преимущество в стоимости растёт с масштабом. Организации, обслуживающие миллиарды токенов ежемесячно, экономят сотни тысяч долларов, используя оптимизированное обслуживание vLLM вместо наивных реализаций.
Соображения по безопасности
Аутентификация
vLLM поставляется со встроенным флагом --api-key, но, согласно официальной документации, он аутентифицирует только эндпоинты под префиксами путей /v1, /v2 и /inference — другие эндпоинты на том же сервере остаются неаутентифицированными. Рассматривайте его как один слой, а не как полный ответ; для полного покрытия реализуйте аутентификацию на уровне обратного прокси:
# Конфигурация Nginx
location /v1/ {
auth_request /auth;
proxy_pass http://vllm-backend:8000;
}
location /auth {
proxy_pass http://auth-service:8080/verify;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header X-Original-URI $request_uri;
}
Используйте API-шлюзы, такие как Kong, Traefik или AWS API Gateway, для корпоративной аутентификации и ограничения частоты запросов.
Сетевая изоляция
Запускайте vLLM в частных сетях, а не прямо экспонируйте в интернет:
# Пример NetworkPolicy Kubernetes
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: vllm-access
spec:
podSelector:
matchLabels:
app: vllm
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
role: api-gateway
ports:
- protocol: TCP
port: 8000
Ограничение частоты запросов
Реализуйте ограничение частоты запросов для предотвращения злоупотреблений:
# Пример использования Redis для ограничения частоты
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import redis
from datetime import datetime, timedelta
app = FastAPI()
redis_client = redis.Redis(host='localhost', port=6379)
@app.middleware("http")
async def rate_limit_middleware(request, call_next):
client_ip = request.client.host
key = f"rate_limit:{client_ip}"
requests = redis_client.incr(key)
if requests == 1:
redis_client.expire(key, 60) # 60-секундное окно
if requests > 60: # 60 запросов в минуту
raise HTTPException(status_code=429, detail="Rate limit exceeded")
return await call_next(request)
Контроль доступа к моделям
Для мульти-тенантовых развёртываний контролируйте, какие пользователи имеют доступ к каким моделям:
ALLOWED_MODELS = {
"user_tier_1": ["Qwen/Qwen3-8B"],
"user_tier_2": ["Qwen/Qwen3-8B", "meta-llama/Llama-2-13b-chat-hf"],
"admin": ["*"] # Все модели
}
def verify_model_access(user_tier: str, model: str) -> bool:
allowed = ALLOWED_MODELS.get(user_tier, [])
return "*" in allowed or model in allowed
Руководство по миграции
С OpenAI на vLLM
Миграция с OpenAI на self-hosted vLLM проста благодаря совместимости API:
До (OpenAI):
from openai import OpenAI
client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
model="gpt-3.5-turbo",
messages=[{"role": "user", "content": "Hello"}]
)
После (vLLM):
from openai import OpenAI
client = OpenAI(
base_url="https://your-vllm-server.com/v1",
api_key="your-internal-key" # Если вы добавили аутентификацию
)
response = client.chat.completions.create(
model="Qwen/Qwen3-8B",
messages=[{"role": "user", "content": "Hello"}]
)
Необходимо всего два изменения: обновить base_url и название model. Весь остальной код остаётся идентичным.
С Ollama на vLLM
Ollama использует другой формат API. Базовое изменение на стороне клиента — переключение с REST-эндпоинта Ollama на OpenAI-совместимый API vLLM:
API Ollama:
import requests
response = requests.post('http://localhost:11434/api/generate',
json={'model': 'llama2', 'prompt': 'Why is the sky blue?'})
Эквивалент в vLLM:
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
response = client.completions.create(
model="meta-llama/Llama-2-7b-chat-hf",
prompt="Why is the sky blue?"
)
API Ollama — это простой REST с собственной формой запроса, тогда как vLLM говорит на протоколе OpenAI — это различие в формате API является основным изменением на стороне клиента, и поэтапный подход (запуск обоих серверов, сдвиг трафика эндпоинт за эндпоинтом) описан в руководстве по миграции, на которое дана ссылка ранее в этой статье.
С HuggingFace Transformers на vLLM
Миграция прямого использования Python:
HuggingFace:
from transformers import AutoModelForCausalLM, AutoTokenizer
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen3-8B")
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-8B")
inputs = tokenizer("Hello", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=100)
result = tokenizer.decode(outputs[0])
vLLM:
from vllm import LLM, SamplingParams
llm = LLM(model="Qwen/Qwen3-8B")
sampling_params = SamplingParams(max_tokens=100)
outputs = llm.generate("Hello", sampling_params)
result = outputs[0].outputs[0].text
Python API vLLM проще и намного быстрее для пакетного вывода.
Недавние релизы: Что изменилось в 2026 году
Три релиза в сентябре–октябре 2026 (v0.29.0, v0.30.0, v0.31.0) показывают, куда направлено развитие:
Быстрые перезапуски: vllm preload запускает постоянный демон кэша весов на каждый GPU, который держит квантованные, разделённые по TP веса резидентными в памяти GPU, поэтому перезапущенные движки отображают их через CUDA IPC (--load-format ipc_cache) вместо повторного чтения с диска. Экспериментальная vllm snapshot create/restore снимает снапшот полностью инициализированного движка с CRIU.
Спекулятивное декодирование в Model Runner V2: спекулятивное декодирование с моделью-черновиком, кастомные обработчики логитов и адаптивная проверка перемещены на новый модельный раннер, с добавлением драфта LiLiCorr и асинхронного планирования для драфта DFlash.
Обслуживание MoE в больших масштабах: новые сбалансированные бэкенды all2all с экспертным параллелизмом (--all2all-backend moonep), DeepEPv2 с последовательным параллелизмом, EPLB с перекрытием общего эксперта и параллелизм префилл-контекста, комбинированный с параллелизмом данных.
Контроль планирования: --max-num-active-seqs ограничивает допуск в состояние RUNNING независимо от max_num_seqs, и очередь ожидания теперь планирует запросы, которые уже удерживают блоки KV, в первую очередь.
Пункты дорожной карты из старых руководств по vLLM давно вышли — поддержка GGUF, мультимодальное обслуживание, дизагрегированный префилл/декод и многосерверный вывод являются частью текущих релизов, поэтому относитесь к любому руководству, которое перечисляет их как «скоро», к устаревшим. Заметки о релизах для каждой версии находятся на странице релизов vLLM.
Полезные ссылки
Связанные статьи на этом сайте
-
Шпаргалка по Ollama - Полное справочное руководство по командам Ollama и шпаргалка, охватывающая установку, управление моделями, использование API и лучшие практики для локального развёртывания LLM. Необходимо для разработчиков, использующих Ollama вместе с vLLM или вместо него.
-
Docker Model Runner vs Ollama: Что выбрать? - Глубокое сравнение Model Runner от Docker и Ollama для локального развёртывания LLM, анализ производительности, поддержки GPU, совместимости API и случаев использования. Помогает понять конкурентную среду, в которой работает vLLM.
Внешние ресурсы и документация
-
Репозиторий vLLM на GitHub - Официальный репозиторий vLLM с исходным кодом, исчерпывающей документацией, руководствами по установке и активными обсуждениями сообщества. Необходимый ресурс для отслеживания последних функций и решения проблем.
-
Документация vLLM - Официальная документация, охватывающая все аспекты vLLM от базовой настройки до продвинутой конфигурации. Включает ссылки на API, руководства по настройке производительности и лучшие практики развёртывания.
-
Статья о PagedAttention - Академическая статья, представляющая алгоритм PagedAttention, обеспечивающий эффективность vLLM. Обязательное чтение для понимания технических инноваций, стоящих за преимуществами производительности vLLM.
-
Блог vLLM - Официальный блог vLLM с анонсами релизов, бенчмарками производительности, техническими глубинными разборами и примерами из продакшен-развёртываний сообщества.
-
Хаб моделей HuggingFace - Комплексный репозиторий open-source LLM, которые работают с vLLM. Ищите модели по размеру, задаче, лицензии и характеристикам производительности, чтобы найти подходящую модель для вашего сценария.
-
Документация Ray Serve - Документация фреймворка Ray Serve для построения масштабируемых, распределённых развёртываний vLLM. Ray предоставляет продвинутые функции, такие как автоскейлинг, обслуживание нескольких моделей и управление ресурсами для продакшен-систем.
-
NVIDIA TensorRT-LLM - TensorRT-LLM от NVIDIA для высокооптимизированного вывода на GPU NVIDIA. Альтернатива vLLM с другими стратегиями оптимизации, полезная для сравнения и понимания ландшафта оптимизации вывода.
-
Справка по API OpenAI - Официальная документация API OpenAI, с которой совместим API vLLM. Ссылайтесь на неё при создании приложений, которые должны работать как с OpenAI, так и с self-hosted эндпоинтами vLLM взаимозаменяемо.