Непрерывный батчинг LLM: как растёт пропускная способность

Как непрерывный батчинг повышает пропускную способность LLM и влияет на задержки. Роль KV-кеша, поддержка и ограничения vLLM, SGLang, TensorRT-LLM и TGI.

Опубликовано

Автор
Непрерывный батчинг LLM: как растёт пропускная способность

Непрерывный батчинг позволяет добавлять новые запросы в работу общего GPU между шагами генерации. Так ресурсы, освободившиеся после коротких задач, не простаивают в ожидании длинных. Этот подход к планированию описан в основополагающей статье об Orca, которую Yu и соавторы представили на OSDI в 2022 году. При одновременной нагрузке он может увеличить суммарное число токенов в секунду, но более загруженный сервер не обязательно отвечает быстрее каждому пользователю.

Для сервера, на котором одну модель используют несколько клиентов, практическая цель — выполнять больше работы в пределах допустимого времени ответа. График пропускной способности без ограничения по задержке не покажет, сколько клиентов сервер может обслуживать с приемлемым качеством.

Поддержка функций и настройки серверов, описанные ниже, проверены по актуальной документации разработчиков 25 октября 2026 года. Пример расписания иллюстрирует принцип работы и не является аппаратным бенчмарком.

Как работает непрерывный батчинг

При непрерывном батчинге состав активной группы меняется прямо во время генерации. Завершённый запрос покидает её, а ожидающий может занять его место, если планировщику хватает ресурсов. Этот подход также называют in-flight batching или iteration-level batching.

Большая языковая модель, или LLM, сначала обрабатывает промпт на этапе prefill, а затем генерирует продолжение на этапе decode. При обычном авторегрессионном декодировании каждый активный запрос на очередном шаге генерации выдаёт следующий токен — фрагмент текста. Планировщик определяет, какие запросы участвуют в следующем шаге. Подробнее об этих этапах — в руководстве по инференсу LLM.

Представьте общий стол в столовой. При фиксированной посадке следующая группа садится только после того, как поест вся предыдущая. При непрерывной посадке новый посетитель занимает освободившийся стул, пока остальные ещё едят. Стол общий, но обед у каждого свой.

У этой аналогии есть границы: планировщику GPU нужно также выделять ресурсы на обработку промптов и размещение данных в памяти. Свободный стул ещё не означает, что любой запрос из очереди можно принять немедленно.

Что предложили авторы Orca

В Orca единицей планирования стала итерация, а не запрос целиком. В статье Gyeong-In Yu и соавторов для OSDI 2022 описан подход, при котором движок выполняет одну итерацию модели, после чего состав батча пересматривается.

Дополняющий его метод — выборочный батчинг — объединяет в батч отдельные операции модели, учитывая при этом разную историю запросов, необходимую механизму внимания. Этот механизм связывает токен с предшествующим контекстом. Вместе два метода позволяют серверу чередовать работу над запросами разной длины. При планировании авторы также учитывают размер батча и доступную память для ключей и значений. Читать статью об Orca.

Меняется система обслуживания запросов вокруг модели. Обучать саму модель отвечать нескольким людям в одной беседе для этого не требуется.

Статический, динамический и непрерывный батчинг: в чём разница

Главный вопрос — в какой момент новый запрос может присоединиться к уже выполняемой работе. Сам по себе приём нескольких одновременных HTTP-соединений ещё не означает, что модель выполняет запросы с непрерывным батчингом.

МетодКогда формируется или меняется группаЧто происходит с ожидающим запросом
Статический батчингСостав батча остаётся неизменным до конца его выполненияЗапрос ждёт следующего батча, даже если короткий запрос в текущем завершился раньше
Обычный динамический батчингЗапросы собираются в группу до начала выполнения по заданным правиламЗапрос может немного подождать, пока сформируется эффективная группа
Непрерывный батчингСостав группы может меняться между шагами генерацииЗапрос может присоединиться до завершения всей текущей группы, если хватает ресурсов

В документации NVIDIA по батчингу в Triton описан обычный динамический батчинг, включая настройки размера батча и задержки в очереди. Эти настройки решают другую задачу планирования, чем замена запросов в группе во время генерации LLM.

Динамический батчинг в vLLM: когда меняется состав группы

В документации движка для обслуживания LLM vLLM заявлен непрерывный батчинг. «Динамический батчинг» — менее точный термин. В объяснении непрерывного батчинга Hugging Face тоже использует названия динамическое планирование и динамический батчинг для замены завершённых запросов во время генерации. Вместо выводов по одному названию уточняйте, принимает ли движок новую работу между шагами генерации.

