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
Ресурсы
- Официальная документация: https://docs.vllm.ai
- GitHub: https://github.com/vllm-project/vllm
- Статья: «Efficient Memory Management for Large Language Model Serving with PagedAttention» (SOSP 2023)
- Сообщество: https://discuss.vllm.ai