Быстрый старт с vLLM: высокопроизводительное обслуживание LLM — в 2026 году

Быстрый инференс LLM через API OpenAI

Содержимое страницы

vLLM — это высокопроизводительный и эффективный по использованию памяти движок для вывода и обслуживания больших языковых моделей (LLM), разработанный лабораторией Sky Computing Калифорнийского университета в Беркли.

Благодаря революционному алгоритму PagedAttention, vLLM обеспечивает пропускную способность в 14–24 раза выше, чем традиционные методы обслуживания, что делает его выбором номер один для развертывания LLM в производственной среде. Чтобы понять, как vLLM соотносится с Ollama, Docker Model Runner, LocalAI и облачными провайдерами — включая компромиссы в отношении затрат и инфраструктуры — ознакомьтесь с материалом LLM Hosting: Local, Self-Hosted & Cloud Infrastructure Compared.

vllm logo

Что такое vLLM?

vLLM (virtual LLM) — это библиотека с открытым исходным кодом для быстрого вывода и обслуживания LLM, которая быстро стала отраслевым стандартом для производственных развертываний. Выпущенная в 2023 году, она представила PagedAttention — прорывную технику управления памятью, которая значительно повышает эффективность обслуживания.

Ключевые особенности

Высокая пропускная способность: vLLM обеспечивает пропускную способность в 14–24 раза выше по сравнению с HuggingFace Transformers при использовании того же оборудования. Этот значительный прирост производительности достигается за счет непрерывного батчинга, оптимизированных CUDA-ядер и алгоритма PagedAttention, который устраняет фрагментацию памяти.

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

Алгоритм PagedAttention: Основным нововведением, лежащим в основе производительности vLLM, является PagedAttention, который применяет концепцию страничной виртуальной памяти к механизмам внимания. Вместо выделения непрерывных блоков памяти для кэшей KV (что приводит к фрагментации), PagedAttention делит память на блоки фиксированного размера, которые могут выделяться по мере необходимости. Это снижает потерю памяти до 4 раз и позволяет использовать значительно большие размеры пакетов.

Непрерывный батчинг: В отличие от статического батчинга, где вы ждете завершения всех последовательностей, vLLM использует непрерывный (скользящий) батчинг. Как только одна последовательность завершается, новая может быть добавлена в пакет. Это максимизирует использование GPU и минимизирует задержку для входящих запросов.

Поддержка нескольких GPU: vLLM поддерживает тензорный параллелизм и конвейерный параллелизм для распределения больших моделей между несколькими GPU. Он может эффективно обслуживать модели, которые не помещаются в памяти одного GPU, поддерживая конфигурации от 2 до 8+ GPU.

Широкая поддержка моделей: Совместим с популярными архитектурами моделей, включая LLaMA, Mistral, Mixtral, Qwen, Phi, Gemma и многие другие. Поддерживает как модели с инструкционным обучением, так и базовые модели из HuggingFace Hub.

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

vLLM показывает наилучшие результаты в конкретных сценариях, где его преимущества раскрываются полностью:

Сервисы производственных API: Когда вам нужно обслуживать LLM для многих одновременных пользователей через API, высокая пропускная способность vLLM и эффективный батчинг делают его лучшим выбором. Компании, запускающие чат-ботов, помощников для кода или сервисы генерации контента, выигрывают от способности обрабатывать сотни запросов в секунду.

Нагрузки с высокой конкурентностью: Если ваше приложение имеет множество одновременных пользователей, делающих запросы, непрерывный батчинг и PagedAttention vLLM позволяют обслуживать больше пользователей на том же оборудовании по сравнению с альтернативами.

Оптимизация затрат: Когда стоимость GPU является проблемой, превосходная пропускная способность vLLM означает, что вы можете обслуживать тот же трафик меньшим количеством GPU, напрямую снижая затраты на инфраструктуру. Четырехкратная эффективность использования памяти от PagedAttention также позволяет использовать более маленькие и дешевые экземпляры GPU.

Развертывание в Kubernetes: Бесконфликтная архитектура vLLM и архитектура, дружественная к контейнерам, делают его идеальным для кластеров Kubernetes. Его стабильная производительность под нагрузкой и простое управление ресурсами хорошо интегрируются с облачной инфраструктурой.

