Учебник

vLLM: 50 запросов к нейросети одновременно без тормозов

У вашего чат-бота или системы обработки документов тормозит в пиковые часы - запросы встают в очередь, пользователи уходят. Разбираем vLLM - сервер, который обрабатывает десятки запросов параллельно на тех же GPU. Узнаете, когда своё железо выгоднее OpenAI и как запустить сервер за вечер без команды разработки.

Макс Космов··8 мин чтения

У вашего чат-бота или системы обработки документов тормозит в пиковые часы - запросы встают в очередь, пользователи уходят. Вы платите за OpenAI API, но данные уходят на чужие сервера, а при росте объёмов счёт за API становится космическим. vLLM - это сервер для запуска нейросетей (LLM), который обрабатывает десятки запросов одновременно без замедления. Разница с популярной Ollama - в 10-30 раз при нагрузке. И это можно запустить на своём железе за вечер, без найма программиста.

Зачем это бизнесу

Инференс (inference) - это когда нейросеть отвечает на запрос: получила вопрос, посчитала, выдала ответ. GPU (видеопроцессор) ускоряет это в десятки раз по сравнению с обычным процессором.

Если вы используете нейросеть в продукте - в чат-боте для клиентов, в обработке договоров, в поддержке - рано или поздно наступает пик: вечером, в начале рабочего дня, после запуска акции. Без правильного сервера это выливается в долгое ожидание или отказы.

vLLM делает так, что 50 одновременных запросов обрабатываются почти так же быстро, как один. На двух видеокартах A100 vLLM выдает 2000-3500 токенов в секунду суммарно для модели Llama-3.3-70B при 50 параллельных запросах. Ollama на той же конфигурации - 80-150 токенов в секунду, и тормозит уже после 3-5 одновременных запросов.

Когда стоит переходить на vLLM: если у вас больше 5-10 одновременных пользователей модели, если задержки в пике неприемлемы, если хотите держать открытую модель (Llama, Mistral) на своем железе вместо оплаты за API. Для одного тестировщика, который пробует промпты, Ollama проще.

Сравнение: vLLM против Ollama

Ollama оптимизирован под одного пользователя: простой запуск одной командой, удобный интерфейс. Отличный выбор для экспериментов.

Но при 5 и более одновременных запросах Ollama ставит их в очередь - задержки растут линейно с числом пользователей. vLLM обрабатывает параллельные запросы в одной пачке (batch). При 50 запросах растет суммарная пропускная способность, но не задержка на каждый отдельный запрос. Разница - 10-30x в пользу vLLM при высокой нагрузке.

vLLM сложнее в настройке, требует GPU от NVIDIA или AMD с поддержкой CUDA или ROCm. Это продакшн-инструмент, а не инструмент для ноутбука.

PagedAttention: ключевая технология vLLM

Чтобы понять, почему vLLM так хорош под нагрузкой, нужно понять проблему KV-кеша.

Когда модель генерирует ответ, она запоминает все промежуточные вычисления по каждому токену - это KV-кеш (кеш ключей и значений, который позволяет модели «помнить» предыдущие слова). При наивном подходе под каждый запрос резервируется блок памяти максимального размера - даже если запрос короткий. При 32 параллельных запросах по 8192 токена на модели Llama-3.3-70B это съедает 40-60 гигабайт видеопамяти впустую.

PagedAttention решает это по аналогии с виртуальной памятью в операционных системах: оперативная память делится на страницы и раздается программам по мере необходимости, а не резервируется целиком заранее. KV-кеш нарезается на маленькие страницы по 16 токенов. Страницы выделяются по мере генерации и освобождаются сразу после завершения запроса. Фрагментация видеопамяти падает до 1-4% против 60-80% у конкурентов.

Практический результат: видеопамять используется на 95-99% вместо 30-40%. Это напрямую увеличивает количество одновременных запросов на том же железе - то есть снижает стоимость инференса без покупки дополнительных видеокарт.

Установка на Ubuntu 22.04 с CUDA 12.4

