TensorRT-LLM vs vLLM — сравнение для production deployment?

Краткий тезис

TensorRT-LLM и vLLM — два ведущих движка для инференса больших языковых моделей (LLM) в production. TensorRT-LLM от NVIDIA обеспечивает максимальную производительность за счёт графовых оптимизаций (CUDA graphs, operator fusion) и поддержки фиксированных форм (fixed shapes), но требует больше усилий при кастомизации и менее гибок при переменных длинах последовательностей. vLLM, напротив, предлагает гибкость (variable shapes), встроенную поддержку PagedAttention для эффективного управления памятью и простоту развёртывания, что делает его предпочтительным для динамических нагрузок и быстрого прототипирования. Выбор между ними зависит от конкретных требований к latency, throughput, гибкости и сложности поддержки.


1. Термины и контекст

Production deployment — развёртывание модели в промышленной среде, где критичны latency (время ответа), throughput (пропускная способность), надёжность и стоимость.

Inference engine (движок инференса) — программная платформа, оптимизирующая выполнение модели на GPU: управление памятью, батчинг, компиляция графа, квантизация.

TensorRT-LLM — библиотека от NVIDIA для инференса LLM на базе TensorRT. Использует графовые оптимизации, поддержку FP8/INT4, многократное ускорение за счёт CUDA graphs (запись последовательности операций в граф, выполняемый без участия CPU) и operator fusion (слияние нескольких операций в одно ядро).

vLLM — open-source движок, разработанный UC Berkeley. Ключевая инновация — PagedAttention (аналог виртуальной памяти для KV-cache), позволяющая эффективно управлять памятью при переменных длинах последовательностей и поддерживать continuous batching (добавление новых запросов в батч по мере завершения старых).


2. Ключевые отличия: производительность vs гибкость

ПараметрTensorRT-LLMvLLM
Оптимизация графаCUDA graphs + operator fusion (статический граф)Динамический граф, оптимизация на уровне ядер
Управление памятью (KV-cache)Фиксированное выделение под max sequence lengthPagedAttention — выделение страницами, эффективно при variable shapes
Поддержка batch sizeЛучше всего для фиксированного batch (статический батчинг)Continuous batching — адаптивный, высокий throughput при переменной нагрузке
Variable sequence lengthsТребует padding до максимальной длины (потеря эффективности)Нативная поддержка, без padding
Кастомизация моделиСложная: нужно компилировать модель через TensorRT, писать плагиныПростая: можно загрузить любую модель Hugging Face, донастроить через API
Поддержка квантизацииFP8, INT4, INT8 (с калибровкой)INT4, INT8 (через AWQ/GPTQ), FP8 (экспериментально)
ЭкосистемаNVIDIA — закрытая, но глубокая интеграция с Triton Inference ServerOpen-source, активное сообщество, интеграция с LangChain, Ray Serve
Простота развёртыванияТребует сборки Docker-образа, компиляции модели, настройки конфиговpip install vllm и запуск одной командой

Термин «Continuous batching» — техника, при которой батч не фиксирован: новые запросы добавляются по мере освобождения места после завершения старых. Повышает throughput при неравномерном потоке запросов.

Термин «PagedAttention» — механизм, разбивающий KV-cache на блоки (страницы) фиксированного размера. Позволяет избежать фрагментации памяти и эффективно использовать GPU memory при переменных длинах.


3. Когда выбирать TensorRT-LLM

TensorRT-LLM оправдан в сценариях, где:

  • Фиксированная форма входа (например, все запросы обрезаны до одинаковой длины, batch size постоянен).
  • Максимальная производительность критична (low latency, high throughput) — например, real-time API с SLA < 100 мс.
  • Модель уже оптимизирована под TensorRT (например, Llama, Mistral, Falcon) и не требует частой смены.
  • Инфраструктура NVIDIA (Triton Inference Server, DGX) уже используется.

Пример конфигурации для TensorRT-LLM

# Пример запуска через TensorRT-LLM (упрощённо)
from tensorrt_llm import LLM, SamplingParams

llm = LLM(model="meta-llama/Llama-2-7b-hf", 
          tensor_parallel=1, 
          max_batch_size=32,
          max_input_len=512,
          max_output_len=256)
params = SamplingParams(temperature=0.7, top_p=0.9)
outputs = llm.generate(["What is TensorRT-LLM?"], params)

Недостатки

  • Долгая компиляция (часы для больших моделей).
  • Сложность добавления custom layers (нужно писать плагины на C++).
  • Меньшая гибкость при изменении формы входа.

4. Когда выбирать vLLM

vLLM подходит для:

  • Динамических нагрузок с переменной длиной запросов и batch size.
  • Быстрого прототипирования и частой смены моделей.
  • Open-source экосистемы (интеграция с Hugging Face, LangChain, FastAPI).
  • Сценариев, где важна простота развёртывания (команда без глубоких знаний CUDA).

Пример запуска vLLM

from vllm import LLM, SamplingParams

llm = LLM(model="meta-llama/Llama-2-7b-hf", 
          tensor_parallel_size=1,
          max_model_len=4096)
params = SamplingParams(temperature=0.7, top_p=0.9, max_tokens=256)
outputs = llm.generate(["What is vLLM?"], params)

Недостатки

  • Чуть ниже пиковая производительность на фиксированных формах (до 10-20% по сравнению с TensorRT-LLM).
  • Меньше встроенных оптимизаций для специфических архитектур (например, Mamba, RWKV — но поддержка растёт).