Когда НЕ использовать vLLM: Для локальной разработки, экспериментов или сценариев с одним пользователем инструменты вроде Ollama или llama.cpp предоставляют лучший пользовательский опыт с более простой настройкой. Сложность vLLM оправдана, когда вам нужны его преимущества в производительности для производственных нагрузок.

Установка vLLM

Предварительные требования

Перед установкой vLLM убедитесь, что ваша система соответствует этим требованиям:

  • GPU: NVIDIA GPU с вычислительной мощностью 7.0+ (V100, T4, A10, A100, H100, RTX 20/30/40 серии)
  • CUDA: Версия 11.8 или выше
  • Python: 3.8 до 3.11
  • VRAM: Минимум 16 ГБ для моделей 7B, 24 ГБ+ для 13B, 40 ГБ+ для более крупных моделей
  • Драйвер: Драйвер NVIDIA 450.80.02 или новее

Установка через pip

Самый простой способ установки — использование pip. Это работает на системах с CUDA 11.8 или новее:

# Создайте виртуальное окружение (рекомендуется)
python3 -m venv vllm-env
source vllm-env/bin/activate

# Установите vLLM
pip install vllm

# Проверьте установку
python -c "import vllm; print(vllm.__version__)"

Для систем с другими версиями CUDA установите соответствующий wheel:

# Для CUDA 12.1
pip install vllm==0.4.2+cu121 -f https://github.com/vllm-project/vllm/releases

# Для CUDA 11.8
pip install vllm==0.4.2+cu118 -f https://github.com/vllm-project/vllm/releases

Установка с Docker

Docker предоставляет самый надежный метод развертывания, особенно для производственной среды:

# Загрузите официальный образ vLLM
docker pull vllm/vllm-openai:latest

# Запустите vLLM с поддержкой GPU
docker run --runtime nvidia --gpus all \
    -v ~/.cache/huggingface:/root/.cache/huggingface \
    -p 8000:8000 \
    --ipc=host \
    vllm/vllm-openai:latest \
    --model mistralai/Mistral-7B-Instruct-v0.2

Флаг --ipc=host важен для конфигураций с несколькими GPU, так как он обеспечивает правильную межпроцессную коммуникацию.

Сборка из исходного кода

Для получения последних функций или пользовательских модификаций собирайте из исходного кода:

git clone https://github.com/vllm-project/vllm.git
cd vllm
pip install -e .

Быстрый старт с vLLM

Запуск вашей первой модели

Запустите vLLM с моделью, используя интерфейс командной строки:

# Скачайте и обслуживайте Mistral-7B с совместимым с OpenAI API
python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --port 8000

vLLM автоматически загрузит модель из HuggingFace Hub (если она не кэширована) и запустит сервер. Вы увидите вывод, указывающий, что сервер готов:

INFO:     Started server process [12345]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000

Выполнение запросов к API

После запуска сервера вы можете выполнять запросы, используя клиент OpenAI для Python или curl:

Используя curl:

curl http://localhost:8000/v1/completions \
    -H "Content-Type: application/json" \
    -d '{
        "model": "mistralai/Mistral-7B-Instruct-v0.2",
        "prompt": "Explain what vLLM is in one sentence:",
        "max_tokens": 100,
        "temperature": 0.7
    }'

Используя клиент OpenAI для Python:

from openai import OpenAI

# Укажите адрес вашего сервера vLLM
client = OpenAI(
    base_url="http://localhost:8000/v1",
    api_key="not-needed"  # vLLM по умолчанию не требует аутентификации
)

response = client.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    prompt="Explain what vLLM is in one sentence:",
    max_tokens=100,
    temperature=0.7
)

print(response.choices[0].text)

API чат-завершений (Chat Completions):

response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "What is PagedAttention?"}
    ],
    max_tokens=200
)

print(response.choices[0].message.content)

Расширенная конфигурация

vLLM предлагает множество параметров для оптимизации производительности:

python -m vllm.entrypoints.openai.api_server \
    --model mistralai/Mistral-7B-Instruct-v0.2 \
    --port 8000 \
    --gpu-memory-utilization 0.95 \  # Используйте 95% памяти GPU
    --max-model-len 8192 \            # Максимальная длина последовательности
    --tensor-parallel-size 2 \        # Используйте 2 GPU с тензорным параллелизмом
    --dtype float16 \                 # Используйте точность FP16
    --max-num-seqs 256                # Максимальный размер пакета