Потоковая передача — отдельная функция. Сервер может передавать клиенту токены по мере их появления, сохраняя фиксированный состав выполняемого батча. Здесь же речь о том, что новые запросы получают доступ к ресурсам, освободившимся после завершения предыдущих.

Пример расписания запросов

Короткая задача может освободить полезные ресурсы, пока длинная продолжает выполняться. Рассмотрим условный сервер с двумя местами для декодирования. Запросу A осталось 2 шага, B — 4, а C ждёт в очереди и требует 2 шага работы. В этом примере не учитываем prefill, накладные расходы планировщика и изменение длительности шага.

При фиксированном составе A и B начинают вместе. A завершается, но C ждёт окончания B, прежде чем сможет запуститься следующая группа. При непрерывном батчинге C может занять место A сразу после его завершения и выполняться параллельно с B.

Схема выполнения запросов: при статическом батчинге C ждёт завершения B, а при непрерывном занимает место завершившегося A
Это только иллюстрация планирования. В реальности шаги длятся разное время, а новому запросу также нужны prefill и память.

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

Почему растёт пропускная способность и где мешает KV-кеш

Батчинг позволяет выполнить больше полезной работы при том же перемещении весов модели. Веса — это числовые параметры, которые модель усвоила при обучении и использует для расчёта ответа. Несколько запросов к одной модели могут совместно использовать передачу этих весов через память GPU, эффективнее задействуя доступные вычислительные ресурсы. Непрерывное планирование помогает сохранять полезный состав батча по мере завершения отдельных запросов. NVIDIA объясняет связь между батчингом, перемещением данных в памяти и использованием GPU.

GPU может оставаться занятым и при неэффективном батче. Важно, сколько полезной работы над запросами даёт эта активность, а не насколько заполнен график загрузки.

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

Как PagedAttention помогает эффективнее использовать память

Непрерывный батчинг определяет, что выполняется, а PagedAttention — как хранится состояние механизма внимания. В статье о vLLM 2023 года Woosuk Kwon и соавторы описывают разбиение KV-состояния на блоки фиксированного размера, которые не обязаны располагаться рядом в физической памяти. Таблица соответствия блоков сохраняет логический порядок последовательности.

Так сокращаются потери памяти из-за фрагментации и лишнего дублирования. Более плотное размещение позволяет вместить рабочие данные большего числа запросов, а планировщик получает больше полезной работы на выбор. Авторы прямо указывают, что их подход к управлению памятью дополняет подход Orca к планированию.

Последовательные логические блоки запроса сопоставлены с разнесёнными блоками KV-кеша среди занятых и свободных ячеек памяти
Логический порядок токенов сохраняется, даже когда KV-блоки находятся в разных участках физической памяти. Это концептуальная схема памяти.

Ограничением остаётся физический объём памяти. Более плотное размещение не позволит вместить неограниченное число длинных диалогов. В vLLM нехватка места в KV-кеше может вызвать вытеснение: запрос приостанавливается, а позже его состояние вычисляется заново. Это может увеличить время до завершения. Такое поведение описано в документации по оптимизации.

Как меняются задержки

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

  • Время до первого токена, или TTFT: сколько пользователь ждёт начала ответа.
  • Задержка между токенами: интервалы между токенами после начала потоковой передачи.
  • Полное время ответа: сколько занимает выполнение запроса целиком.

Новому запросу не обязательно ждать, пока завершится весь фиксированный батч. Однако обработка нового большого промпта может конкурировать за ресурсы с уже декодируемыми запросами. Chunked prefill разбивает обработку промпта на небольшие части, чтобы планировщик мог чередовать её с текущей генерацией.

Например, документация vLLM описывает компромисс при выборе бюджета токенов на итерацию: меньшие значения помогают удерживать задержку между токенами, а большие позволяют обрабатывать больше prefill и улучшать TTFT. Поэтому бюджет нужно подбирать под нагрузку, а не бездумно выставлять на максимум. Рекомендации по настройке vLLM.

Непрерывный батчинг LLM при низкой и высокой нагрузке

При низкой нагрузке объединять в батчи может быть почти нечего, а при устойчивой перегрузке очередь никуда не исчезает. Разработчику, отправляющему запросы по одному, не стоит ожидать такого же выигрыша, как у клиентского сервиса с пересекающимися запросами. На другом полюсе нагрузка, превышающая возможности GPU, со временем увеличивает ожидание.

Для интерактивного приложения следите не только за медианой, но и за p95 — 95-м процентилем. Хорошее среднее значение может скрывать небольшую долю очень медленных сессий. Определите допустимые TTFT и интервалы между токенами исходя из пользовательского опыта, а затем измеряйте, какую нагрузку система выдерживает в этих пределах.