vLLM требует видеокарту NVIDIA с Compute Capability 7.0 и выше - это все карты начиная с RTX 2070. RTX 3090 и 4090 - оптимальный выбор для одиночной карты. CUDA - это технология NVIDIA, которая позволяет запускать вычисления на видеокарте.

Эти команды проверяют версию CUDA, создают виртуальное окружение Python (изолированное пространство для установки зависимостей) и устанавливают vLLM. Flash Attention 2 - оптимизированная реализация механизма внимания - активируется автоматически и дает 15-25% прирост скорости.

nvidia-smi
nvcc --version

python3 -m venv vllm-env
source vllm-env/bin/activate

pip install vllm

python -c "import vllm; print(vllm.__version__)"

Для систем с CUDA 11.8 нужна специфическая версия:

pip install vllm==0.6.6.post1

Если nvidia-smi выдает ошибку - драйвер не установлен или видеокарта не видна системе. Это нужно решить до установки vLLM.

Запуск OpenAI-совместимого сервера

vLLM поднимает HTTP API (интерфейс для приема запросов по сети), полностью совместимый с OpenAI. Любой код, написанный для ChatGPT API, работает без изменений - нужно только поменять адрес сервера с api.openai.com на localhost:8000.

Это важно для бизнеса: если у вас уже есть продукт, использующий OpenAI, переход на собственный vLLM-сервер требует изменения одной строки в коде, а не переписывания всей интеграции.

Первая команда запускает небольшую модель Llama-3.3-8B на одной видеокарте. Вторая - запускает большую модель Llama-3.3-70B на двух картах через тензорный параллелизм (разбивку матриц весов модели между видеокартами).

# Одна видеокарта - Llama-3.3-8B
vllm serve meta-llama/Llama-3.3-8B-Instruct \
 --port 8000 \
 --max-model-len 8192

# Две видеокарты - Llama-3.3-70B
vllm serve meta-llama/Llama-3.3-70B-Instruct \
 --tensor-parallel-size 2 \
 --port 8000 \
 --max-model-len 32768

Эта команда проверяет работу сервера и отправляет тестовый запрос через стандартный HTTP-вызов.

curl http://localhost:8000/v1/chat/completions \
 -H "Content-Type: application/json" \
 -d '{
 "model": "meta-llama/Llama-3.3-70B-Instruct",
 "messages": [{"role": "user", "content": "Привет"}],
 "max_tokens": 100
 }'

Для продуктивной среды добавьте флаг --api-key ваш-секретный-ключ при запуске сервера.

V1 Engine: три улучшения скорости

С версии vLLM 0.6.0 включен новый V1 Engine. Три ключевых изменения.

Первое: передача данных без лишних копий. Данные между процессором и видеокартой перемещаются напрямую, без промежуточных буферов. На длинных контекстах (32 000 токенов и выше) это дает 8-12% снижение задержки.

Второе: асинхронное планирование. Пока видеокарта обрабатывает текущую пачку запросов, процессор уже готовит следующую. Нет простоев между итерациями.

Третье: разделение фаз (prefill-decode disaggregation). В распределенной конфигурации можно выделить отдельные видеокарты под разные фазы работы. Первичная обработка промпта (вычислительно интенсивная фаза) - на одних картах, генерация токенов (фаза, ограниченная скоростью памяти) - на других. Это снижает время до первого токена на 30-50% при высокой нагрузке.

Сжатие FP8 для H100 и Blackwell

FP8 - формат хранения чисел с меньшей точностью (8 бит против обычных 16 или 32), который видеокарты нового поколения обрабатывают аппаратно с ускорением. Это снижает расход памяти и увеличивает скорость без заметного падения качества.

Видеокарты H100 и новое поколение Blackwell (RTX 5090, B200) поддерживают аппаратный формат FP8. vLLM использует это автоматически.

Эта команда запускает Llama-3.3-70B с FP8-квантованием на четырех видеокартах. Задокументированный результат: снижение задержки на 28.9% и вдвое меньший расход видеопамяти по сравнению с BF16 (стандартным 16-битным форматом).

vllm serve meta-llama/Llama-3.3-70B-Instruct \
 --quantization fp8 \
 --tensor-parallel-size 4