Пояснение ключевых параметров:

  • --gpu-memory-utilization: Сколько памяти GPU использовать (0.90 = 90%). Более высокие значения позволяют использовать большие пакеты, но оставляют меньше запаса для скачков потребления памяти.
  • --max-model-len: Максимальная длина контекста. Уменьшение этого значения экономит память для больших пакетов.
  • --tensor-parallel-size: Количество GPU, между которыми следует разделить модель.
  • --dtype: Тип данных для весов (float16, bfloat16 или float32). FP16 обычно является оптимальным.
  • --max-num-seqs: Максимальное количество последовательностей для обработки в одном пакете.

vLLM против Ollama

vLLM создан для высокопроизводительного многопользовательского производственного обслуживания с непрерывным батчингом, PagedAttention и поддержкой нескольких GPU. Ollama оптимизирован для быстрой локальной настройки, удобства для одного пользователя и простого управления моделями.

Для получения подробного руководства по принятию решений, охватывающего сигналы миграции, шаги планирования, настройку Docker Compose и практический чек-лист, см. Ollama to vLLM: When to Migrate Your Local LLM Server.

vLLM против Docker Model Runner

Docker недавно представил Model Runner (ранее GenAI Stack) как свое официальное решение для локального развертывания моделей ИИ. Как оно compares с vLLM?

Философия архитектуры

Docker Model Runner стремится быть «Docker для ИИ» — простым, стандартизированным способом запуска моделей ИИ локально с той же легкостью, что и запуск контейнеров. Он абстрагирует сложность и предоставляет согласованный интерфейс для разных моделей и фреймворков.

vLLM — это специализированный движок вывода, сфокусированный исключительно на обслуживании LLM с максимальной производительностью. Это инструмент более низкого уровня, который вы контейнеризируете с помощью Docker, а не полная платформа.

Настройка и начало работы

Установка Docker Model Runner проста для пользователей Docker:

docker model pull llama3:8b
docker model run llama3:8b

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

vLLM требует более сложной начальной настройки (Python, CUDA, зависимости) или использования предварительно собранных образов Docker:

docker pull vllm/vllm-openai:latest
docker run --runtime nvidia --gpus all vllm/vllm-openai:latest --model <model-name>

Характеристики производительности

vLLM обеспечивает превосходную пропускную способность для многопользовательских сценариев благодаря PagedAttention и непрерывному батчингу. Для производственных API-сервисов, обрабатывающих сотни запросов в секунду, оптимизации vLLM обеспечивают пропускную способность в 2–5 раз выше, чем у универсальных методов обслуживания.

Docker Model Runner фокусируется на простоте использования, а не на максимальной производительности. Он подходит для локальной разработки, тестирования и умеренных нагрузок, но не реализует продвинутые оптимизации, благодаря которым vLLM преуспевает при масштабировании.

Поддержка моделей

Docker Model Runner предоставляет кураторскую библиотеку моделей с доступом к популярным моделям одной командой. Он поддерживает несколько фреймворков (не только LLM), включая Stable Diffusion, Whisper и другие модели ИИ, что делает его более универсальным для различных задач ИИ.

vLLM специализируется на выводе LLM с глубокой поддержкой языковых моделей на основе трансформеров. Он поддерживает любую LLM, совместимую с HuggingFace, но не распространяется на другие типы моделей ИИ, такие как генерация изображений или распознавание речи.

Производственное развертывание

vLLM прошел боевые испытания в производстве в таких компаниях, как Anthropic, Replicate и многих других, обслуживающих миллиарды токенов ежедневно. Его характеристики производительности и стабильность под высокой нагрузкой делают его де-факто стандартом для производственного обслуживания LLM.

Docker Model Runner новее и позиционирует себя больше для сценариев разработки и локального тестирования. Хотя он может обслуживать производственный трафик, ему не хватает проверенной репутации и оптимизаций производительности, необходимых для производственных развертываний.

Экосистема интеграции

vLLM интегрируется с инструментами производственной инфраструктуры: операторами Kubernetes, метриками Prometheus, Ray для распределенного обслуживания и обширной совместимостью с API OpenAI для существующих приложений.

