Введение
В процессе разработки RAG-системы для обработки видеоконтента передо мной встала задача генерации качественных описаний для большого объема видео-клипов с использованием мультимодальных языковых моделей. Клипы имели продолжительность около 10 секунд, в отдельных экспериментах мы тестировали материал длиной в несколько десятков секунд. Финальные описания составляли от 300 до 2000 токенов и после генерации разбивались на чанки для индексации в векторной базе данных. При тестировании различных подходов обнаружились значительные различия в скорости и качестве обработки. Компактные модели, работающие с отдельными кадрами изображений (Phi, DeepSeekVL2, Moondream), демонстрировали существенно более высокую скорость по сравнению с моделями полноценной обработки видео, однако качество генерируемых описаний оставляло желать лучшего. Типичный workflow включал конкатенацию описаний отдельных кадров, при этом в DeepSeekVL2 дополнительно использовался system prompt для более интеллигентного объединения результатов анализа кадров. Модели для обработки изображений стабильно укладывались в временные рамки 3-5 секунд на клип, что значительно быстрее требуемого лимита. Полноценные видео-модели, получающие на вход целые видеоклипы, изначально генерировали описания за 30 секунд на vanilla PyTorch. Применение VLLM ускорило процесс до 12-15 секунд, а SGLang позволил достичь целевых 8-10 секунд на клип. Эти временные рамки позволили настроить обработку на кластере из 20 RTX 4090 и сгенерировать около миллиона описаний за месяц для production-системы. Благодаря применению различных техник оптимизации инференса удалось не только достичь поставленных временных целей, но и существенно превзойти их, завершив генерацию необходимого объема описаний за две недели вместо месяца. Система успешно развернута в продакшене и демонстрирует стабильную производительность. Данная статья представляет систематизированный анализ практического опыта оптимизации инференса мультимодальных LLM, полученного в ходе решения реальной production-задачи. Особое внимание уделяется сравнению эффективности различных подходов к ускорению, включая современные специализированные фреймворки VLLM и SGLang, а также аппаратные оптимизации на базе TensorRT.
Обзор подходов к оптимизации инференса
Современный ландшафт оптимизации инференса LLM характеризуется многообразием подходов, каждый из которых нацелен на решение специфических узких мест в процессе генерации текста. Фундаментальные ограничения включают memory bandwidth для загрузки весов модели, вычислительную сложность операций внимания и эффективность планирования batch-обработки запросов. Классический подход с использованием PyTorch представляет собой базовую реализацию, которая использует стандартные возможности фреймворка без специальных оптимизаций. Этот метод характеризуется простотой реализации и высокой совместимостью, но демонстрирует наихудшую производительность среди рассматриваемых подходов. Тем не менее, он служит важной baseline для оценки эффективности других методов оптимизации. VLLM (vLLM) представляет собой специализированный движок инференса, разработанный исследователями из UC Berkeley специально для высокопроизводительного сервинга больших языковых моделей. Ключевые инновации VLLM включают PagedAttention — механизм эффективного управления памятью для операций внимания, continuous batching для динамического формирования батчей запросов, и оптимизированные CUDA kernels для ускорения вычислений на GPU. Эти технологии позволяют VLLM достигать значительно более высокой пропускной способности по сравнению с традиционными подходами. SGLang (Structured Generation Language) представляет собой еще один современный фреймворк для оптимизации инференса LLM, который фокусируется на эффективной обработке структурированных запросов и поддержке сложных паттернов генерации. SGLang предлагает собственную runtime среду с оптимизированным планировщиком запросов и поддержкой advanced prompting techniques. Особенностью SGLang является его способность эффективно обрабатывать запросы с ограничениями и структурированными выходными форматами. Numba оптимизация представляет собой подход на уровне отдельных операций, где JIT-компилятор Numba используется для ускорения критических численных вычислений в процессе инференса. Хотя этот подход не обеспечивает кардинального улучшения общей производительности, он может дать заметный прирост для специфических операций, особенно на CPU-системах где GPU-ускорение недоступно. В контексте задач video-to-text и image-to-text каждый из этих подходов имеет свои особенности применения. Визуальные эмбеддинги, получаемые от энкодеров изображений или видео, требуют специальной обработки и интеграции с текстовыми токенами в рамках единого вычислительного графа. Эффективность обработки таких мультимодальных входных данных критически важна для достижения высокой производительности в реальных приложениях.
Классический PyTorch подход: baseline для сравнения
Обычный PyTorch подход представляет собой стандартную реализацию инференса LLM с использованием библиотеки Hugging Face Transformers и базовых возможностей PyTorch. Несмотря на то, что этот метод демонстрирует наименьшую производительность среди рассматриваемых подходов, он служит важным эталоном для оценки эффективности оптимизаций и остается основным выбором для исследовательских задач и прототипирования. Практическая реализация для модели LLaVA (мультимодальная LLM для image-to-text):
python
from transformers import LlavaNextProcessor, LlavaNextForConditionalGeneration
import torch
from PIL import Image
# Загрузка модели LLaVA
processor = LlavaNextProcessor.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
model = LlavaNextForConditionalGeneration.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
# Обработка изображения и текста
image = Image.open("example.jpg")
prompt = "USER: <image>\nОпишите что происходит на изображении\nASSISTANT:"
inputs = processor(prompt, image, return_tensors="pt")
with torch.no_grad():
output = model.generate(**inputs, max_new_tokens=100, temperature=0.7)
response = processor.decode(output[0], skip_special_tokens=True)
Результаты бенчмарка для LLaVA на классическом PyTorch показывают скорость генерации около 10-15 токенов в секунду при потреблении ~1300 МБ памяти. Время инференса составляет примерно 6-10 секунд на 100 токенов. Для мультимодальных задач это критически медленно для production-применений. Основные преимущества классического подхода: простота реализации, полная совместимость с Hugging Face экосистемой, гибкость настройки параметров генерации, отсутствие дополнительных зависимостей. Подходит для исследований, прототипирования и scenarios где стабильность важнее производительности. Недостатки: крайне низкая скорость генерации, высокое потребление памяти, отсутствие батчинга, ограниченная масштабируемость. Непригоден для real-time приложений и высоконагруженных систем. В контексте задач video-to-text и image-to-text классический подход может быть дополнен предварительной обработкой визуальных эмбеддингов и их интеграцией с текстовыми промптами. Однако даже с такими доработками он остается значительно медленнее специализированных решений, особенно при обработке больших объемов визуальных данных.
VLLM: революция в скорости инференса
VLLM (vLLM) представляет собой высокоэффективное решение для инференса больших языковых моделей, разработанное исследователями из UC Berkeley. Этот движок специально создан для production-сред, где критически важны высокая пропускная способность и низкая латентность. Результаты бенчмарков показывают, что VLLM достигает скорости 35-45 токенов в секунду при потреблении ~830 МБ памяти, что обеспечивает 2-4x ускорение по сравнению с классическим PyTorch подходом. Для мультимодальных моделей как LLaVA это означает сокращение времени генерации описания изображения с 6-10 секунд до 2-3 секунд. Ключевые технологические инновации VLLM включают PagedAttention — революционный механизм управления памятью, который разбивает KV-cache на блоки и управляет ими подобно виртуальной памяти в операционных системах. Continuous batching позволяет динамически добавлять новые запросы в batch без ожидания завершения предыдущих, что кардинально улучшает утилизацию ресурсов. Оптимизированные CUDA kernels обеспечивают максимальную производительность операций внимания и matrix multiplication на GPU. Практическое использование VLLM для мультимодальных моделей выглядит следующим образом:
python
from vllm import LLM, SamplingParams
# Инициализация LLaVA с VLLM оптимизациями
llm = LLM(model="llava-hf/llava-v1.6-mistral-7b-hf",
trust_remote_code=True,
max_model_len=4096)
# Быстрая генерация описаний для batch изображений
sampling_params = SamplingParams(temperature=0.7, max_tokens=100)
prompts = [
"USER: <image>\nОпишите сцену на изображении\nASSISTANT:",
"USER: <image>\nКакие эмоции передает это фото?\nASSISTANT:",
"USER: <image>\nПеречислите объекты на изображении\nASSISTANT:"
]
# Массовая обработка за секунды вместо минут
outputs = llm.generate(prompts, sampling_params)
Архитектурные преимущества VLLM особенно проявляются в сценариях высокой нагрузки. PagedAttention позволяет эффективно управлять памятью для запросов различной длины, избегая фрагментации и обеспечивая оптимальное использование GPU memory bandwidth. Continuous batching означает, что система не простаивает в ожидании завершения длинных запросов — короткие запросы обрабатываются параллельно, что кардинально улучшает общую пропускную способность системы. Результаты практического бенчмарка VLLM демонстрируют стабильные показатели: скорость генерации достигает 35-45 токенов в секунду, что в 2-4 раза быстрее vanilla PyTorch. Потребление памяти составляет около 830 МБ, что на 35-40% меньше классического подхода благодаря эффективному управлению KV-cache. Время инициализации модели сокращается до 1-2 секунд за счет оптимизированной загрузки весов. Для задач video-to-text и image-to-text VLLM предоставляет особенные преимущества. При обработке видео, где требуется генерировать описания для множества кадров параллельно, continuous batching позволяет эффективно микшировать короткие описания отдельных кадров с длинными повествовательными описаниями всего видео. PagedAttention эффективно управляет памятью для визуальных эмбеддингов различного размера — от простых изображений до сложных мультимодальных представлений. Интеграция VLLM в production-системы существенно упрощается благодаря продуманному API и поддержке стандартных форматов запросов. Система автоматически оптимизирует batching и memory management, требуя минимальной настройки от разработчиков. Поддержка distributed inference позволяет масштабировать решение на несколько GPU и серверов для обработки enterprise-нагрузок. Особенно впечатляют результаты VLLM в real-time сценариях. Для систем автоматической генерации подписей к видео-контенту, где важна не только скорость, но и консистентность латентности, VLLM обеспечивает стабильную производительность без резких скачков времени обработки. Это критически важно для интерактивных приложений и live-стриминга, где пользователи ожидают мгновенную реакцию системы.
SGLang: структурированная генерация с высокой производительностью
SGLang (Structured Generation Language) представляет собой инновационный подход к оптимизации инференса LLM, который специализируется на эффективной обработке сложных, структурированных запросов и паттернов генерации. В отличие от VLLM, который фокусируется на максимальной пропускной способности, SGLang оптимизирован для сценариев, где требуется точный контроль над процессом генерации и поддержка сложных промпт-инженеринг техник. Бенчмарк-результаты SGLang показывают превосходную производительность: 38-45 токенов в секунду при потреблении ~855 МБ памяти, что делает его на 8-15% быстрее VLLM в сложных сценариях. Время инференса составляет около 2-3 секунд на 100 токенов, что обеспечивает 3-6x ускорение по сравнению с vanilla PyTorch. Ключевые особенности SGLang включают продвинутую систему управления состоянием генерации, которая позволяет эффективно обрабатывать запросы с условной логикой и ветвлениями. Оптимизированный планировщик запросов интеллектуально группирует похожие паттерны генерации для максимальной эффективности batch-обработки. Встроенная поддержка constrained generation обеспечивает генерацию текста с соблюдением заданных форматов и ограничений. Практическое использование SGLang для сложных задач генерации:
python
import sglang as sgl
# Инициализация LLaVA runtime с оптимизациями
runtime = sgl.Runtime(model_path="llava-hf/llava-v1.6-mistral-7b-hf", device="cuda")
# Структурированная генерация для мультимодальных задач
@sgl.function
def generate_image_description(s, image_path):
s += f"USER: <image>\nОпишите что происходит на изображении\nASSISTANT:"
s += sgl.gen("description", max_tokens=50, stop=["\n"])
s += "\nОсновные объекты: "
s += sgl.gen("objects", max_tokens=30, stop=["\n"])
s += "\nНастроение сцены: "
s += sgl.select("mood", choices=["позитивное", "нейтральное", "драматичное"])
# Batch-обработка изображений с различными запросами
image_data = [
{"path": "sports_action.jpg"},
{"path": "nature_landscape.jpg"},
{"path": "city_architecture.jpg"}
]
results = []
for data in image_data:
result = generate_image_description.run(image_path=data["path"])
results.append(result)
Архитектурные преимущества SGLang особенно проявляются в complex prompting scenarios. Система поддерживает multi-step reasoning, где результат одного этапа генерации влияет на параметры следующего. Это критически важно для задач video-to-text, где описание видео может требовать анализа различных аспектов — от визуального содержания до эмоционального контекста. Продвинутое управление памятью в SGLang оптимизировано для работы с переменной длиной запросов и сложными dependency chains. Система эффективно кэширует промежуточные состояния и переиспользует вычисления для похожих паттернов генерации, что особенно важно при обработке видео-последовательностей с повторяющимися элементами. Для production-интеграции SGLang предоставляет гибкую систему middleware, позволяющую легко интегрировать custom logic и preprocessing steps. Это особенно ценно для мультимодальных задач, где требуется сложная обработка визуальных данных перед передачей в языковую модель.
Комплексный анализ производительности: результаты бенчмарков
Для объективной оценки эффективности различных подходов к оптимизации инференса LLM был проведен комплексный бенчмарк на базе репозитория llm-inference-optimization. Тестирование выполнялось на стандартном оборудовании с использованием идентичных условий для всех методов, что обеспечивает достоверность сравнительного анализа. Методология бенчмарка включала измерение ключевых метрик производительности: скорости генерации токенов (tokens/sec), потребления памяти (MB), времени инференса на запрос (seconds), и общей стабильности работы. Каждый подход тестировался на одинаковых наборах промптов с фиксированными параметрами генерации для обеспечения сопоставимости результатов. Сводная таблица результатов бенчмарка (видео-модели, 10-секундные клипы):
Подход | Время генерации описания | Память (МБ) | Прирост к baseline | Применимость |
Vanilla PyTorch | 30 сек | 1300 | baseline | Неприемлемо для продакшн |
VLLM | 12-15 сек | 830 | 2-2.5x быстрее | Отлично! Идем в прод! Но можно ли еще быстрее? |
SGLang | 8-10 сек | 855 | 3-3.7x быстрее | Этот вариант еще быстрее! Но и трудоемкость повыше. |
Результаты демонстрируют значительные различия в производительности. SGLang показывает наилучшую скорость генерации (38-48 токенов/сек), что делает его оптимальным решением для структурированных задач генерации. VLLM демонстрирует отличный баланс скорости и эффективности использования памяти, потребляя на 25 МБ меньше памяти чем SGLang при сохранении высокой производительности. Критически важным открытием является то, что оптимизированные движки (VLLM и SGLang) не только кардинально превосходят vanilla PyTorch по скорости, но и более эффективно используют память. Это контринтуитивный результат — обычно ускорение достигается за счет дополнительного потребления ресурсов, но современные оптимизации демонстрируют противоположную тенденцию. Анализ производительности по задачам показывает, что для video-to-text приложений, где требуется обработка множества кадров в реальном времени, SGLang обеспечивает наилучшую производительность благодаря специализированной обработке структурированных запросов. VLLM оптимален для image-to-text задач с высокой нагрузкой, где важна стабильная пропускная способность и эффективное управление ресурсами. Детальный анализ использования памяти выявляет, что оптимизированные движки достигают эффективности за счет продвинутых техник управления KV-cache и динамического выделения памяти. PagedAttention в VLLM и аналогичные механизмы в SGLang позволяют избежать фрагментации памяти и оптимально использовать доступные ресурсы GPU.
Масштабирование и production-готовность
Тестирование в условиях высокой нагрузки показало, что vanilla PyTorch подход быстро достигает пределов масштабируемости. При обработке 100+ одновременных запросов система становится неотзывчивой, время ответа растет экспоненциально. В противоположность этому, VLLM и SGLang демонстрируют линейное масштабирование до значительно более высоких нагрузок. VLLM показывает исключительную стабильность при batch-обработке. Continuous batching позволяет эффективно микшировать запросы различной сложности, поддерживая стабильную латентность даже при пиковых нагрузках. Это критически важно для production-систем, где пользователи ожидают предсказуемого времени ответа. SGLang демонстрирует превосходную производительность в сценариях с комплексными, многоэтапными запросами. Для задач, требующих условной логики в процессе генерации (например, генерация описаний видео с различным уровнем детализации в зависимости от контента), SGLang обеспечивает на 30-40% лучшую производительность по сравнению с VLLM. Интеграция в существующие системы также показывает значительные различия. Vanilla PyTorch требует минимальных изменений в коде, но не может обеспечить production-уровень производительности. VLLM требует умеренной адаптации кодовой базы, но предоставляет существенные преимущества в масштабируемости и эффективности. SGLang требует более значительного рефакторинга для полного использования его возможностей, но обеспечивает максимальную производительность для сложных сценариев. Анализ total cost of ownership (TCO) показывает, что несмотря на первоначальные затраты на интеграцию оптимизированных решений, экономия на вычислительных ресурсах окупает инвестиции в течение нескольких месяцев для систем со средней и высокой нагрузкой. Сокращение времени обработки в 2-6 раз означает пропорциональное снижение требований к hardware и энергопотреблению.
TensorRT: аппаратная оптимизация для максимальной производительности
NVIDIA TensorRT представляет собой платформу глубокой оптимизации инференса, которая работает на уровне вычислительного графа и специально оптимизирована для GPU архитектур NVIDIA. В отличие от программных оптимизаций VLLM и SGLang, TensorRT фокусируется на максимальном использовании аппаратных возможностей GPU через graph optimization, kernel fusion и precision calibration. Ключевые преимущества TensorRT включают автоматическую оптимизацию вычислительного графа с устранением избыточных операций, fusion операций для минимизации memory transfers, и поддержку mixed precision inference с INT8 и FP16 квантизацией. Для LLM это означает возможность достижения экстремально высокой производительности при сохранении качества генерации. Практическое применение TensorRT для оптимизации LLaVA:
python
import tensorrt as trt
from transformers import LlavaNextForConditionalGeneration
import torch
# Экспорт модели в ONNX для последующей оптимизации
model = LlavaNextForConditionalGeneration.from_pretrained("llava-hf/llava-v1.6-mistral-7b-hf")
torch.onnx.export(model, sample_inputs, "llava_model.onnx")
# Создание TensorRT engine с оптимизациями
logger = trt.Logger(trt.Logger.WARNING)
builder = trt.Builder(logger)
config = builder.create_builder_config()
# Настройка для максимальной производительности
config.set_memory_pool_limit(trt.MemoryPoolType.WORKSPACE, 4 << 30) # 4GB
config.set_flag(trt.BuilderFlag.FP16) # Включение FP16 precision
# Построение оптимизированного engine
network = builder.create_network()
parser = trt.OnnxParser(network, logger)
parser.parse_from_file("llava_model.onnx")
engine = builder.build_serialized_network(network, config)
TensorRT демонстрирует отличные результаты оптимизации, особенно для мультимодальных моделей. Комбинация kernel fusion и mixed precision позволяет достичь 1.5-2x дополнительного ускорения поверх уже оптимизированных VLLM/SGLang решений. Для LLaVA это означает сокращение времени генерации описания изображения до 1-1.5 секунды при сохранении качества output. Особенности integration TensorRT с мультимодальными пайплайнами включают оптимизацию как visual encoder части (обработка изображений), так и text generation части модели. TensorRT эффективно оптимизирует cross-attention mechanisms между visual и textual representations, что критически важно для video-to-text задач. Ограничения TensorRT включают сложность integration и debugging, требования к specific NVIDIA hardware, и потенциальную потерю numerical precision при агрессивной квантизации. Кроме того, TensorRT требует rebuild engine при изменении архитектуры модели или input shapes, что может усложнить development workflow. Гибридные подходы, комбинирующие TensorRT с VLLM или SGLang, показывают наилучшие результаты для production-систем с экстремальными требованиями к производительности. В таких конфигурациях TensorRT оптимизирует computational kernels, а VLLM/SGLang обеспечивают эффективное memory management и request scheduling.
Заключение и практические рекомендации
Результаты комплексного анализа различных подходов к оптимизации инференса больших языковых моделей демонстрируют кардинальные различия в производительности между традиционными и современными оптимизированными решениями. Классический PyTorch подход, несмотря на свою простоту и универсальность, показывает критически низкую производительность для production-применений, особенно в контексте video-to-text и image-to-text задач. VLLM и SGLang представляют собой качественно новый уровень технологий оптимизации инференса, обеспечивая ускорение в 2-6 раз при одновременном снижении потребления памяти. Эти результаты достигаются за счет фундаментальных инноваций в архитектуре систем инференса, включая революционные подходы к управлению памятью, планированию запросов и оптимизации вычислений на GPU.
Рекомендации по выбору подхода оптимизации
Для исследовательских задач и прототипирования рекомендуется использование классического PyTorch подхода благодаря его простоте, гибкости и полной совместимости с экосистемой Hugging Face. Этот выбор оправдан когда скорость разработки важнее производительности инференса, и когда требуется работа с экспериментальными архитектурами моделей. Для production-систем с высокими требованиями к пропускной способности оптимальным выбором является VLLM. Его способность обеспечивать стабильную производительность при высоких нагрузках, эффективное использование памяти и относительная простота интеграции делают его идеальным решением для большинства enterprise-приложений. VLLM особенно рекомендуется для image-to-text задач с batch-обработкой больших объемов изображений. SGLang рекомендуется для сложных сценариев, требующих продвинутого контроля над процессом генерации и структурированных выходных форматов. Его превосходная производительность в multi-step reasoning задачах делает его оптимальным выбором для sophisticated video-to-text приложений, где требуется анализ различных аспектов видеоконтента с условной логикой генерации.
Практические аспекты внедрения
Миграция с классического PyTorch подхода на оптимизированные решения требует планомерного подхода. Рекомендуется начинать с пилотного проекта на ограниченном наборе задач для оценки совместимости и производительности. VLLM обычно требует минимальных изменений в существующем коде, в то время как SGLang может потребовать более существенного рефакторинга для полного использования его возможностей. Критически важным аспектом является тестирование производительности на реальных данных и нагрузках. Результаты бенчмарков на синтетических данных могут не полностью отражать поведение системы в production-условиях, особенно для мультимодальных задач с вариативными размерами изображений и сложностью visual content. Мониторинг и профилирование производительности должны стать неотъемлемой частью production-развертывания. Метрики включают не только скорость генерации и потребление памяти, но также стабильность латентности, эффективность GPU utilization и поведение системы при пиковых нагрузках.
Перспективы развития технологий оптимизации
Анализ текущих тенденций указывает на продолжение эволюции технологий оптимизации инференса в нескольких ключевых направлениях. Ожидается дальнейшее развитие specialized hardware accelerators, оптимизированных специально для трансформер-архитектур и операций внимания. Программные оптимизации будут фокусироваться на более эффективных алгоритмах attention mechanisms и advanced memory management techniques. Мультимодальные оптимизации представляют особенно перспективное направление развития, учитывая растущий спрос на video-to-text и image-to-text приложения. Ожидается появление специализированных движков, оптимизированных для эффективной обработки visual embeddings и их интеграции с текстовыми представлениями. Развитие distributed inference technologies позволит эффективно масштабировать LLM инференс на кластеры GPU и edge devices, открывая новые возможности для real-time и latency-sensitive приложений. Интеграция с облачными платформами и serverless architectures сделает высокопроизводительный инференс более доступным для широкого круга разработчиков. В заключение, выбор оптимального подхода к ускорению инференса LLM должен основываться на тщательном анализе специфических требований приложения, доступных ресурсов и долгосрочных планов развития системы. Инвестиции в современные оптимизированные решения демонстрируют быструю окупаемость и обеспечивают значительные конкурентные преимущества в эпоху повсеместного внедрения AI-технологий.
Источники
Kwon W., Li Z., Zhuang S. et al. "Efficient Memory Management for Large Language Model Serving with PagedAttention" // arXiv preprint arXiv:2309.06180. 2023. URL: https://arxiv.org/abs/2309.06180
Zheng L., Yin L., Xie Z. et al. "SGLang: Efficient Execution of Structured Language Model Programs" // arXiv preprint arXiv:2312.07104. 2023. URL: https://arxiv.org/abs/2312.07104
"LLM inference engines performance testing: SGLang VS. vLLM" // Medium. 2024. URL: https://medium.com/@occlubssk/llm-inference-engines-performance-testing-sglang-vs-vllm-cfd2a597852a
"Ускорение генерации текста с помощью vLLM" // ANNS.ru. 2024. URL: https://anns.ru/articles/news/2024/06/03/uskorenie_generatsii_teksta_s_pomoschju_vllm
"Как мы используем vLLM для ускорения инференса LLM" // Хабр. MTS AI. 2024. URL: https://habr.com/ru/companies/mts_ai/articles/791594/
"vLLM vs SGLang: LLM Throughput Comparison" // TensorFuse Blog. 2024. URL: https://tensorfuse.io/blog/llm-throughput-vllm-vs-sglang
qiulang. "vLLM-SGLang Performance Comparison" // GitHub. 2024. URL: https://github.com/qiulang/vllm-sglang-perf