Serving Llms Vllm

vLLM: высокопроизводительный инференс LLM, OpenAI API, квантование.

Метаданные навыка

ИсточникОпциональный — установите командой hermes skills install official/mlops/serving-llms-vllm
Путьoptional-skills/mlops/inference/serving-llms-vllm
Версия1.0.1
АвторOrchestra Research
ЛицензияMIT
Зависимостиvllm, torch, transformers
Платформыlinux, macos
ТегиvLLM, Inference Serving, PagedAttention, Continuous Batching, High Throughput, Production, OpenAI API, Quantization, Tensor Parallelism

Справочник: полный SKILL.md

инфо

Ниже приведено полное определение навыка, которое Hermes загружает при его активации. Именно это агент получает в качестве инструкций, когда навык задействован.

vLLM — высокопроизводительный инференс LLM

Когда использовать

Применяйте при развёртывании продакшн-API для LLM, оптимизации задержки и пропускной способности инференса или при обслуживании моделей с ограниченной памятью GPU. Поддерживает OpenAI-совместимые эндпоинты, квантование (GPTQ/AWQ/FP8) и тензорный параллелизм.

Быстрый старт

vLLM даёт в 24 раза более высокую пропускную способность, чем стандартные transformers, — за счёт PagedAttention (блочного KV-кэша) и continuous batching (смешивания запросов prefill и decode).

Установка:

pip install vllm

Базовый офлайн-инференс:

from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Meta-Llama-3-8B-Instruct")
sampling = SamplingParams(temperature=0.7, max_tokens=256)

outputs = llm.generate(["Explain quantum computing"], sampling)
print(outputs[0].outputs[0].text)

OpenAI-совместимый сервер:

vllm serve meta-llama/Meta-Llama-3-8B-Instruct

# Запрос через OpenAI SDK
python -c "
from openai import OpenAI
client = OpenAI(base_url='http://localhost:8000/v1', api_key='EMPTY')
print(client.chat.completions.create(
    model='meta-llama/Meta-Llama-3-8B-Instruct',
    messages=[{'role': 'user', 'content': 'Hello!'}]
).choices[0].message.content)
"

Типичные сценарии работы

Сценарий 1: развёртывание production API

Скопируйте этот чек-лист и отмечайте прогресс:

Deployment Progress:
- [ ] Step 1: Configure server settings
- [ ] Step 2: Test with limited traffic
- [ ] Step 3: Enable monitoring
- [ ] Step 4: Deploy to production
- [ ] Step 5: Verify performance metrics

Шаг 1: настройка параметров сервера

Выберите конфигурацию в зависимости от размера модели:

# Для моделей 7B-13B на одном GPU
vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
  --gpu-memory-utilization 0.9 \
  --max-model-len 8192 \
  --port 8000

# Для моделей 30B-70B с тензорным параллелизмом
vllm serve meta-llama/Meta-Llama-3-70B-Instruct \
  --tensor-parallel-size 4 \
  --gpu-memory-utilization 0.9 \
  --quantization awq \
  --port 8000

# Для продакшена с кэшированием (метрики Prometheus отдаются
# автоматически на /metrics на порту API)
vllm serve meta-llama/Meta-Llama-3-8B-Instruct \
  --gpu-memory-utilization 0.9 \
  --enable-prefix-caching \
  --port 8000 \
  --host 0.0.0.0

Шаг 2: тестирование на ограниченном трафике

Прогоните нагрузочный тест перед продакшеном:

# Установите инструмент нагрузочного тестирования
pip install locust

# Создайте test_load.py с примерами запросов
# Запуск: locust -f test_load.py --host http://localhost:8000

Проверьте, что TTFT (time to first token) < 500ms и пропускная способность > 100 запросов/сек.

Шаг 3: включение мониторинга

vLLM отдаёт метрики Prometheus по адресу /metrics на порту API (по умолчанию 8000):

curl http://localhost:8000/metrics | grep vllm

Ключевые метрики для мониторинга:

  • vllm:time_to_first_token_seconds — задержка
  • vllm:num_requests_running — активные запросы
  • vllm:gpu_cache_usage_perc — использование KV-кэша

Шаг 4: развёртывание в продакшен

Используйте Docker для стабильного развёртывания:

# Запуск vLLM в Docker
docker run --gpus all -p 8000:8000 \
  vllm/vllm-openai:latest \
  --model meta-llama/Meta-Llama-3-8B-Instruct \
  --gpu-memory-utilization 0.9 \
  --enable-prefix-caching

Шаг 5: проверка показателей производительности

Убедитесь, что развёртывание соответствует целевым показателям:

  • TTFT < 500ms (для коротких промптов)
  • Пропускная способность > целевого значения запросов/сек
  • Использование GPU > 80%
  • Нет ошибок OOM в логах

Сценарий 2: офлайн-инференс батчами

Для обработки больших датасетов без накладных расходов на сервер.

Скопируйте этот чек-лист:

Batch Processing:
- [ ] Step 1: Prepare input data
- [ ] Step 2: Configure LLM engine
- [ ] Step 3: Run batch inference
- [ ] Step 4: Process results

Шаг 1: подготовка входных данных

# Загрузка промптов из файла
prompts = []
with open("prompts.txt") as f:
    prompts = [line.strip() for line in f]

print(f"Loaded {len(prompts)} prompts")

Шаг 2: настройка LLM-движка

from vllm import LLM, SamplingParams