Docker Model Runner естественно интегрируется с экосистемой Docker и Docker Desktop. Для команд, уже стандартизированных на Docker, эта интеграция обеспечивает целостный опыт, но предлагает меньше специализированных функций обслуживания LLM.

Когда использовать каждый

Используйте vLLM для:

  • Производственных сервисов API LLM
  • Высокопроизводительных многопользовательских развертываний
  • Облачных развертываний, чувствительных к затратам, требующих максимальной эффективности
  • Сред Kubernetes и облачно-нативых сред
  • Когда вам нужна проверенная масштабируемость и производительность

Используйте Docker Model Runner для:

  • Локальной разработки и тестирования
  • Запуска различных типов моделей ИИ (не только LLM)
  • Команд, глубоко инвестирующих в экосистему Docker
  • Быстрого экспериментирования без настройки инфраструктуры
  • Обучения и образовательных целей

Гибридный подход: Многие команды разрабатывают локально с помощью Docker Model Runner для удобства, а затем разворачивают с помощью vLLM в производстве для производительности. Образы Docker Model Runner также могут использоваться для запуска контейнеров vLLM, объединяя оба подхода.

Лучшие практики производственного развертывания

Развертывание Docker

Создайте готовую к производству конфигурацию Docker Compose:

version: '3.8'

services:
  vllm:
    image: vllm/vllm-openai:latest
    runtime: nvidia
    environment:
      - CUDA_VISIBLE_DEVICES=0,1
    volumes:
      - ~/.cache/huggingface:/root/.cache/huggingface
      - ./logs:/logs
    ports:
      - "8000:8000"
    command: >
      --model mistralai/Mistral-7B-Instruct-v0.2
      --tensor-parallel-size 2
      --gpu-memory-utilization 0.90
      --max-num-seqs 256
      --max-model-len 8192      
    restart: unless-stopped
    shm_size: '16gb'
    deploy:
      resources:
        reservations:
          devices:
            - driver: nvidia
              count: 2
              capabilities: [gpu]

Развертывание Kubernetes

Разверните vLLM на Kubernetes для производственного масштаба:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: vllm-server
spec:
  replicas: 2
  selector:
    matchLabels:
      app: vllm
  template:
    metadata:
      labels:
        app: vllm
    spec:
      containers:
      - name: vllm
        image: vllm/vllm-openai:latest
        args:
          - --model
          - mistralai/Mistral-7B-Instruct-v0.2
          - --tensor-parallel-size
          - "2"
          - --gpu-memory-utilization
          - "0.90"
        resources:
          limits:
            nvidia.com/gpu: 2
        ports:
        - containerPort: 8000
        volumeMounts:
        - name: cache
          mountPath: /root/.cache/huggingface
      volumes:
      - name: cache
        hostPath:
          path: /mnt/huggingface-cache
---
apiVersion: v1
kind: Service
metadata:
  name: vllm-service
spec:
  selector:
    app: vllm
  ports:
  - port: 80
    targetPort: 8000
  type: LoadBalancer

Мониторинг и наблюдаемость

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

import requests

# Получение метрик
metrics = requests.get("http://localhost:8000/metrics").text
print(metrics)

Ключевые метрики для мониторинга:

  • vllm:num_requests_running - Активные запросы
  • vllm:gpu_cache_usage_perc - Использование кэша KV
  • vllm:time_to_first_token - Метрика задержки
  • vllm:time_per_output_token - Скорость генерации

Настройка производительности

Оптимизируйте использование памяти GPU: Начните с --gpu-memory-utilization 0.90 и регулируйте на основе наблюдаемого поведения. Более высокие значения позволяют использовать большие пакеты, но несут риск ошибок OOM во время скачков трафика.

Настройте максимальную длину последовательности: Если вашему случаю использования не нужна полная длина контекста, уменьшите --max-model-len. Это освобождает память для больших пакетов. Например, если вам нужен только контекст 4K, установите --max-model-len 4096 вместо использования максимального значения модели (часто 8K–32K).

Выберите подходящую квантование: Для моделей, которые это поддерживают, используйте квантованные версии (8-бит, 4-бит) для уменьшения памяти и увеличения пропускной способности:

--quantization awq  # Для квантованных моделей AWQ
--quantization gptq # Для квантованных моделей GPTQ