Для RTX 4090 FP8 не дает аппаратного ускорения, но экономит видеопамять. На RTX 3090 и старше - только INT8 (8-битное целочисленное квантование).

Многокарточная конфигурация

Тензорный параллелизм (tensor parallelism) разбивает матрицы весов модели между видеокартами. Каждая карта держит свою часть, и они синхронизируются при каждом шаге генерации.

Для двух RTX 4090 (48 гигабайт суммарно) это позволяет запустить Llama-3.3-70B в 8-битном квантовании (около 37 гигабайт - умещается с запасом).

Этот файл конфигурации Docker Compose разворачивает vLLM-сервер с видеокартами через контейнер - удобный способ управлять зависимостями и перезапускать сервер. Docker Compose - инструмент для запуска приложений в изолированных контейнерах.

services:
 vllm:
 image: vllm/vllm-openai:latest
 runtime: nvidia
 environment:
 - NVIDIA_VISIBLE_DEVICES=all
 - HUGGING_FACE_HUB_TOKEN=${HF_TOKEN}
 volumes:
 - ~/.cache/huggingface:/root/.cache/huggingface
 ports:
 - "8000:8000"
 command: >
 --model meta-llama/Llama-3.3-8B-Instruct
 --tensor-parallel-size 1
 --max-model-len 8192
 --api-key ${VLLM_API_KEY}
 deploy:
 resources:
 reservations:
 devices:
 - driver: nvidia
 count: all
 capabilities: [gpu]
 shm_size: '2gb'
 ulimits:
 memlock: -1

Параметр shm_size: '2gb' критичен. shm - shared memory, общая память между процессами. Без него рабочие процессы PyTorch упадут с ошибкой при тензорном параллелизме.

docker compose up -d
docker compose logs -f vllm

Правило для тензорного параллелизма: --tensor-parallel-size должен делить число attention heads (голов внимания) модели. Для Llama-3.3-70B это 64 головы - делится на 1, 2, 4, 8.

Если карты соединены только через PCIe (стандартный интерфейс подключения компонентов), а не через NVLink (высокоскоростное соединение видеокарт NVIDIA), межкарточная передача данных становится узким местом. Два RTX 4090 без NVLink дадут примерно в 1.6 раза больше производительности вместо ожидаемых 2x.

Сколько стоит запустить vLLM: расчёт для малого бизнеса

Разберём на примере небольшой компании, которая обрабатывает документы с помощью нейросети. Это пример, а не реальный кейс автора.

Сценарий: компания обрабатывает 500 000 токенов в день (около 500 страниц документов или 5000 коротких запросов). На gpt-4o это $12.50 в день или $375 в месяц.

Аренда сервера с одной A100 80GB на облачной платформе (RunPod, Lambda, Vast.ai) стоит $2-3 в час, то есть $1500-2000 в месяц. При таком объёме своё железо не окупается.

Но при объёме 5M токенов в день ($125/день = $3750/месяц на OpenAI) расчёт меняется: A100 за $2000/месяц выгоднее уже вдвое. Плюс данные не уходят на сервера OpenAI - это важно для медицинских, юридических и финансовых компаний.

Два RTX 4090 можно арендовать на том же RunPod за $1.2-1.5/час (~$900/месяц) или купить б/у за $6000-8000. При объёме 3M+ токенов в день покупка окупается за 3-4 месяца.

Мониторинг через Prometheus и Grafana

vLLM автоматически публикует метрики в формате Prometheus (система сбора метрик) на адресе /metrics.

Ключевые показатели для мониторинга в продуктивной среде:

  • vllm:time_to_first_token_seconds - время до первого токена (задержка)
  • vllm:e2e_request_latency_seconds - полная задержка запроса от получения до ответа
  • vllm:gpu_cache_usage_perc - заполненность KV-кеша (выше 85% - пора расширяться)
  • vllm:num_requests_running - текущий размер пачки запросов
  • vllm:generation_tokens_total - исходящие токены (основа для биллинга)

Готовый дашборд (панель визуализации метрик) для Grafana - JSON в репозитории vllm-project/vllm на GitHub, папка examples/online_serving/grafana.

