У вашего чат-бота или системы обработки документов тормозит в пиковые часы - запросы встают в очередь, пользователи уходят. Вы платите за 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.
Что делать прямо сейчас
- Возьмите свою задачу: чат-бот для клиентов, обработка заявок или документов. Посчитайте объём токенов в день.
- Если объём больше 3M токенов в день - vLLM на своём железе окупится за 3-4 месяца. Если меньше - арендуйте сервер с A100 на RunPod или Vast.ai.
- Запустите сервер по инструкции выше. Ваш менеджер справится за 2-3 часа: нужно установить Ubuntu, выполнить команды установки и запуска. Если менеджера нет - наймите фрилансера за один вечер.
- Подключите ваш текущий код (если он использует OpenAI API) - смените адрес сервера с
api.openai.comнаlocalhost:8000. Одна строка в коде. - Настройте мониторинг по метрикам из раздела выше - чтобы знать, когда пора расширяться.
AI Компас (t.me/kosmoslab_ai) - канал для предпринимателей в РФ и СНГ, которые применяют AI в своём бизнесе без программиста. Разбираем инструменты и схемы - без курсов и теории.