Включите кэширование префиксов: Для приложений с повторяющимися промптами (например, чат-боты с системными сообщениями) включите кэширование префиксов:

--enable-prefix-caching

Это кэширует значения KV для общих префиксов, сокращая вычисления для запросов, использующих один и тот же префикс промпта.

Устранение распространенных проблем

Ошибки нехватки памяти

Симптомы: Сервер падает с ошибками CUDA out of memory.

Решения:

  • Уменьшите --gpu-memory-utilization до 0.85 или 0.80
  • Уменьшите --max-model-len, если ваш случай использования позволяет
  • Уменьшите --max-num-seqs, чтобы уменьшить размер пакета
  • Используйте квантованную версию модели
  • Включите тензорный параллелизм для распределения между большим количеством GPU

Низкая пропускная способность

Симптомы: Сервер обрабатывает меньше запросов, чем ожидалось.

Решения:

  • Увеличьте --max-num-seqs, чтобы разрешить большие пакеты
  • Повысьте --gpu-memory-utilization, если у вас есть запас
  • Проверьте, не является ли CPU узким местом с помощью htop — рассмотрите более быстрые CPU
  • Проверьте использование GPU с помощью nvidia-smi — должно быть 95%+
  • Включите FP16, если используете FP32: --dtype float16

Медленное время первого токена

Симптомы: Высокая задержка перед началом генерации.

Решения:

  • Используйте меньшие модели для приложений, критичных к задержкам
  • Включите кэширование префиксов для повторяющихся промптов
  • Уменьшите --max-num-seqs, чтобы приоритизировать задержку перед пропускной способностью
  • Рассмотрите спекулятивное декодирование для поддерживаемых моделей
  • Оптимизируйте конфигурацию тензорного параллелизма

Ошибки загрузки модели

Симптомы: Сервер не запускается, не может загрузить модель.

Решения:

  • Убедитесь, что имя модели точно совпадает с форматом HuggingFace
  • Проверьте сетевое подключение к HuggingFace Hub
  • Убедитесь в достаточном дисковом пространстве в ~/.cache/huggingface
  • Для закрытых моделей установите переменную окружения HF_TOKEN
  • Попробуйте загрузить вручную с помощью huggingface-cli download <model>

Расширенные функции

Спекулятивное декодирование

vLLM поддерживает спекулятивное декодирование, где меньшая модель-черновик предлагает токены, которые большая целевая модель проверяет. Это может ускорить генерацию в 1.5–2 раза. Для комплексного руководства по методам спекулятивного декодирования — моделям-черновикам, EAGLE-3, P-EAGLE и n-gram — см. Speculative Decoding: Faster Inference Without Quality Loss.

python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-70b-chat-hf \
    --speculative-model meta-llama/Llama-2-7b-chat-hf \
    --num-speculative-tokens 5

Адаптеры LoRA

Обслуживайте несколько адаптеров LoRA поверх базовой модели без загрузки нескольких полных моделей:

python -m vllm.entrypoints.openai.api_server \
    --model meta-llama/Llama-2-7b-hf \
    --enable-lora \
    --lora-modules sql-lora=./path/to/sql-adapter \
                   code-lora=./path/to/code-adapter

Затем укажите, какой адаптер использовать для каждого запроса:

response = client.completions.create(
    model="sql-lora",  # Используйте SQL-адаптер
    prompt="Convert this to SQL: Show me all users created this month"
)

Множественное обслуживание LoRA

Множественное обслуживание LoRA в vLLM позволяет размещать десятки дообученных адаптеров с минимальными накладными расходами памяти. Это идеально подходит для обслуживания специфичных для клиентов или задач вариантов моделей:

# Запрос с конкретным адаптером LoRA
response = client.chat.completions.create(
    model="meta-llama/Llama-2-7b-hf",
    messages=[{"role": "user", "content": "Write SQL query"}],
    extra_body={"lora_name": "sql-lora"}
)

Кэширование префиксов

Включите автоматическое кэширование префиксов, чтобы избежать повторного вычисления кэша KV для повторяющихся префиксов промптов:

--enable-prefix-caching

Это особенно эффективно для:

  • Чат-ботов с фиксированными системными промптами
  • Приложений RAG с постоянными шаблонами контекста
  • Промптов few-shot learning, повторяющихся в запросах

