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
Ресурсы
- Официальная документация: 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