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-сервер