Кэширование префиксов может сократить время до первого токена на 50–80% для запросов, использующих одни и те же префиксы промптов.

Примеры интеграции

Интеграция с LangChain

from langchain.llms import VLLMOpenAI

llm = VLLMOpenAI(
    openai_api_key="EMPTY",
    openai_api_base="http://localhost:8000/v1",
    model_name="mistralai/Mistral-7B-Instruct-v0.2",
    max_tokens=512,
    temperature=0.7,
)

response = llm("Explain PagedAttention in simple terms")
print(response)

Интеграция с LlamaIndex

from llama_index.llms import VLLMServer

llm = VLLMServer(
    api_url="http://localhost:8000/v1",
    model="mistralai/Mistral-7B-Instruct-v0.2",
    temperature=0.7,
    max_tokens=512
)

response = llm.complete("What is vLLM?")
print(response)

Приложение FastAPI

from fastapi import FastAPI
from openai import AsyncOpenAI

app = FastAPI()
client = AsyncOpenAI(
    base_url="http://localhost:8000/v1",
    api_key="not-needed"
)

@app.post("/generate")
async def generate(prompt: str):
    response = await client.completions.create(
        model="mistralai/Mistral-7B-Instruct-v0.2",
        prompt=prompt,
        max_tokens=200
    )
    return {"result": response.choices[0].text}

Бенчмарки производительности

Реальные данные о производительности помогают проиллюстрировать преимущества vLLM:

Сравнение пропускной способности (Mistral-7B на GPU A100):

  • vLLM: ~3500 токенов/секунда при 64 одновременных пользователях
  • HuggingFace Transformers: ~250 токенов/секунда при той же конкурентности
  • Ollama: ~1200 токенов/секунда при той же конкурентности
  • Результат: vLLM обеспечивает улучшение в 14 раз по сравнению с базовыми реализациями

Эффективность использования памяти (LLaMA-2-13B):

  • Стандартная реализация: 24 ГБ VRAM, 32 одновременные последовательности
  • vLLM с PagedAttention: 24 ГБ VRAM, 128 одновременных последовательностей
  • Результат: В 4 раза больше одновременных запросов при том же объеме памяти

Задержка под нагрузкой (Mixtral-8x7B на 2xA100):

  • vLLM: Задержка P50 180 мс, задержка P99 420 мс при 100 запрос/с
  • Стандартное обслуживание: Задержка P50 650 мс, задержка P99 3200 мс при 100 запрос/с
  • Результат: vLLM сохраняет стабильную задержку под высокой нагрузкой

Эти бенчмарки демонстрируют, почему vLLM стал де-факто стандартом для производственного обслуживания LLM, где важна производительность.

Анализ затрат

Понимание последствий затрат при выборе vLLM:

Сценарий: Обслуживание 1 млн запросов/день

Со стандартным обслуживанием:

  • Требуется: 8x GPU A100 (80 ГБ)
  • Стоимость AWS: ~$32/час × 24 × 30 = $23,040/месяц
  • Стоимость за 1 млн токенов: ~$0.75

С vLLM:

  • Требуется: 2x GPU A100 (80 ГБ)
  • Стоимость AWS: ~$8/час × 24 × 30 = $5,760/месяц
  • Стоимость за 1 млн токенов: ~$0.19
  • Экономия: $17,280/месяц (снижение на 75%)

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

Соображения безопасности

Аутентификация

vLLM не включает аутентификацию по умолчанию. Для производственной среды реализуйте аутентификацию на уровне обратного прокси:

# Конфигурация Nginx
location /v1/ {
    auth_request /auth;
    proxy_pass http://vllm-backend:8000;
}

location /auth {
    proxy_pass http://auth-service:8080/verify;
    proxy_pass_request_body off;
    proxy_set_header Content-Length "";
    proxy_set_header X-Original-URI $request_uri;
}

Или используйте API-шлюзы, такие как Kong, Traefik или AWS API Gateway, для аутентификации и ограничения скорости корпоративного уровня.

Изоляция сети

Запускайте vLLM в частных сетях, не экспонируя их напрямую в интернет:

# Пример NetworkPolicy для Kubernetes
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: vllm-access
spec:
  podSelector:
    matchLabels:
      app: vllm
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          role: api-gateway
    ports:
    - protocol: TCP
      port: 8000