llm = LLM(
    model="meta-llama/Meta-Llama-3-8B-Instruct",
    tensor_parallel_size=2,  # Используем 2 GPU
    gpu_memory_utilization=0.9,
    max_model_len=4096
)

sampling = SamplingParams(
    temperature=0.7,
    top_p=0.95,
    max_tokens=512,
    stop=["</s>", "\n\n"]
)

Шаг 3: запуск пакетного инференса

vLLM автоматически батчирует запросы для эффективности:

# Обработка всех промптов за один вызов
outputs = llm.generate(prompts, sampling)

# vLLM сам управляет батчированием
# Не нужно вручную разбивать промпты на части

Шаг 4: обработка результатов

# Извлечение сгенерированного текста
results = []
for output in outputs:
    prompt = output.prompt
    generated = output.outputs[0].text
    results.append({
        "prompt": prompt,
        "generated": generated,
        "tokens": len(output.outputs[0].token_ids)
    })

# Сохранение в файл
import json
with open("results.jsonl", "w") as f:
    for result in results:
        f.write(json.dumps(result) + "\n")

print(f"Processed {len(results)} prompts")

Сценарий 3: обслуживание квантованной модели

Разместите большие модели в ограниченной памяти GPU.

Quantization Setup:
- [ ] Step 1: Choose quantization method
- [ ] Step 2: Find or create quantized model
- [ ] Step 3: Launch with quantization flag
- [ ] Step 4: Verify accuracy

Шаг 1: выбор метода квантования

  • AWQ: лучше всего для моделей 70B, минимальная потеря точности
  • GPTQ: широкая поддержка моделей, хорошее сжатие
  • FP8: самый быстрый вариант на GPU H100

Шаг 2: найти или создать квантованную модель

Используйте готовые квантованные модели с HuggingFace:

# Поиск моделей AWQ
# Пример: TheBloke/Llama-2-70B-AWQ

Шаг 3: запуск с флагом квантования

# Использование готовой квантованной модели
vllm serve TheBloke/Llama-2-70B-AWQ \
  --quantization awq \
  --tensor-parallel-size 1 \
  --gpu-memory-utilization 0.95

# Результат: модель 70B помещается в ~40GB VRAM

Шаг 4: проверка точности

Проверьте, что выходы соответствуют ожидаемому качеству:

# Сравнение ответов квантованной и неквантованной модели
# Проверка, что качество на конкретной задаче не просело

Когда использовать, а когда — альтернативы

Используйте vLLM, если:

  • Разворачиваете продакшн-API для LLM (100+ запросов/сек)
  • Обслуживаете OpenAI-совместимые эндпоинты
  • Памяти GPU не хватает, а модель нужна большая
  • Многопользовательские приложения (чат-боты, ассистенты)
  • Нужна низкая задержка при высокой пропускной способности

Используйте альтернативы:

  • llama.cpp: инференс на CPU/edge-устройствах, один пользователь
  • HuggingFace transformers: исследования, прототипирование, разовая генерация
  • TensorRT-LLM: только NVIDIA, нужна максимальная производительность
  • Text-Generation-Inference: уже используете экосистему HuggingFace

Частые проблемы

Проблема: не хватает памяти при загрузке модели

Снизьте потребление памяти:

vllm serve MODEL \
  --gpu-memory-utilization 0.7 \
  --max-model-len 4096

Или используйте квантование:

vllm serve MODEL --quantization awq

Проблема: медленный первый токен (TTFT > 1 секунды)

Включите prefix caching для повторяющихся промптов:

vllm serve MODEL --enable-prefix-caching

Для длинных промптов включите chunked prefill:

vllm serve MODEL --enable-chunked-prefill

Проблема: ошибка «модель не найдена»

Используйте --trust-remote-code для кастомных моделей:

vllm serve MODEL --trust-remote-code

Проблема: низкая пропускная способность (<50 req/sec)

Увеличьте число одновременных последовательностей:

vllm serve MODEL --max-num-seqs 512

Проверьте загрузку GPU через nvidia-smi — должна быть выше 80%.

Проблема: инференс медленнее, чем ожидалось

Убедитесь, что число GPU для тензорного параллелизма — степень двойки:

vllm serve MODEL --tensor-parallel-size 4  # А не 3

Включите speculative decoding для более быстрой генерации (конфиг передаётся как JSON; флаг --speculative-model убрали в пользу --speculative-config):

vllm serve MODEL \
  --speculative-config '{"model": "DRAFT_MODEL", "num_speculative_tokens": 5, "method": "draft_model"}'

Продвинутые темы

Паттерны развёртывания сервера: см. references/server-deployment.md — конфигурации для Docker, Kubernetes и балансировки нагрузки.

Оптимизация производительности: см. references/optimization.md — настройка PagedAttention, детали continuous batching и результаты бенчмарков.

Руководство по квантованию: см. references/quantization.md — настройка AWQ/GPTQ/FP8, подготовка моделей и сравнение точности.

Устранение неполадок: см. references/troubleshooting.md — подробные сообщения об ошибках, шаги отладки и диагностика производительности.

Требования к оборудованию

  • Небольшие модели (7B-13B): 1x A10 (24GB) или A100 (40GB)
  • Средние модели (30B-40B): 2x A100 (40GB) с тензорным параллелизмом
  • Крупные модели (70B+): 4x A100 (40GB) или 2x A100 (80GB), используйте AWQ/GPTQ

Поддерживаемые платформы: NVIDIA (основная), AMD ROCm, Intel GPU, TPU

Ресурсы

перевод и редактура:

обновлено

⌕ ESC