vLLM: быстрый инференс LLM на GPU — запуск на облаке
См. также — глоссарий
Задача страницы. Объяснить, что такое vLLM, когда его выбирать, и провести от первого docker run до рабочего OpenAI-совместимого API на GPU-облаке. Краткое определение термина — в глоссарии: vLLM.
Что такое vLLM
vLLM — фреймворк для высокопроизводительного инференса LLM с открытым кодом от UC Berkeley. Ключевая технология — PagedAttention: KV-кэш организован как страницы виртуальной памяти, что устраняет фрагментацию и позволяет обслуживать значительно больше параллельных сессий на той же VRAM по сравнению с наивным инференсом.
Основные характеристики:
- Continuous batching — новые запросы добавляются в батч на каждом шаге декодирования, без простоев на ожидание окончания всего батча.
- OpenAI-совместимый API из коробки —
chat/completions,completions,embeddings; не требует изменений в клиентском коде. - Широкая поддержка моделей: LLaMA 3, Mistral, Qwen 2.5, DeepSeek, Gemma 2 и большинство популярных архитектур HuggingFace.
- Квантизация: AWQ, GPTQ, fp8 — снижает требования к VRAM без значимой потери качества.
- Tensor parallelism — горизонтальное масштабирование на несколько GPU одной команды.
По throughput vLLM превосходит наивный HuggingFace inference в 10–24× при высокой нагрузке. На практике: модель 7B на RTX 4090 выдаёт 80–120 токенов/с при одиночном запросе и 400–600 токенов/с суммарно при параллельных запросах.
Когда выбирать vLLM
vLLM оптимален, когда нужен высокий суммарный throughput при умеренном числе одновременных пользователей: чат-сервисы, RAG API, массовая генерация текста.
| Характеристика | vLLM | llama.cpp | TGI | SGLang |
|---|---|---|---|---|
| Throughput (TPS) | ★★★★★ | ★★ | ★★★★ | ★★★★★ |
| Экономия памяти | ★★★★ | ★★★★★ | ★★★ | ★★★★ |
| Multi-GPU | ✓ | частично | ✓ | ✓ |
| OpenAI API | ✓ | ✓ | ✓ | ✓ |
| Квантизация | AWQ/GPTQ/fp8 | GGUF/INT4 | AWQ/GPTQ | AWQ/GPTQ |
| Лучший сценарий | Чат, RAG, batch | Тонкие инстансы, CPU | Универсальный REST | Максимум TPS на A/H |
Альтернативы: llama.cpp — если нужны тонкие инстансы и CPU-offload; TGI — для универсального REST-сервинга; SGLang — для максимального TPS на A100/H100; Ollama — для простого локального деплоя и разработки.
Запуск через Docker
Минимальный запуск
docker run --gpus all \
-p 8000:8000 \
vllm/vllm-openai:latest \
--model mistralai/Mistral-7B-Instruct-v0.2
Модель скачается с HuggingFace автоматически. Сервер поднимается на http://localhost:8000.
С квантизацией AWQ
docker run --gpus all \
-p 8000:8000 \
vllm/vllm-openai:latest \
--model TheBloke/Mistral-7B-Instruct-v0.2-AWQ \
--quantization awq
docker-compose.yml
services:
vllm:
image: vllm/vllm-openai:latest
runtime: nvidia
environment:
- NVIDIA_VISIBLE_DEVICES=all
- HF_TOKEN=${HF_TOKEN} # для моделей с закрытым доступом
- HF_HOME=/cache/huggingface
volumes:
- hf_cache:/cache/huggingface # кэш моделей между перезапусками
ports:
- "8000:8000"
command: >
--model mistralai/Mistral-7B-Instruct-v0.2
--tensor-parallel-size 1
--gpu-memory-utilization 0.90
--max-model-len 8192
--enable-prefix-caching
restart: unless-stopped
volumes:
hf_cache:
Переменные окружения:
HF_TOKEN— токен HuggingFace для доступа к закрытым моделям (Llama 3, Gemma и др.).HF_HOME— путь к кэшу; смонтируйте volume, чтобы не скачивать модели при каждом перезапуске.CUDA_VISIBLE_DEVICES— ограничить доступные GPU, например0,1.
Ключевые параметры запуска
| Параметр | Описание | Пример |
|---|---|---|
--model |
Путь к модели HuggingFace или локальный путь | meta-llama/Llama-3-8B |
--tensor-parallel-size |
Число GPU для tensor parallelism | 2 |
--quantization |
Тип квантизации: awq / gptq / fp8 | awq |
--max-model-len |
Максимальный контекст (токенов) | 8192 |
--gpu-memory-utilization |
Доля VRAM под KV-кэш и модель (0–1) | 0.90 |
--enable-prefix-caching |
Кэш общих префиксов (системный промпт) | — |
--dtype |
Тип данных: bfloat16 / float16 / float32 | bfloat16 |
--served-model-name |
Алиас модели в API | my-model |
--port |
Порт сервера | 8000 |
Тестирование API
Сервер vLLM полностью совместим с OpenAI SDK — достаточно поменять base_url:
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="token" # любое значение, если auth не настроен
)
response = client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.2",
messages=[{"role": "user", "content": "Привет! Объясни, что такое PagedAttention."}]
)
print(response.choices[0].message.content)
Стриминг:
stream = client.chat.completions.create(
model="mistralai/Mistral-7B-Instruct-v0.2",
messages=[{"role": "user", "content": "Напиши краткое эссе о GPU."}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)
Проверка через curl:
curl http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "mistralai/Mistral-7B-Instruct-v0.2",
"messages": [{"role": "user", "content": "Привет!"}]
}'
Производительность: какой GPU выбрать
| GPU | VRAM | Рекомендуемые модели | Примерный TPS (7B, BF16) |
|---|---|---|---|
| RTX 4090 | 24 GB | До 13B (BF16), до 34B (AWQ) | 80–120 т/с |
| A100 40GB | 40 GB | До 30B (BF16), до 70B (AWQ) | 150–200 т/с |
| A100 80GB | 80 GB | 70B (BF16), несколько моделей | 150–200 т/с |
| H100 80GB | 80 GB | 70B (BF16), высокий параллелизм | 300–500 т/с |
Для multi-GPU: удвойте VRAM при --tensor-parallel-size 2 (например, 2× RTX 4090 = 48 GB). Модели 65–70B на BF16 требуют минимум 2× A100 40GB или 1× A100 80GB.
Запустить vLLM на cloudcompute.ru
Выберите GPU-инстанс под вашу модель, разверните контейнер из примеров выше — сервер vLLM будет доступен через публичный IP сразу после старта.
Навигация по разделу «Инференс LLM»
Обзор: /solutions/llm-inference/
Альтернативные стеки: llama.cpp, TGI, SGLang, Ollama, TensorRT-LLM
Производительность и стоимость: Квантизация, Стоимость инференса, Стриминг
Готовы запустить?
Запустить GPU-сервер