Ограничение скорости

Реализуйте ограничение скорости для предотвращения злоупотреблений:

# Пример использования Redis для ограничения скорости
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import redis
from datetime import datetime, timedelta

app = FastAPI()
redis_client = redis.Redis(host='localhost', port=6379)

@app.middleware("http")
async def rate_limit_middleware(request, call_next):
    client_ip = request.client.host
    key = f"rate_limit:{client_ip}"
    
    requests = redis_client.incr(key)
    if requests == 1:
        redis_client.expire(key, 60)  # Окно 60 секунд
    
    if requests > 60:  # 60 запросов в минуту
        raise HTTPException(status_code=429, detail="Rate limit exceeded")
    
    return await call_next(request)

Контроль доступа к моделям

Для многопользовательских развертываний контролируйте, какие пользователи могут получать доступ к каким моделям:

ALLOWED_MODELS = {
    "user_tier_1": ["mistralai/Mistral-7B-Instruct-v0.2"],
    "user_tier_2": ["mistralai/Mistral-7B-Instruct-v0.2", "meta-llama/Llama-2-13b-chat-hf"],
    "admin": ["*"]  # Все модели
}

def verify_model_access(user_tier: str, model: str) -> bool:
    allowed = ALLOWED_MODELS.get(user_tier, [])
    return "*" in allowed or model in allowed

Руководство по миграции

От OpenAI к vLLM

Миграция от OpenAI к самостоятельно размещенному vLLM проста благодаря совместимости API:

До (OpenAI):

from openai import OpenAI

client = OpenAI(api_key="sk-...")
response = client.chat.completions.create(
    model="gpt-3.5-turbo",
    messages=[{"role": "user", "content": "Hello"}]
)

После (vLLM):

from openai import OpenAI

client = OpenAI(
    base_url="https://your-vllm-server.com/v1",
    api_key="your-internal-key"  # Если вы добавили аутентификацию
)
response = client.chat.completions.create(
    model="mistralai/Mistral-7B-Instruct-v0.2",
    messages=[{"role": "user", "content": "Hello"}]
)

Необходимы только два изменения: обновите base_url и имя model. Весь остальной код остается идентичным.

От Ollama к vLLM

Ollama использует другой формат API. Базовое изменение на стороне клиента заключается в переключении с конечной точки REST Ollama на совместимый с OpenAI API vLLM:

API Ollama:

import requests

response = requests.post('http://localhost:11434/api/generate',
    json={'model': 'llama2', 'prompt': 'Why is the sky blue?'})

Эквивалент vLLM:

from openai import OpenAI

client = OpenAI(base_url="http://localhost:8000/v1", api_key="not-needed")
response = client.completions.create(
    model="meta-llama/Llama-2-7b-chat-hf",
    prompt="Why is the sky blue?"
)

Для тщательного руководства по миграции, охватывающего выбор модели, шаблоны чата, поэтапную миграцию и практический чек-лист, см. Ollama to vLLM: When to Migrate Your Local LLM Server.

От HuggingFace Transformers к vLLM

Миграция прямого использования Python:

HuggingFace:

from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")
tokenizer = AutoTokenizer.from_pretrained("mistralai/Mistral-7B-Instruct-v0.2")

inputs = tokenizer("Hello", return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=100)
result = tokenizer.decode(outputs[0])

vLLM:

from vllm import LLM, SamplingParams

llm = LLM(model="mistralai/Mistral-7B-Instruct-v0.2")
sampling_params = SamplingParams(max_tokens=100)

outputs = llm.generate("Hello", sampling_params)
result = outputs[0].outputs[0].text

API Python vLLM проще и намного быстрее для пакетного вывода.

Будущее vLLM

vLLM продолжает быстрое развитие с захватывающими функциями в дорожной карте:

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

Многоузловой вывод: Распределение очень больших моделей (100B+ параметров) между несколькими машинами, что позволяет обслуживать модели, слишком большие для конфигураций одного узла.

Усовершенствованное квантование: Поддержка новых форматов квантования, таких как GGUF (используется в llama.cpp) и улучшенная интеграция AWQ/GPTQ для лучшей производительности с квантованными моделями.

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

Оптимизации внимания: FlashAttention 3, кольцевое внимание для экстремально длинных контекстов (100K+ токенов) и другие передовые механизмы внимания.