5. Сравнение производительности (benchmark)

МетрикаTensorRT-LLM (FP16)vLLM (FP16)TensorRT-LLM (INT4)vLLM (INT4)
Throughput (tok/s) на A100, batch=32, seq=5124500380072006100
Latency p50 (ms) для одного запроса45552835
Потребление памяти (GB) для Llama-7B14.214.85.15.4

Данные приблизительные, основаны на публичных бенчмарках (MLPerf, vLLM docs).

Вывод TensorRT-LLM выигрывает 10-20% по throughput и latency на фиксированных формах, но vLLM догоняет за счёт continuous batching при реальной нагрузке.


6. Кастомизация и расширяемость

TensorRT-LLM

  • Модель компилируется в оптимизированный граф (.plan файл).
  • Добавление нового слоя требует написания плагина на C++ и перекомпиляции.
  • Поддержка custom kernels через TensorRT Plugin API.

vLLM

  • Модель загружается напрямую из Hugging Face (PyTorch).
  • Можно менять логику sampling, добавлять custom logits processors.
  • Легко интегрировать с внешними сервисами (REST API, gRPC).

Термин «Operator fusion» — объединение нескольких последовательных операций (например, matmul + bias + ReLU) в одно ядро CUDA, уменьшающее накладные расходы на запуск ядер и передачу данных.


7. Управление памятью: KV-cache

KV-cache — кэш ключей и значений для каждого слоя, ускоряющий генерацию (не нужно пересчитывать attention для предыдущих токенов). Занимает до 80% памяти GPU при длинных последовательностях.

  • TensorRT-LLM выделяет фиксированный буфер под максимальную длину последовательности (max_seq_len). Если реальная длина меньше — память простаивает.
  • vLLM (PagedAttention): выделяет память страницами (блоками по 16-32 токена). Позволяет эффективно использовать память при переменных длинах и поддерживать больше concurrent запросов.

Пример: при max_seq_len=4096 и среднем запросе 512 токенов TensorRT-LLM использует ~8x больше памяти на KV-cache, чем vLLM.


8. Развёртывание в production

Типовой стек с TensorRT-LLM

  • NVIDIA Triton Inference Server (управление моделями, батчинг, мониторинг).
  • Docker-образ с TensorRT-LLM backend.
  • Настройка конфигурации модели (max_batch_size, max_input_len, квантизация).

Типовой стек с vLLM

  • FastAPI / Ray Serve для REST API.
  • vllm.entrypoints.openai.api_server — встроенный OpenAI-совместимый сервер.
  • Kubernetes deployment с autoscaling.

Сравнение сложности

АспектTensorRT-LLMvLLM
Время настройки1-2 дня (компиляция, тесты)1-2 часа
Обновление моделиПерекомпиляцияЗамена весов
МониторингЧерез Triton metricsPrometheus + custom метрики

9. Сообщество и поддержка

  • TensorRT-LLM NVIDIA — официальная поддержка, документация, примеры. Но коммерческая лицензия (часть TensorRT Enterprise).
  • vLLM open-source (Apache 2.0), активное сообщество (GitHub stars > 20k), быстрые релизы, поддержка от UC Berkeley и Anyscale.

Тренд vLLM становится стандартом для open-source deployment, TensorRT-LLM — для enterprise-решений с максимальной производительностью.


10. Рекомендации по выбору

СценарийРекомендуемый движок
Real-time API с фиксированной длиной запросов (например, чат-бот с обрезанием контекста)TensorRT-LLM
Высоконагруженный сервис с переменной длиной (RAG, агенты)vLLM
Быстрый MVP / прототипvLLM
Интеграция с существующей инфраструктурой NVIDIATensorRT-LLM
Частая смена моделей (fine-tuning, эксперименты)vLLM
Максимальная экономия GPU памяти (больше concurrent запросов)vLLM (PagedAttention)

Пет-проект для закрепления

Задача Развернуть одну и ту же модель (например, mistralai/Mistral-7B-Instruct-v0.3) с помощью TensorRT-LLM и vLLM, измерить latency и throughput при разных batch sizes (1, 8, 32) и sequence lengths (128, 512, 2048).

Инструменты

  • NVIDIA A100 или T4 (можно в облаке).
  • Docker, Python, tensorrt_llm, vllm.
  • locust или wrk для нагрузки.

Шаги:

  1. Установить TensorRT-LLM (следуя официальной документации) и vLLM (pip install vllm).
  2. Скомпилировать модель для TensorRT-LLM (пример: trtllm-build --model_config ...).
  3. Запустить оба сервера с одинаковыми параметрами (max_model_len, tensor_parallel).
  4. Написать скрипт для отправки запросов с разными длинами и batch sizes.
  5. Собрать метрики: latency (p50, p95, p99), throughput (токенов/сек), использование GPU memory.
  6. Построить графики и сделать выводы.

Ожидаемый результат Таблица сравнения, подтверждающая, что TensorRT-LLM быстрее на фиксированных формах, а vLLM эффективнее при переменных длинах и высоком concurrent.


Связь с другими вопросами

ВопросТема
317Развертывание LLM в production
319Оптимизация инференса LLM (CUDA graphs, continuous batching)
320PagedAttention и управление KV-cache
321Квантизация моделей (FP8, INT4)
322Сравнение Triton Inference Server и vLLM API
323Бенчмаркинг LLM в production

Навигация