Статьи ·

vLLM: свой API для open-weight моделей за одну команду

vLLM - inference-движок из Berkeley: PagedAttention и continuous batching дают высокий throughput, а OpenAI-совместимый сервер поднимается одной командой. Разбираем, когда он нужен.

Open-weight модель рано или поздно переезжает из ноутбука в прод. Нужны HTTP API, очередь запросов, метрики. Свой сервер на transformers - медленно и больно: батчинг, управление памятью, всё руками. vLLM - inference-движок из UC Berkeley, который закрывает это штатно. pip install vllm, затем vllm serve <model> - и на порту 8000 висит OpenAI-совместимый API.

Как это работает

В основе - две вещи. PagedAttention управляет KV-кэшем как виртуальной памятью: блоками, без фрагментации. Concurrent-запросы делят GPU-память эффективно вместо того, чтобы толкаться. Continuous batching мешает в один батч запросы на разных стадиях: кто-то ещё в prefill, кто-то уже в decode - никто никого не ждёт. Сервер говорит на диалекте OpenAI API, так что существующий код на OpenAI SDK работает сменой base_url. Из коробки: HF-формат, квантование AWQ/GPTQ/FP8, LoRA-адаптеры поверх базовой модели, tensor parallelism на несколько GPU, Prometheus-метрики - глубина очереди, TTFT, токены в секунду.

Drop-in замена OpenAI

Совместимость - первое, что подкупает. Клиентский код не переписывается, меняется только endpoint: миграция с OpenAI на свою модель превращается в смену URL. Второе - зрелость для продакшена: автомасштабирование в Kubernetes, structured outputs, speculative decoding для снижения задержки, prefix caching. Не случайно vLLM стал дефолтным выбором для enterprise-сервисинга.

Подводные камни

vLLM не ест GGUF. Только нативный HF-формат, AWQ и GPTQ - модели из Ollama и llama.cpp придётся перекачивать. Работает на NVIDIA GPU с CUDA; на CPU - никак. Настройка под нагрузку - отдельная работа: max_num_seqs, gpu_memory_utilization, лимиты контекста подбираются под конкретную GPU и паттерн запросов, дефолты не всегда оптимальны. И это серверный инструмент: ради одиночного запуска на ноутбуке его тащить тяжеловесно.

Кому подходит

Тем, кто раздаёт open-weight модели как внутренний API - для команды или продукта. Локальный запуск на одной машине проще делается через Ollama. CPU-инференс и edge - территория llama.cpp. Разовый батч-скрипт обойдётся offline-режимом transformers. А вот когда моделью по сети пользуются двое и больше - это уже территория vLLM.