Более широкое покрытие моделей: Расширение поддержки для мультимодальных моделей (модели «зрение-язык»), аудио-моделей и специализированных архитектур по мере их появления.

Проект vLLM поддерживает активную разработку с вкладом от UC Berkeley, Anyscale и более широкого сообщества с открытым исходным кодом. По мере того, как развертывание LLM становится более критичным для производственных систем, роль vLLM в качестве стандарта производительности продолжает расти. Для более широкого сравнения vLLM с другой локальной и облачной инфраструктурой LLM, проверьте наш материал LLM Hosting: Local, Self-Hosted & Cloud Infrastructure Compared.

Полезные ссылки

Связанные статьи на этом сайте

  • Local LLM Hosting: Complete 2026 Guide - Ollama, vLLM, LocalAI, Jan, LM Studio & More - Комплексное сравнение 12+ локальных инструментов хостинга LLM, включая подробный анализ vLLM наряду с Ollama, LocalAI, Jan, LM Studio и другими. Охватывает зрелость API, поддержку вызова инструментов, совместимость с GGUF и бенчмарки производительности, чтобы помочь выбрать правильное решение.

  • Ollama Cheatsheet - Полная справка и шпаргалка по командам Ollama, охватывающая установку, управление моделями, использование API и лучшие практики для локального развертывания LLM. Незаменимо для разработчиков, использующих Ollama вместе с vLLM или вместо него.

  • llama.cpp Quickstart with CLI and Server - Легковесный вывод C/C++ для моделей GGUF с помощью llama-cli и совместимого с OpenAI llama-server. Идеально, когда вам нужен тонкий контроль, автономное развертывание или минимальный стек без Python.

  • Docker Model Runner vs Ollama: Which to Choose? - Глубокое сравнение Model Runner от Docker и Ollama для локального развертывания LLM, анализирующее производительность, поддержку GPU, совместимость API и случаи использования. Помогает понять конкурентную среду, в которой работает vLLM.

  • Docker Model Runner Cheatsheet: Commands & Examples - Практическая шпаргалка по Docker Model Runner с командами и примерами для развертывания моделей ИИ. Полезно для команд, сравнивающих подход Docker со специализированными возможностями обслуживания LLM от vLLM.

Внешние ресурсы и документация

  • vLLM GitHub Repository - Официальный репозиторий vLLM с исходным кодом, комплексной документацией, руководствами по установке и активными обсуждениями сообщества. Основной ресурс для отслеживания последних функций и устранения неполадок.

  • vLLM Documentation - Официальная документация, охватывающая все аспекты vLLM от базовой настройки до расширенной конфигурации. Включает ссылки на API, руководства по настройке производительности и лучшие практики развертывания.

  • PagedAttention Paper - Академическая статья, представляющая алгоритм PagedAttention, который обеспечивает эффективность vLLM. Обязательна к прочтению для понимания технических инноваций, лежащих в основе преимуществ производительности vLLM.

  • vLLM Blog - Официальный блог vLLM с объявлениями о релизах, бенчмарками производительности, техническими погружениями и кейсами сообщества из производственных развертываний.

  • HuggingFace Model Hub - Комплексный репозиторий LLM с открытым исходным кодом, работающих с vLLM. Ищите модели по размеру, задаче, лицензии и характеристикам производительности, чтобы найти подходящую модель для вашего случая использования.

  • Ray Serve Documentation - Документация фреймворка Ray Serve для создания масштабируемых распределенных развертываний vLLM. Ray предоставляет расширенные функции, такие как автоматическое масштабирование, обслуживание нескольких моделей и управление ресурсами для производственных систем.

  • NVIDIA TensorRT-LLM - TensorRT-LLM от NVIDIA для высокооптимизированного вывода на GPU NVIDIA. Альтернатива vLLM с другими стратегиями оптимизации, полезная для сравнения и понимания ландшафта оптимизации вывода.

  • OpenAI API Reference - Официальная документация API OpenAI, с которой совместим API vLLM. Используйте это как ссылку при создании приложений, которым необходимо работать как с OpenAI, так и с самостоятельно размещенными конечными точками vLLM взаимозаменяемо.

Подписаться

Получайте новые материалы про системы, инфраструктуру и AI engineering.