Как развернуть LLM на сервере с vLLM
Как развернуть языковую модель на своём сервере с помощью vLLM — от установки до оптимизации производительности.
vLLM — фреймворк для быстрого запуска языковых моделей на серверах с GPU. Проект разработан в UC Berkeley и стал стандартом для продакшен-деплоя LLM: по бенчмаркам vLLM обслуживает в 2–10 раз больше запросов в секунду, чем наивный запуск через Hugging Face Transformers. Если Ollama — решение для персонального использования, то vLLM — для серверов и команд.
Почему не просто Transformers
При наивном запуске через transformers.pipeline GPU простаивает 60–80% времени из-за неэффективного управления памятью. vLLM решает это тремя технологиями:
PagedAttention — механизм управления KV-кэшем, аналогичный виртуальной памяти в операционных системах. Память выделяется блоками по мере необходимости, а не заранее для максимальной длины. Это сокращает потери памяти на 50–90%.
Continuous batching — запросы группируются и обрабатываются пакетами. Новые запросы добавляются в текущий пакет, не дожидаясь завершения предыдущих. Это увеличивает пропускную способность в 5–10 раз по сравнению со статическим батчингом.
Tensor parallelism — распределение модели по нескольким GPU для моделей, которые не помещаются в одну карту.
Требования к серверу
Минимальные требования зависят от размера модели. Ориентировочно: Llama 3.1 8B (FP16) — 16 ГБ VRAM (RTX 4090 или A100 40GB). Llama 3.1 70B (FP16) — 140 ГБ VRAM (2× A100 80GB или 4× A100 40GB). Для квантизированных моделей (AWQ, GPTQ) требования вдвое ниже.
Операционная система: Linux (Ubuntu 22.04 рекомендуется). CUDA 12.1+, Python 3.9+.
Установка
# Установка через pip
pip install vllm
# Или через Docker (рекомендуется для продакшена)
docker run --runtime nvidia --gpus all \
-v ~/.cache/huggingface:/root/.cache/huggingface \
-p 8000:8000 \
vllm/vllm-openai:latest \
--model meta-llama/Llama-3.1-8B-InstructDocker-образ включает все зависимости и CUDA-драйверы. Модель загружается автоматически из Hugging Face при первом запуске.
Запуск сервера
vLLM предоставляет OpenAI-совместимый API — это значит, что любой код, написанный для GPT API, будет работать без изменений:
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3.1-8B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--max-model-len 8192 \
--gpu-memory-utilization 0.9Ключевые параметры:
--max-model-len — максимальная длина контекста. По умолчанию берётся из конфигурации модели (для Llama 3.1 — 128K), но это требует много памяти. Ограничьте до реально необходимого: 4096–8192 для большинства задач.
--gpu-memory-utilization — доля VRAM, которую vLLM использует для KV-кэша. 0.9 — оптимально, оставляет 10% для системных нужд.
Использование через OpenAI SDK
from openai import OpenAI
# Указываем локальный сервер вместо OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
response = client.chat.completions.create(
model="meta-llama/Llama-3.1-8B-Instruct",
messages=[
{"role": "system", "content": "Ты — полезный ассистент."},
{"role": "user", "content": "Объясни PagedAttention в двух предложениях"}
],
temperature=0.7,
max_tokens=256
)
print(response.choices[0].message.content)Совместимость с OpenAI SDK означает, что Telegram-боты, RAG-системы и другие приложения, написанные для GPT, переключаются на локальную модель заменой одной строки.
Квантизированные модели
Для серверов с ограниченной VRAM используйте квантизированные версии моделей:
python -m vllm.entrypoints.openai.api_server \
--model TheBloke/Llama-3.1-8B-Instruct-AWQ \
--quantization awq \
--max-model-len 8192AWQ-квантизация сокращает потребление памяти вдвое при минимальной потере качества (1–3% на бенчмарках). GPTQ — альтернатива с похожими характеристиками. Подробнее о квантизации — в отдельном гайде.
Мониторинг и метрики
vLLM экспортирует метрики в формате Prometheus на эндпоинте /metrics. Ключевые метрики для мониторинга:
vllm:num_requests_running — текущее число обрабатываемых запросов. vllm:num_requests_waiting — очередь ожидания. Если очередь растёт — сервер не справляется с нагрузкой. vllm:gpu_cache_usage_perc — заполненность KV-кэша. При 100% новые длинные запросы будут ждать освобождения памяти.
Подключите Grafana для визуализации и настройте алерты на рост очереди.
Масштабирование
Горизонтальное масштабирование — запуск нескольких экземпляров vLLM за балансировщиком нагрузки (nginx, HAProxy). Каждый экземпляр обслуживает одну копию модели на одном или нескольких GPU.
Вертикальное масштабирование — распределение одной большой модели по нескольким GPU через --tensor-parallel-size:
# Llama 70B на 4 GPU
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Llama-3.1-70B-Instruct \
--tensor-parallel-size 4vLLM vs альтернативы
vLLM — не единственный вариант. TGI (Text Generation Inference) от Hugging Face — близкий конкурент с похожими возможностями, интеграция с экосистемой HF. LocalAI — совместим с OpenAI API, поддерживает не только LLM, но и Whisper, Stable Diffusion. SGLang — новый проект, обещающий ещё более высокую производительность через оптимизацию графа вычислений. Для большинства сценариев vLLM — безопасный выбор с большим сообществом и предсказуемым поведением.
Подробнее: Как настроить локальную языковую модель
vLLM: быстрый старт и ключевые настройки
vLLM — самый производительный inference-сервер для open source LLM. Использует PagedAttention для эффективного управления KV-кэшем, что позволяет обслуживать в 10–24 раза больше запросов параллельно по сравнению с наивной реализацией.
Установка и запуск
# Установка
pip install vllm
# Запуск сервера (OpenAI-совместимый API)
python -m vllm.entrypoints.openai.api_server --model mistralai/Mistral-7B-Instruct-v0.3 --port 8000 --tensor-parallel-size 1 # для одной GPU
Сравнение inference-серверов
| Сервер | Throughput | Latency | Простота настройки | Фичи |
|---|---|---|---|---|
| vLLM | ★★★★★ | ★★★★☆ | ★★★☆☆ | Batching, LoRA, Quantization |
| Ollama | ★★★☆☆ | ★★★★☆ | ★★★★★ | Простота, GGUF |
| LM Studio | ★★★☆☆ | ★★★★☆ | ★★★★★ | GUI, GGUF |
| TGI (HuggingFace) | ★★★★☆ | ★★★★★ | ★★★☆☆ | Streaming, Flash Attention |
| llama.cpp server | ★★★☆☆ | ★★★★☆ | ★★★★☆ | CPU+GPU, GGUF |
Оптимизация производительности vLLM
Quantization: GPTQ и AWQ квантизация снижают потребление VRAM в 2–4 раза с минимальной потерей качества. Запуск с квантизированной моделью: --quantization gptq.
Tensor Parallelism: для моделей 70B+ используйте несколько GPU: --tensor-parallel-size 4 распределяет веса на 4 карты.
Max Model Len: ограничьте контекстное окно под вашу задачу: --max-model-len 4096. Уменьшает потребление памяти KV-кэша.
Когда vLLM, когда Ollama
vLLM → продакшен-сервис с параллельными запросами, нужен максимальный throughput, работа с GPU кластером
Ollama → локальная разработка, один пользователь, нужна простота без конфигурации
llama.cpp → CPU-инференс, ограниченная GPU VRAM, GGUF форматы
Сравнение фреймворков для self-hosted LLM инференса
| Фреймворк | Производительность | OpenAI-совместимый API | Поддержка моделей | Сложность |
|---|---|---|---|---|
| vLLM | ★★★★★ (PagedAttention) | Да | Llama, Mistral, Qwen, Gemma… | Средняя |
| Ollama | ★★★☆☆ | Да | 80+ моделей (GGUF) | Низкая |
| LMStudio | ★★★☆☆ | Да | GGUF формат | Низкая (GUI) |
| llama.cpp server | ★★★★☆ | Да | GGUF формат | Средняя |
| TGI (HuggingFace) | ★★★★☆ | Частично | Широкая | Высокая |
Быстрый старт: vLLM за 5 минут
# Установка
pip install vllm
# Запуск сервера с Llama 3.1 8B
python -m vllm.entrypoints.openai.api_server \
--model meta-llama/Meta-Llama-3.1-8B-Instruct \
--host 0.0.0.0 \
--port 8000 \
--gpu-memory-utilization 0.9
# Тест через curl
curl http://localhost:8000/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model": "meta-llama/Meta-Llama-3.1-8B-Instruct",
"messages": [{"role": "user", "content": "Привет!"}]}'Ollama: самый простой способ запустить LLM
# macOS / Linux
curl -fsSL https://ollama.ai/install.sh | sh
# Скачать и запустить Llama 3.2 3B
ollama run llama3.2
# Запустить как API-сервер
ollama serve # слушает на порту 11434
# Запрос к API (OpenAI-совместимый)
curl http://localhost:11434/v1/chat/completions \
-H 'Content-Type: application/json' \
-d '{"model": "llama3.2",
"messages": [{"role": "user", "content": "Привет!"}]}'Рекомендации по выбору GPU
- 7B–8B модели: RTX 3060 12 ГБ / RTX 4060 Ti 16 ГБ — от 25 000 ₽; скорость ~40–60 tok/s
- 13B–14B модели: RTX 3090 24 ГБ / RTX 4090 24 ГБ — от 70 000 ₽; скорость ~30–50 tok/s
- 70B модели (квантизованные): 2× RTX 3090 или A100 40 ГБ; cloud: RunPod A100 от $1.39/час
- CPU-инференс: llama.cpp с Q4 квантизацией — 7B работает на 16 ГБ RAM, ~5–10 tok/s
Интеграция с приложением (Python)
from openai import OpenAI
# Подключение к локальному vLLM серверу
client = OpenAI(
base_url='http://localhost:8000/v1',
api_key='not-needed'
)
response = client.chat.completions.create(
model='meta-llama/Meta-Llama-3.1-8B-Instruct',
messages=[{'role': 'user', 'content': 'Напиши функцию сортировки на Python'}]
)
print(response.choices[0].message.content)Стандартный OpenAI SDK работает с vLLM и Ollama без изменений — достаточно поменять base_url.