Обязательные оповещения: время до первого токена больше 2 секунд и заполненность кеша выше 90%. Это сигналы, что нужно либо масштабировать железо, либо снизить max-model-len.

Типичные ошибки

Нет NVLink - ожидание линейного роста. Два RTX 4090 без NVLink не дадут ровно в два раза больше производительности из-за накладных расходов на межкарточную коммуникацию. Ожидайте 1.5-1.7x.

Слишком большой max-model-len. Чем больше максимальная длина контекста, тем больше видеопамяти резервируется под KV-кеш. Если большинство запросов короткие, снижение --max-model-len освобождает память для большего числа параллельных запросов. Начните с 8192 и увеличивайте только если ваши задачи требуют.

Образ latest в продакшне. Фиксируйте версию образа (vllm/vllm-openai:v0.7.3), а не используйте :latest. Автообновление в момент пиковой нагрузки - плохая идея.

Отсутствие shm_size при многокарточном запуске. Без shm_size: '2gb' получите ошибку shared memory при первом же запросе с тензорным параллелизмом.

Частые вопросы

Чем vLLM лучше Ollama для продуктивной среды?

Ollama оптимизирован под одного пользователя: простой запуск, удобный интерфейс, автоматическая выгрузка моделей. При 5 и более одновременных запросах Ollama ставит их в очередь, задержки растут линейно. vLLM обрабатывает параллельные запросы в одной пачке. При 50 запросах вырастет пропускная способность, но не задержка. Разница - 10-30x в пользу vLLM при высокой нагрузке.

Можно ли запустить vLLM на RTX 3090?

RTX 3090 (24 гигабайта) - вполне рабочий вариант. Llama-3.3-8B в BF16 занимает 16 гигабайт, остаток идет на KV-кеш. Для Llama-3.3-70B нужно квантование AWQ или GPTQ до 4 бит (около 20 гигабайт) или тензорный параллелизм на двух картах. Производительность: примерно 300-500 токенов в секунду для 8B-модели при batch size 16.

Что такое PagedAttention и почему это важно?

PagedAttention управляет KV-кешем как виртуальной памятью операционной системы: делит его на страницы по 16-32 токена и выделяет по мере необходимости. Это позволяет одновременно обслуживать запросы разной длины без резервирования максимального буфера для каждого. Результат: заполненность видеопамяти 95-99% вместо 30-40% у конкурентов.

Как настроить несколько моделей одновременно?

С версии 0.7+ доступен запуск нескольких экземпляров на разных портах за балансировщиком нагрузки. Официальная поддержка LoRA-адаптеров (надстроек над базовой моделью) через --enable-lora позволяет держать одну базовую модель и переключать адаптеры для каждого запроса без перезагрузки.

Поддерживает ли vLLM видеокарты AMD?

Да, официально с ROCm 6.1+ (аналог CUDA для AMD). Поддерживаются Instinct MI250X, MI300X и потребительские RX 7900 XTX. Установка через отдельный индекс пакетов. PagedAttention работает полностью. Производительность MI300X сопоставима с A100 80GB.

Что делать прямо сейчас

  1. Возьмите свою задачу: чат-бот для клиентов, обработка заявок или документов. Посчитайте объём токенов в день.
  2. Если объём больше 3M токенов в день - vLLM на своём железе окупится за 3-4 месяца. Если меньше - арендуйте сервер с A100 на RunPod или Vast.ai.
  3. Запустите сервер по инструкции выше. Ваш менеджер справится за 2-3 часа: нужно установить Ubuntu, выполнить команды установки и запуска. Если менеджера нет - наймите фрилансера за один вечер.
  4. Подключите ваш текущий код (если он использует OpenAI API) - смените адрес сервера с api.openai.com на localhost:8000. Одна строка в коде.
  5. Настройте мониторинг по метрикам из раздела выше - чтобы знать, когда пора расширяться.

AI Компас (t.me/kosmoslab_ai) - канал для предпринимателей в РФ и СНГ, которые применяют AI в своём бизнесе без программиста. Разбираем инструменты и схемы - без курсов и теории.