Перейти к основному содержимому

Serving Llms Vllm

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

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

ИсточникВстроенный (установлен по умолчанию)
Путьskills/mlops/inference/vllm
Версия1.0.0
АвторOrchestra Research
ЛицензияMIT
Зависимостиvllm, torch, transformers
Платформыlinux, macos
ТегиvLLM, Inference Serving, PagedAttention, Continuous Batching, High Throughput, Production, OpenAI API, Quantization, Tensor Parallelism

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

к сведению

Ниже приведено полное определение навыка, которое VibeOS загружает при его активации. Это инструкции, которые видит агент, когда навык активен.

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

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

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

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

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

Установка:

pip install vllm

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

from vllm import LLM, SamplingParams

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

outputs = llm.generate(["Объясните квантовые вычисления"], sampling)
print(outputs[0].outputs[0].text)

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

vllm serve meta-llama/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/Llama-3-8B-Instruct',
messages=[{'role': 'user', 'content': 'Привет!'}]
).choices[0].message.content)
"

Типовые рабочие процессы​

Рабочий процесс 1: Развертывание продакшн API​

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

Прогресс развертывания:
- [ ] Шаг 1: Настройка параметров сервера
- [ ] Шаг 2: Тестирование с ограниченным трафиком
- [ ] Шаг 3: Включение мониторинга
- [ ] Шаг 4: Развертывание в продакшн
- [ ] Шаг 5: Проверка метрик производительности

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

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

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

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

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

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

Запустите нагрузочное тестирование перед продакшном:

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

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

Проверьте, что TTFT (время до первого токена) < 500 мс и пропускная способность > 100 запросов/сек.

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

vLLM предоставляет метрики Prometheus на порту 9090:

curl http://localhost:9090/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/Llama-3-8B-Instruct \
--gpu-memory-utilization 0.9 \
--enable-prefix-caching

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

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

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

Рабочий процесс 2: Офлайн-пакетный инференс​

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

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

Пакетная обработка:
- [ ] Шаг 1: Подготовка входных данных
- [ ] Шаг 2: Настройка движка LLM
- [ ] Шаг 3: Запуск пакетного инференса
- [ ] Шаг 4: Обработка результатов

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

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

print(f"Загружено {len(prompts)} промптов")

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

from vllm import LLM, SamplingParams

llm = LLM(
model="meta-llama/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"Обработано {len(results)} промптов")

Рабочий процесс 3: Обслуживание квантизованных моделей​

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

Настройка квантизации:
- [ ] Шаг 1: Выбор метода квантизации
- [ ] Шаг 2: Поиск или создание квантизованной модели
- [ ] Шаг 3: Запуск с флагом квантизации
- [ ] Шаг 4: Проверка точности

Шаг 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 в ~40 ГБ VRAM

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

Убедитесь, что выходные данные соответствуют ожидаемому качеству:

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

Когда использовать vs альтернативы​

Используйте vLLM когда:

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

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

  • llama.cpp: Инференс на CPU/периферийных устройствах, однопользовательский режим
  • 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 секунда)

Включите кэширование префиксов для повторяющихся промптов:

vllm serve MODEL --enable-prefix-caching

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

vllm serve MODEL --enable-chunked-prefill

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

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

vllm serve MODEL --trust-remote-code

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

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

vllm serve MODEL --max-num-seqs 512

Проверьте загрузку GPU с помощью nvidia-smi — должно быть >80%.

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

Убедитесь, что тензорный параллелизм использует количество GPU, кратное 2:

vllm serve MODEL --tensor-parallel-size 4  # Не 3

Включите спекулятивное декодирование для более быстрой генерации:

vllm serve MODEL --speculative-model DRAFT_MODEL

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

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

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

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

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

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

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

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

Ресурсы​