Серверы LLM с непрерывным батчингом: поддержка и ограничения

Все четыре сервера ниже документируют поддержку continuous batching или in-flight batching. Общая функция не делает взаимозаменяемыми их планировщики, бюджеты памяти и наборы поддерживаемых моделей.

СерверДокументированная поддержкаВажная настройка или ограничение
vLLM, движок инференса и обслуживания LLMНепрерывный батчинг вместе со страничной организацией KV-памятиЧисло последовательностей, бюджет токенов на итерацию и доступная KV-память
SGLang, фреймворк для обслуживания моделейНепрерывный батчинг в официальном руководстве по обслуживанию моделейЛимит выполняемых запросов и настройки chunked prefill в документации сервера
NVIDIA TensorRT-LLM, среда выполнения инференса NVIDIAIn-flight batching, также называемый непрерывным батчингомОграничения на запросы и упакованные токены; планирование с учётом доступных ресурсов
Hugging Face Text Generation Inference, или TGIНепрерывный батчинг входящих запросовПроект перешёл в режим сопровождения

Непрерывный батчинг в vLLM

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

Документация по оптимизации vLLM с описанием вытеснения запросов и chunked prefill
vLLM: документированные компромиссы в планировании и использовании памяти

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

SGLang

SGLang поддерживает непрерывный батчинг и предоставляет явные настройки допуска запросов. В документации по аргументам сервера описаны --max-running-requests, --chunked-prefill-size и бюджет памяти для весов модели и пула KV-кеша, которым управляет --mem-fraction-static.

Документация по аргументам сервера SGLang с настройками планирования и памяти
SGLang: управление запросами, prefill и памятью

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

NVIDIA TensorRT-LLM

NVIDIA TensorRT-LLM прямо указывает, что in-flight batching, continuous batching и iteration-level batching — названия одного подхода. В документации этой функции описана совместная обработка последовательностей на этапе обработки контекста и на этапе генерации; в описанной реализации используются упакованные входные тензоры.

Документация TensorRT-LLM с объяснением in-flight batching и планирования запросов
TensorRT-LLM: in-flight batching и бюджеты токенов

Лимит запросов и бюджет токенов — разные ограничения. В документации планировщика PyTorch также разделены резервирование ресурсов, включая ёмкость KV-кеша, и выбор выполняемых запросов из тех, для которых ресурсов достаточно. Планировщик in-flight batching не может принять работу, которая не проходит эти проверки.

Hugging Face Text Generation Inference

Hugging Face Text Generation Inference поддерживает непрерывный батчинг, но переход в режим сопровождения меняет выбор для нового развёртывания. Согласно документации, проект теперь принимает небольшие исправления, улучшения документации и небольшие изменения по сопровождению, а для дальнейшего использования рекомендует другие движки, в том числе vLLM и SGLang.

Документация Hugging Face TGI с уведомлением о режиме сопровождения и описанием непрерывного батчинга
TGI: непрерывный батчинг по-прежнему документирован; проект находится в режиме сопровождения

Уже работающая установка TGI не теряет батчинг из-за этого статуса. Для нового стека обслуживания моделей я бы начал оценку с активно развиваемых альтернатив. Если существующее развёртывание выполняет поставленные задачи, планируйте миграцию под конкретную потребность в поддержке или функциональности.

Какие ожидания завышены

Непрерывный батчинг не даёт универсального коэффициента ускорения. В статьях об Orca и PagedAttention оценивались конкретные системы и нагрузки. Эти результаты не выделяют универсальный выигрыш, который можно перенести на произвольную модель, GPU или API провайдера.

Ожидание тоже не исчезает. Запросу в очереди по-прежнему нужны обработка промпта, память и очередь на выполнение по правилам планировщика. Длинные промпты, высокая одновременная нагрузка и нехватка места в кеше остаются ограничениями.

Наконец, более высокая суммарная скорость выдачи токенов ещё не доказывает, что чат-продукт стал лучше. Если пользователи дольше ждут первого токена или сталкиваются с заметными паузами в потоке ответа, дополнительная пропускная способность может достигаться за пределами допустимого для продукта режима работы.

Что изменить в работе уже в понедельник

Разработчикам стоит оценить обслуживание нескольких клиентов на общем сервере, если запросы пересекаются; эксплуатационным командам — настраивать его в пределах допустимых задержек; тем, кто выбирает провайдера, — запрашивать замеры при конкуренции за ресурсы. Инструмент для одного пользователя с редкими запросами может подождать. У сервиса с очередью клиентов и ответами разной длины уже есть конкретная причина действовать. Переход от локального использования к общему серверу разобран в сравнении Ollama и vLLM.

  1. Определите требования к отклику до увеличения числа одновременных запросов

    Зафиксируйте допустимые время до первого токена, интервалы между токенами и полное время ответа для реального рабочего сценария. Фоновому инструменту подготовки сводок и ассистенту поддержки в реальном времени нужны разные пределы допустимых задержек.

  2. Воспроизведите характерное сочетание запросов

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

  3. Измеряйте пропускную способность вместе с очередью и задержками

    Измеряйте суммарное число выходных токенов в секунду, число завершённых и ожидающих запросов, сбои, TTFT и интервалы между токенами. vLLM предоставляет соответствующие метрики, включая vllm:num_requests_waiting, vllm:time_to_first_token_seconds и vllm:inter_token_latency_seconds; они описаны в документации по эксплуатационным метрикам.

  4. Выберите максимальную нагрузку, при которой соблюдаются требования

    Меняйте по одной настройке планирования или памяти за раз. Прекращайте увеличивать число одновременных запросов, когда нарушаются пределы задержек или нехватка памяти вызывает повторяющиеся пересчёты. Запросите у провайдера такие же данные о пропускной способности и задержках при ожидаемом числе одновременных запросов, а также уточните, используются общие или зарезервированные ресурсы.

Результатом должен стать измеренный рабочий предел: нагрузка, которую ваш API выдерживает с сохранением нужного пользовательского опыта. Именно это превращает наличие батчинга в основание для решения о развёртывании.

Чтобы получать практические разборы инфраструктуры ИИ и советы о том, что менять в своём стеке, подпишитесь на рассылку.

Опубликовано
Категория
Build
Похожие статьи
Дерево мыслей: когда ИИ нужен поиск вариантов

Дерево мыслей: когда ИИ нужен поиск вариантов

Как работает дерево мыслей: ветвление, оценка и отсечение. Разбираем отличие от цепочки рассуждений и случаи, когда дополнительные вызовы модели оправданы.24 окт. 2026 г.Build
Цикл ИИ-агента: как он работает и когда должен остановиться

Цикл ИИ-агента: как он работает и когда должен остановиться

Как устроен цикл ИИ-агента: вызовы модели, инструменты и условия остановки. Сравниваем SDK, разбираем зацикливание, лимиты и согласование действий с человеком.24 окт. 2026 г.Build
Агентное программирование: что поручать ИИ и как проверять код

Агентное программирование: что поручать ИИ и как проверять код

Как работают Claude Code, Codex, Cursor и Copilot: что поручать ИИ-агентам, как задавать требования, ограничивать доступ и проверять код перед слиянием.24 окт. 2026 г.Build
Деградация контекста: почему ИИ теряет точность в долгом чате

Деградация контекста: почему ИИ теряет точность в долгом чате

Почему ИИ теряет точность ещё до заполнения контекстного окна, что показало исследование Chroma и как помогают сжатие истории, поиск и чистый контекст.24 окт. 2026 г.Build
Гибридный поиск: как объединить BM25 и векторы

Гибридный поиск: как объединить BM25 и векторы

Как настроить гибридный поиск в Elasticsearch, Weaviate и Pinecone: объединить BM25 и векторы, выбрать RRF или веса и проверить полноту на размеченных запросах.24 окт. 2026 г.Build
Смесь экспертов (MoE): параметры, память и запуск моделей

Смесь экспертов (MoE): параметры, память и запуск моделей

Как работает смесь экспертов (MoE), чем активные параметры отличаются от общего числа и что это значит для памяти, задержки, выбора API и собственных серверов.24 окт. 2026 г.Build
Оценка качества LLM: от тестовых кейсов до решения о релизе

Оценка качества LLM: от тестовых кейсов до решения о релизе

Как проверять изменения LLM на 20 кейсах: задайте критерии, сохраните исходный результат и решайте, готова ли версия к релизу, по итогам повторного прогона.24 окт. 2026 г.Build
Сколько токенов в секунду выдаёт LLM: как измерить скорость

Сколько токенов в секунду выдаёт LLM: как измерить скорость

Сколько токенов в секунду выдаёт LLM и когда пользователь получит ответ? Разбор метрик, бенчмарков и замер скорости потока на Python для своего приложения.24 окт. 2026 г.Build
Рассылка

Одно письмо, каждое воскресенье.Работающие системы, а не горячие мнения.

Еженедельно. Без спама. Отписка в любой момент.