Инференс LLM — не один проход модели
В учебном определении начинается после обучения: параметры зафиксированы, на вход приходит объект, на выходе получается прогноз. Для градиентного бустинга, классификатора изображений или небольшой сети это описание почти совпадает с эксплуатационной единицей работы. Сервер может собрать несколько независимых объектов в пакет, выполнить ограниченный проход, вернуть результаты и освободить память запроса.01Лучше всего эту границу видно на платформах. Разбирал в канале эволюцию Michelangelo в Uber: восемь лет платформа жила предсказательными моделями и хранилищем признаков, а с приходом LLM пришлось достраивать отдельный контур — шлюз, версионирование инструкций, оценку качества и контроль стоимости. Инференс оказался не ещё одним типом модели, а другой эксплуатационной сущностью.Книжный куб · платформа Michelangelo в Uber
Авторегрессионная LLM физически остаётся функцией, но её перестаёт быть одним вызовом. Сначала модель обрабатывает весь вход, затем выдаёт один токен, добавляет его к контексту и снова вызывает почти всю модель. Длина ответа заранее неизвестна. Пользователь ждёт поток. Рядом приходят запросы с другими длинами и приоритетами, а закончившиеся последовательности освобождают место раньше соседей.
| Свойство | Обычная ML-модель | Авторегрессионная LLM |
|---|---|---|
| Единица работы | Один ограниченный проход по входу | Обработка контекста и неизвестное число последовательных шагов |
| Форма результата | Фиксированный тензор, класс или небольшой набор | Поток токенов переменной длины |
| Состояние запроса | Обычно освобождается после прохода | KV-кеш растёт с каждым токеном; при паузе его сохраняют или выгружают, чтобы затем продолжить генерацию |
| Формирование пакета | Пакет живёт до завершения всех элементов | Состав пакета выгодно пересобирать после каждой итерации |
| Главная метрика | Задержка запроса, запросы в секунду, стоимость примера | Время до первого токена, ритм следующих токенов, полное время и полезная пропускная способность |
| Главный ресурс | Зависит от модели; часто вычисления | Вход чаще упирается в вычисления, генерация — в память |
| Масштабирование | Реплики и параллелизм по модели и данным | Реплики, TP/PP/EP, маршрутизация по кешу и разделение стадий |
Ключевое отличие — . Для каждого слоя механизма внимания он хранит ключи и значения уже обработанных токенов, чтобы следующий шаг не пересчитывал всю историю. С вычислительной точки зрения это радикальная экономия. С системной — новый крупный объект состояния, который растёт с длиной контекста, числом одновременных запросов, ветвлением ответов и количеством реплик. Его нужно разместить, совместно использовать, вытеснить, передать или восстановить после сбоя.
Поэтому среднее число токенов в секунду мало что говорит пользователю. Можно увеличить размер пакета и получить высокую пропускную способность, одновременно заставив интерактивные запросы долго ждать первый токен. Можно быстро начать ответ, но затем выдавать токены рывками. Для LLM нужны как минимум четыре измерения.
| Метрика | Что измеряет | Из чего складывается |
|---|---|---|
| Время до первого токена (TTFT) | От приёма запроса до первого токена | Очередь, токенизация, обработка контекста, передача состояния |
| Время на выходной токен (TPOT) / интервал между токенами (ITL) | Интервал между последующими токенами | Размер активного пакета, длина контекста, полоса HBM, помехи от новых входов |
| Полная задержка запроса (E2E) | Весь запрос до последнего токена | TTFT плюс число и длительность шагов генерации |
| Пропускная способность | Все завершённые запросы или токены за время | Может расти ценой хвостовой задержки |
| Полезная пропускная способность | Работа, завершённая внутри заданных SLO | Требует одновременно задать TTFT, TPOT и профиль нагрузки |
Термин возвращает SLO в определение мощности: считается только работа, уложившаяся в заданные ограничения TTFT и TPOT. Именно эта постановка объясняет, почему две конфигурации с одинаковыми суммарными токенами в секунду могут иметь разную эксплуатационную ценность.
Один запрос создаёт два разных профиля машины
После токенизации начинается . Модель получает сразу много позиций, строит для них представления и заполняет KV-кеш. Большие матричные операции хорошо используют вычислительные блоки ускорителя. Чем длиннее вход, тем больше работы механизма внимания и линейных слоёв можно выполнять параллельно — до тех пор, пока память и форма операций не станут новым пределом.
После генерации первого токена ответа начинается . На каждом шаге у каждой активной последовательности появляется всего одна новая позиция. Матричные операции становятся узкими, зато нужно читать веса и всё более длинный KV-кеш. На типичной малой или средней нагрузке арифметические блоки ждут данные из HBM: стадия ограничена полосой памяти. Большой пакет повышает арифметическую интенсивность, но одновременно увеличивает TPOT и объём активного кеша.02Ту же мысль я разбирал в канале с другой стороны — по докладу Валентина Мамедова про рынок ускорителей. Там сравнение потребительской и серверной карты сводится не к пиковым операциям, а к полосе памяти: 1 ТБ/с против 3 ТБ/с. Для генерации это и есть главная разница.Книжный куб · куда катится железо для нейронок
Память весов — только первый член бюджета
Нижняя оценка памяти весов выглядит просто. Для модели с P параметров и точностью B бит до служебных буферов нужно примерно:
У 70-миллиардной модели BF16-веса занимают около 140 десятичных гигабайт; 4-битное представление — около 35 гигабайт до масштабных коэффициентов, метаданных, незаквантованных слоёв и рабочих буферов среды выполнения. Но освободившееся место не превращается целиком в новые запросы: нужен KV-кеш, промежуточные активации, буферы коллективных операций и запас на случай нехватки памяти (OOM — исчерпание памяти).
Объём KV-кеша на одну последовательность можно оценить так, где L — число слоёв, H_kv — число KV-голов, D_h — размер головы, S — байт на элемент, а T — число уже обработанных токенов:
Двойка — это K и V. В многозапросном внимании (MQA) все головы запросов разделяют один набор K/V; во внимании с группировкой запросов (GQA) такой набор есть у каждой из нескольких групп. Поэтому архитектура модели заранее задаёт стоимость каждого активного токена. При выборе среды выполнения нельзя смотреть только на число параметров: две модели одинакового размера с разным числом KV-голов ведут себя по-разному на длинном контексте.
Четыре распределения важнее одной средней длины
- Длина входа определяет объём работы до первого токена и исходный KV-кеш.
- Длина выхода определяет число строго последовательных проходов и время жизни состояния.
- Параллельность определяет, сколько весов и токенов можно амортизировать одним пакетом.
- Повтор префиксов определяет, какую часть входа можно не вычислять заново.
Эти оси взаимодействуют нелинейно. Десять коротких запросов могут заполнить матричные блоки лучше одного длинного, но десять длинных ответов удерживают KV на порядки дольше. Высокий повтор префикса уменьшает вычисление только после прогрева и при маршруте к правильной реплике. Всплеск параллельности меняет не только очередь: он увеличивает пакет, арифметическую интенсивность и давление на память одновременно. Поэтому профиль нельзя описать тремя раздельными средними: длиной входной последовательности (ISL), длиной выходной последовательности (OSL) и числом запросов в секунду (QPS). Нужен их совместный трейс, сохраняющий временные корреляции.
RAG с длинными документами, чат с короткими репликами, генерация кода и длинные рассуждения с тысячами выходных токенов — не одна нагрузка. Средние 2K входа и 500 выхода могут скрывать редкие 100K-контексты, которые занимают память и ломают хвост TTFT. Поэтому сравнительное испытание должно воспроизводить совместное распределение длин и поток поступления, а не прогонять одинаковую строку в цикле.
До vLLM оптимизировали модель, ядра и расписание — по отдельности
Большинство известных сегодня приёмов не начались с vLLM. KV-кеш давно использовался для авторегрессионного декодирования. В 2019 году Noam Shazeer предложил multi-query attention, чтобы головы запросов делили общий набор K/V и меньше читали из памяти. В 2023 году GQA заняла компромиссную точку: несколько KV-групп вместо одной общей (MQA) или отдельной группы на каждую голову запросов (MHA).
Параллельно развивались шардирование весов и конвейер модели, специализированные GEMM, слияние операций и низкие форматы. GPTQ сжимала веса по информации о кривизне, SmoothQuant переносила сложность выбросов из активаций в веса для W8A8, AWQ защищала небольшую долю важных каналов. Эти работы решают разные задачи. Весовой INT4 уменьшает память и трафик весов, но не гарантирует четырёхкратное ускорение: если GPU не имеет быстрого ядра нужного формата, время уйдёт на распаковку и преобразование.03Мне нравится, что этот эффект воспроизводится даже на ноутбуке. Разбирал в канале большую практическую статью о локальном запуске: там прямо показано, что более мелкий квант не обязательно быстрее — i-кванты требуют больше вычислений, и сэкономленные байты съедаются арифметикой.Книжный куб · как выжать больше из локальных LLM
В 2022 году FlashAttention показала другую линию: считать точный механизм внимания быстрее, не меняя математический ответ, за счёт блочной обработки и меньшего обмена HBM ↔ SRAM. Это важный сдвиг мышления. Номинальные FLOPS не определяют время, если GPU большую часть цикла перемещает данные.
| Подход | Механизм | Что экономит | Граница |
|---|---|---|---|
| KV-кеш | Не пересчитывать прошлые токены | Вычисления | Память растёт с контекстом и параллельностью |
| MQA / GQA | Уменьшить число KV-голов | HBM и размер кеша | Решение зашито в архитектуру модели |
| Квантование | Хранить и считать в меньшей точности | Память, полоса, иногда FLOPS | Нужны подходящие GPU-ядра и проверка качества |
| TP / PP | Разместить модель больше одного ускорителя | Вместимость и вычисления | Появляются коллективные операции и конвейерные пузыри |
| FlashAttention | Сократить обмен HBM ↔ SRAM | Движение данных механизма внимания | Не решает планирование и память всего сервиса |
| Orca | Пересобирать работу после каждой итерации | Простой GPU и ожидание пакета | Планировщик становится частью критического пути |
Orca изменила единицу планирования
До генеративных моделей сервер часто формировал статический пакет запросов и ждал, пока закончатся все. Для ответа на 20 токенов рядом с ответом на 500 это означает 480 лишних итераций ожидания и невозможность добавить новую работу. В OSDI 2022 система Orca предложила планирование на уровне одной итерации модели и выборочное формирование пакетов.
Современное наследует эту идею: закончившиеся последовательности уходят, новые входят, приостановленные могут быть вытеснены. Это критическая историческая оговорка. vLLM внедрила и популяризировала такой режим в доступном движке, но не изобрела сам принцип планирования на уровне итераций.
vLLM принесла виртуальную память в KV-кеш
Весной 2023 года команда LMSYS обслуживала Vicuna и Chatbot Arena на ограниченном университетском парке GPU. По первому анонсу vLLM, бэкенд на Hugging Face Transformers стал узким местом по мере роста трафика. Команда UC Berkeley сделала открытый движок vLLM и интегрировала его с FastChat. Практическая постановка была не «как ускорить один GEMM», а «как удержать больше живых запросов на тех же GPU».
Проблемой оказалось управление KV-кешем. Длина будущего ответа неизвестна, но традиционный распределитель памяти либо резервировал непрерывный диапазон под максимум, либо страдал от внешней фрагментации после запросов разных длин. В первом анонсе авторы измерили 60–80% потерь памяти от резервирования и фрагментации в прежних системах. Это число относится к их рабочим нагрузкам и реализациям, но сам механизм проблемы общий.
PagedAttention заимствует аналогию виртуальной памяти. Последовательность видит логические блоки KV подряд, но таблица блоков отображает их на произвольные физические блоки GPU. Память выделяется по мере генерации, поэтому свободные блоки остаются в общем пуле и могут сразу принять KV другого запроса; заранее резервировать место под неизвестный максимум больше не нужно. Потери остаются главным образом в последнем неполном блоке. Общая инструкция нескольких ветвей может ссылаться на те же физические страницы, а при расхождении включается копирование при записи.
Экономия памяти не делает одну операцию механизма внимания магически быстрее. Она позволяет увеличить эффективный пакет, лучше амортизировать чтение весов и загрузить GPU. В SOSP-работе vLLM показала в 2–4 раза большую пропускную способность при сопоставимой задержке против FasterTransformer и Orca; выигрыш рос на длинных последовательностях, больших моделях, а также при параллельной генерации нескольких вариантов и лучевом поиске, где ветви могут совместно использовать блоки общего префикса. Ранний блог сообщал до 24 раз против базового бэкенда Hugging Face и до 3,5 раза против TGI. Это разные базы сравнения — их нельзя склеивать в одно «vLLM ускоряет в 24 раза».
Второй вклад vLLM — организационный. Открытый API, поддержка моделей и единый движок сервинга дали исследователям точку, куда можно встраивать новые GPU-ядра, политики планирования и передачу KV. Поэтому vLLM стала для инференса тем же, чем популярная среда выполнения становится для языка: не единственно возможной реализацией, а общей площадкой, на которой идеи быстрее доходят до эксплуатации.04Этажом ниже этот сюжет уже разыгрывался. Смотрел документальный фильм про PyTorch и рассказывал о нём в канале: инструмент для быстрых экспериментов стал стандартом не за счёт бенчмарков, а за счёт удобства разработки, экосистемы и нейтрального управления. На слое сервинга vLLM повторяет ту же траекторию.Книжный куб · документальный фильм про PyTorch
Карта трюков: каждый экономит свой дефицитный ресурс
Список флагов движка создаёт ложное ощущение независимых ускорителей. На практике это стек взаимосвязанных преобразований. Квантование уменьшает объём весов, после чего узкое место может перейти в KV-кеш. Префиксный кеш экономит обработку входа, но создаёт перекос и требует маршрутизации по локальности. Большой пакет лучше загружает матричные блоки, но удерживает больше KV-памяти и увеличивает время между токенами у самых медленных запросов — например, P95/P99 метрики TPOT.
| Слой | Примеры | Цель | Почему может не сработать |
|---|---|---|---|
| Архитектура | MQA/GQA, MLA, MoE, дистилляция | Байты на токен, активные параметры | Требует другой модели или обучения |
| Числовой формат | FP8, W8A8, W4A16, KV FP8 | Вместимость, HBM, матричные операции | Формат без быстрого ядра только экономит память |
| GPU-ядра и графы | FlashAttention, слияние операций, CUDA Graphs | Ввод-вывод, запуски, синхронизация | Выигрыш зависит от формы тензоров и поколения GPU |
| Память | Страницы, префиксный кеш, выгрузка в RAM/SSD | Число активных токенов | Попадание в кеш должно окупать поиск и передачу |
| Планировщик | Непрерывные пакеты, порции входа, вытеснение | Утилизация и хвосты задержки | Политика приоритета может создать голодание |
| Декодер | Черновая модель, Medusa, EAGLE | Число последовательных шагов | Низкая доля принятия делает проверку накладной |
| Кластер | TP/PP/EP, кеш-ориентированный маршрут, P/D | Полезная мощность парка | Сеть, топология, масштаб и отказы становятся частью сервиса |
Модель пределов связывает ускорение с реально сэкономленными байтами
Удобная проверка любого приёма начинается с арифметической интенсивности: сколько операций выполняется на байт, прочитанный из памяти. Верхняя граница производительности R задаётся меньшим из двух значений — пиковой вычислительной мощностью ускорителя и произведением интенсивности на полосу памяти:
Разница сводится к тому, сколько полезной работы приходится на одно чтение весов. При обработке длинного входа блок весов загружается и сразу применяется ко многим позициям: одна передача из HBM обслуживает много операций, поэтому точка находится справа на графике. При генерации очередного токена у каждой последовательности только одна новая позиция: тот же объём весов обслуживает гораздо меньше операций, и скорость чаще задаёт полоса памяти. Пакет из нескольких последовательностей повторно использует загруженные веса и сдвигает генерацию вправо, но требует больше KV-памяти и заставляет запросы ждать друг друга. Поэтому суммарные токены в секунду могут вырасти, а TPOT — ухудшиться.
Квантование полезно только тогда, когда сокращение байтов совпадает с пределом нагрузки и GPU умеет считать в выбранном формате. Весовой W4A16 часто помогает малому пакету генерации, потому что уменьшает чтение весов. W8A8 или FP8 могут ускорить матричные операции обработки входа, если есть подходящие тензорные блоки и откалиброваны выбросы. Квантование KV уменьшает растущее состояние, но затрагивает механизм внимания на каждом шаге и требует отдельной проверки качества на длинных контекстах. Ни один из этих эффектов нельзя выводить только из числа бит.
GPU-ядро, слияние операций и CUDA Graphs ускоряют разные части исполнения
Специализированное GPU-ядро — программа, которую GPU запускает для конкретной операции, — определяет укладку данных, обмен между HBM и SRAM, векторизацию и используемую точность. Слияние операций объединяет несколько последовательных вычислений в одно такое ядро. Тогда промежуточный тензор не нужно записывать в HBM и читать обратно, а отдельные запуск и синхронизация исчезают. CUDA Graphs, в свою очередь, сокращают время запуска повторяющейся последовательности ядер.
Глубоким слиянием называют объединение длинной цепочки операций в одно ядро. Чем длиннее цепочка, тем больше ей нужно регистров и разделяемой памяти; из-за этого на GPU может одновременно исполняться меньше блоков. Такое ядро также сложнее адаптировать к новым архитектурам модели. Поэтому движки держат несколько путей исполнения и выбирают ядро по форме. Переменная длина, редкая ветвь, новый адаптер или нестандартный размер пакета могут вернуть исполнение в обычный режим.
Способ распараллеливания определяет, что и как часто передаётся между ускорителями
Есть два принципиально разных способа распределить работу. TP, PP и EP раскладывают один проход модели между ускорителями: завершение запроса зависит от их совместной работы. Реплики, напротив, выполняют проход целиком и делят между собой независимые запросы. Отсюда различаются цена сети, точки синхронизации и тип простоя.
При тензорном параллелизме части одной матричной операции выполняются одновременно. В показанном варианте каждый GPU считает частичный результат, а all-reduce суммирует результаты перед следующим слоем. Так на один GPU приходится меньше весов и вычислений, но коллективный обмен становится частью почти каждого слоя. На коротком шаге генерации задержка межсоединения может съесть выигрыш от разделения работы.
Конвейерный параллелизм проводит запрос через последовательные группы слоёв на разных GPU. Чтобы стадии работали одновременно, пакет делят на микропакеты. Пока конвейер заполняется и опустошается, крайние стадии простаивают; дополнительные пузыри возникают, если группы слоёв несбалансированы. Поэтому PP эффективнее при достаточном числе микропакетов и предсказуемой нагрузке.
Параллелизм экспертов применяют в моделях MoE: маршрутизатор выбирает экспертов для каждого токена, после чего данные токенов расходятся по GPU и возвращаются после вычисления. Поэтому они дважды проходят по сети. Если одного эксперта выбирают чаще, у него растёт очередь, а остальные GPU недогружены: экономия на числе активных параметров сама по себе не обеспечивает равномерной загрузки.
Реплика получает независимый запрос и выполняет весь проход внутри своей группы ускорителей. Между репликами не нужен обмен на каждом токене: балансировщик лишь выбирает, куда отправить новый запрос. Это позволяет наращивать поток и изолировать сбои или клиентов, но каждая группа-реплика хранит ещё одну копию модели. Внутри реплики при этом по-прежнему могут использоваться TP, PP или EP.
Для обработки входа и генерации оптимальная конфигурация может различаться. Длинный вход хорошо загружает широкую TP-группу, а короткий шаг генерации может потратить на коллективный обмен больше времени, чем сэкономить на вычислении. Это повод проверить разделение стадий, но ещё не доказательство его пользы. Сначала нужно измерить варианты, в которых обе стадии остаются в одном пуле: только TP, сочетание TP с PP, а для MoE — ещё и с EP. Отдельные пулы оправданы лишь тогда, когда выигрыш двух специализированных конфигураций перекрывает стоимость передачи KV и дополнительной очереди.
Несколько LoRA-адаптеров превращают модель в многопользовательский сервис
Multi-LoRA — способ одновременно обслуживать несколько дообученных вариантов одной базовой модели. Сервис держит одну копию базовых весов и для каждого запроса подключает выбранный LoRA-адаптер — небольшой набор низкоранговых поправок. Это экономит HBM по сравнению с отдельной репликой на каждого клиента и позволяет смешивать адаптеры в одном пакете. Цена появляется в разреженных обращениях к разным поправкам, загрузке холодных адаптеров, усложнении GPU-ядер и планировании справедливости. Если активный набор адаптеров велик или трафик сильно перекошен, кеш адаптеров и очередь становятся новым узким местом. Метод сохраняет качество конкретного адаптера, но не исправляет различия токенизатора, базовой версии модели или несовместимых форматов квантования.
Выгрузка и многоуровневый кеш обменивают ёмкость на задержку
Когда HBM заполнена, веса, адаптеры или KV можно перенести в оперативную память узла, на локальный накопитель или в удалённый кеш. Так сервис хранит больше состояния, чем помещается в памяти GPU, но доступ к вынесенным данным становится медленнее. Перед вычислением их нужно вернуть в HBM, поэтому стоимость определяют поиск, очередь и передача по каналу от RAM, накопителя или сети к GPU. Для большого префикса одна быстрая передача может быть дешевле повторной обработки; для короткого продолжения поиск удалённого блока способен занять больше времени, чем пересчёт.
На кластере локальность конфликтует с балансом нагрузки. Маршрутизатор, всегда выбирающий горячий кеш, перегружает популярную реплику; маршрутизатор, всегда выбирающий короткую очередь, уничтожает повтор вычислений. Этот конфликт решают распределённые системы инференса с маршрутизацией по состоянию KV-кеша. Preble — исследовательская система планирования запросов с повторяющимися префиксами; llm-d — открытый Kubernetes-стек, где маршрутизатор учитывает префиксный кеш и нагрузку реплик. Масштаб у проектов разный, но принцип общий: выбирать реплику по сочетанию доступного кеша и текущей очереди, а не по правилу «кеш важнее». Правильная метрика — выигрыш полезной пропускной способности после учёта промахов, вытеснений, дублирования блоков и времени восстановления индекса.
Порционная обработка входа борется не с вычислениями, а с остановками
Когда планировщик вставляет длинную инструкцию между шагами текущих ответов, их TPOT скачет. SARATHI разделила большой вход на порции и добавляла одну порцию к пакету с приоритетом генерации. Sarathi-Serve в OSDI 2024 показала прирост обслуживаемой нагрузки при SLO хвостовой задержки: 2,6 раза для Mistral-7B на одном A100, 3,7 раза для Yi-34B на двух A100 и до 5,6 раза для Falcon-180B с конвейерным параллелизмом относительно выбранных авторами базовых систем. Это три эксперимента, а не множители одной системы.
Повтор префикса превращает вычисление в задачу размещения
SGLang предложила RadixAttention: хранить KV общих префиксов в radix tree и переиспользовать их между вызовами программы. Для шаблона с несколькими примерами, общей системной инструкции или RAG-документа это может убрать большую часть обработки входа. В одном GPU политика сводится к поиску и вытеснению. В кластере запрос надо направить к реплике, у которой уже лежит нужный префикс, не создав горячий узел. Preble добавила глобальное планирование по стоимости пересчёта и справедливости.
Спекуляция меняет число последовательных проходов
использует дешёвую черновую модель: та предлагает несколько токенов, а основная модель проверяет их параллельно и принимает допустимый префикс без изменения целевого распределения. Medusa добавляет несколько голов к самой модели; EAGLE предсказывает признаки предпоследнего слоя. Общая экономика определяется долей принятия, ценой черновика, размером проверочного пакета и исходным узким местом. Если основная модель уже ограничена вычислениями на большом пакете, дополнительная проверка способна уменьшить пропускную способность, даже улучшив задержку одного запроса.05Отрезвляющий пример измерения такой экономии я разбирал в канале. В работе Google описано внедрение подсказок во внутреннюю IDE: там спекулятивное декодирование стоит рядом с адаптивным кешем, кеш даёт около 35% попаданий, а медианная задержка падает всего на 9%. Приём оценивают в конце воронки, а не по его собственной метрике.Книжный куб · AI-функции во внутренней IDE Google
- Сначала зафиксировать базовую линию с одинаковой моделью, выбором токенов и входным трейсом.
- Менять один слой и измерять TTFT, TPOT, полезную пропускную способность, память и качество вместе.
- Проверять взаимодействия: квантование × GPU-ядра, размер порции × планировщик, кеш × маршрутизатор.
- Не перемножать цифры vLLM, Sarathi, EAGLE и кеша из разных публикаций.
Разделённый инференс начался с несовместимых профилей стадий
К концу 2023 года стало ясно, что общий GPU-пул связывает два решения, которые хочется принимать независимо. Для быстрого TTFT длинного входа полезны высокая вычислительная мощность и один план тензорного/конвейерного параллелизма. Для стабильного TPOT нужна полоса памяти, другой пакет и иногда более дешёвый тип ускорителя. Один компромиссный план либо ухудшает одну стадию, либо заставляет держать лишний резерв обеих.
выделяет независимые пулы обработки контекста и генерации. Узел обработки контекста строит KV, затем состояние передаётся узлу генерации, который продолжает последовательность и выдаёт ответ потоком. Это не конвейерный параллелизм: при PP слои одной модели разделены между устройствами в рамках каждого прохода; здесь целые временные стадии запроса исполняют разные реплики модели.
В публикациях эту архитектуру часто сокращают до P/D: P — обработка входного контекста и построение KV-кеша, D — пошаговая генерация токенов по этому состоянию. Ниже я использую полные названия стадий, когда сокращение скрывает механизм.
Splitwise была первой явной формулировкой разделения стадий
Препринт Microsoft Splitwise вышел 30 ноября 2023 года. Авторы измерили вычислительно насыщенную обработку входа и ограниченную полосой памяти генерацию токенов, предложили выполнять их на разных машинах, независимо выбирать поколения GPU и передавать состояние по быстрому межсоединению. Их цель включала пропускную способность, стоимость и мощность кластера.
18 января 2024 года DistServe независимо сформулировала проблему через SLO: устранить взаимное влияние, отдельно подобрать ресурсы и параллелизм стадий и максимизировать полезную пропускную способность при ограничениях TTFT и TPOT. В экспериментах авторы сообщали до 7,4 раза больше обслуживаемых запросов или в 12,6 раза более строгий SLO против выбранных систем, оставаясь внутри ограничений для более 90% запросов. Эти результаты описывают крупные конфигурации и не являются обещанием для двух GPU.
| Стратегия | Сильная сторона | Цена |
|---|---|---|
| Совмещённый пул | Простота, KV остаётся локальным, легко начать | Новые длинные входы задерживают текущую генерацию; обе стадии делят один план параллелизма |
| Порционная обработка контекста | Сглаживает остановки без передачи KV между узлами | Нужно подобрать размер порции; TTFT и TPOT всё ещё связаны одним пулом |
| Отдельные пулы обработки контекста и генерации | Независимые мощности, параллелизм и SLO стадий | Передача KV, согласование темпа, топология, больше отказов и операционных состояний |
Полный путь запроса длиннее передачи KV между пулами
Входной маршрутизатор сначала выбирает модель, адаптер и допустимый пул, затем проверяет, не существует ли уже подходящего префикса. Промах отправляет запрос в очередь обработки контекста. После токенизации и обработки контекста узел фиксирует карту блоков, числовой формат, позиционные параметры и точку продолжения. Только после этого можно выбрать реплику генерации с учётом свободных слотов, топологии и существующего состояния. Получатель подтверждает владение KV до начала потоковой выдачи; иначе сбой между передачей и первым токеном оставляет систему без однозначного владельца запроса.06Классические сервисы пришли к тому же выводу раньше. Когда я разбирал в канале устройство инфраструктуры Meta, самым полезным был именно сквозной путь запроса: точка присутствия, долгоживущие соединения в частную сеть, балансировщик, функция фронтенда и десятки бэкендов. Разница у LLM одна, но принципиальная: по этому пути едет ещё и состояние.Книжный куб · сквозной путь запроса в инфраструктуре Meta
Нижняя оценка времени передачи равна размеру KV, делённому на эффективную полосу сети, плюс очереди, установление соединения и служебные данные. Эффективная полоса почти всегда ниже паспортной: несколько запросов делят канал, блоки прибывают неравномерно, а протокол может делать дополнительные копии. Поблочная или послойная передача позволяет D начать раньше полного завершения P, но создаёт обратное давление: генерация не должна обогнать поступление нужного слоя.
Согласование темпа начинается с двух производительностей: сколько входных токенов в секунду P превращает в KV и сколько активных последовательностей D может продвигать, не нарушая TPOT. Достаточно быстрый средний темп не гарантирует устойчивости: всплеск длинных входов заполняет буфер передачи, а длинные ответы удерживают D-слоты после того, как P уже закончил свою работу. Нужны ограничения приёма, резерв по квантилям и отдельное масштабирование очередей, но решения должны координироваться, чтобы новый P-узел не перегрузил прежний D-пул.
Повторное вычисление остаётся полноценной стратегией восстановления. Для короткого входа дешевле заново построить KV на D, чем искать удалённую копию; для длинного общего префикса выгоднее держать несколько реплик или долговечный уровень кеша. Политика должна учитывать возраст блока, вероятность следующего хода, стоимость сети и очередь ускорителя. Так разделение стадий превращает локальный объект памяти в распределённый контракт: кто владеет блоком, кто может его удалить и какое событие означает, что запрос безопасно продолжать.
Mooncake сделала KV-кеш центром архитектуры
В июне 2024 года Moonshot AI опубликовала Mooncake — платформу Kimi, где разделённая обработка контекста соединена с распределённым KV-кешем и многоуровневой памятью. После этого история перестала быть только про два пула GPU. KV стал объектом контура данных: его блоки нужно индексировать, размещать, перемещать между HBM, памятью узла и хранилищем, а маршрутизатор должен знать не только нагрузку, но и локальность кеша.
P/D-Serve описала эксплуатацию на десятках тысяч xPU: динамическое соотношение узлов обработки и генерации, перенаправление при отказе принять запрос и оптимизированную передачу между устройствами. В 2025–2026 годах Dynamo и llm-d собирают те же идеи в открытые оркестрационные слои поверх vLLM, SGLang и TensorRT-LLM: движок инференса исполняет модель, а отдельная среда выполнения владеет маршрутом, состоянием кеша, масштабированием и восстановлением.
Передача KV превращает ускорение в распределённую задачу
Разделение убирает локальное взаимное влияние, но создаёт обязательную передачу. Размер передаваемого состояния линейно растёт с входными токенами и коэффициентом KV модели. Если P-узел строит десятки гигабайт кеша быстрее, чем сеть доставляет их D-узлу, очередь просто переезжает из планировщика в транспорт. TTFT теперь включает ожидание обоих пулов, передачу метаданных и самого KV.
Поэтому DistServe размещает стадии с учётом полосы, Mooncake строит отдельный движок передачи, vLLM предоставляет коннекторы поверх NIXL/Mooncake/LMCache, а Dynamo выделяет контуры запросов, управления и состояния. При хорошем NVLink/NVSwitch внутри домена и RDMA между узлами передачу можно скрыть конвейерной поблочной пересылкой. При обычном Ethernet или перегруженной сети выигрыш исчезает.
Нужно согласовать темп двух производственных линий
Отношение P:D нельзя взять из документации. Оно зависит от соотношения входа и выхода, длины рассуждения, попаданий в кеш и целевого SLO. Если обработка входа производит KV быстрее, чем генерация освобождает слоты, D-пул становится очередью и P простаивает. Если генерация короткая, горячим оказывается P-пул. Масштабирование одной стадии меняет давление на другую, поэтому автомасштабирование должно видеть не только загрузку, но и интенсивность поступления, токены в обработке и очередь передачи.
Многоходовые диалоги и агенты ломают однонаправленный конвейер
В первом ходе путь P → D естественен. После ответа KV живёт на D. В следующем ходе пользователь добавляет небольшой фрагмент: классическая P/D-схема отправляет старое состояние обратно в P, обрабатывает добавленный фрагмент и снова передаёт его D. Для агентного цикла с вызовами инструментов такие пересылки могут доминировать над вычислением. Препринт PPD 2026 года предлагает иногда обрабатывать добавленный фрагмент прямо на D; Load-Aware Prefill Deflection — возвращать на D часть новых входов, когда очередь и передача дороже локального взаимного влияния. Это гибриды, а не отмена исходной идеи.07Что это уже не теория, видно по рынку. Разбирал в канале материал SemiAnalysis про аренду ускорителей: цену разгоняет не обучение, а эксплуатационный инференс агентов, где одна задача разворачивается в дерево вызовов. Такие нагрузки бьют не столько по сумме токенов, сколько по пиковой одновременности.Книжный куб · рынок аренды GPU и агентные нагрузки
Отказ — это вопрос владения состоянием
Если P умер до подтверждения передачи, запрос можно повторить. Если D умер после передачи, нужно найти копию KV, восстановить её из уровня памяти или пересчитать вход. Если маршрутизатор потерял актуальный индекс, решение с учётом кеша направит запрос к пустой реплике. Если независимое масштабирование удалило узел с горячим префиксом, TTFT скачет без роста входного трафика. Производственная архитектура обязана явно определить владельца блока, срок жизни метаданных, идемпотентность передачи и поведение при частичной передаче.
Работа Revisiting Disaggregated LLM Serving добавляет ещё одну оговорку: преимущество по производительности и энергии не гарантировано и зависит от нагрузки, пути передачи и базовой системы. Раздельное управление частотой стадий в их измерениях не компенсировало дополнительную энергию системы. Поэтому утверждение «разделение экономит GPU» без трейса, топологии и SLO — не инженерный вывод, а гипотеза.
На 2026 год победила не одна схема, а композиция контуров
Современный движок вроде vLLM или SGLang соединяет непрерывное планирование, оптимизированные GPU-ядра внимания, GEMM и MoE, разные форматы весов и KV, префиксное кеширование, спекулятивное декодирование и несколько видов параллелизма. Над ним может стоять кластерная среда выполнения с маршрутом по кешу, многоуровневой памятью, автомасштабированием и P/D. Модель всё чаще тоже проектируется под инференс: GQA/MLA уменьшают KV, MoE сокращает активные параметры, предсказание нескольких токенов помогает спекуляции.08На другом полюсе масштаба это выглядит так же. Разбирал в канале доклад Maxime Labonne из Liquid AI: считать номинальные операции недостаточно, архитектуру приходится проверять профилированием обработки входа, генерации и памяти прямо на целевом устройстве. Совместное проектирование — история не только про кластер.Книжный куб · Liquid AI об обучении маленьких моделей
Это не означает, что любое развёртывание должно повторять архитектуру гиперскейлера. Один узел с совмещённым движком устраняет передачу KV и имеет меньше режимов отказа. Порционная обработка часто даёт достаточно контроля TPOT. Префиксное кеширование может дать больший эффект, чем P/D, если рабочая нагрузка содержит огромную общую инструкцию. Разделение окупается, когда масштаб позволяет независимо заполнить оба пула и требования TTFT и TPOT действительно требуют разных планов.
Разделение кодировщика расширяет идею, но меняет объект передачи
У мультимодальной LLM появляется ещё одна стадия: кодировщик изображения или звука превращает вход во вложения, после чего текстовый декодировщик обрабатывает контекст и генерирует ответ. Документация Disaggregated Encoder в vLLM описывает E/P/D-топологию: кодировщик получает свой пул и передаёт кеш вложений в экземпляры обработки контекста и генерации. Это подтверждает общий паттерн специализации стадий, но не делает детали P/D универсальными для диффузионных моделей или распознавания речи. У каждого семейства собственное состояние, повтор вычислений и гранулярность шага.
Следующий фронтир — внимание, FFN и эксперты как разные сервисы
Препринты 2026 года моделируют более глубокое разделение механизма внимания и FFN, а также разные типы ускорителей — см. Song et al. и разбор пределов AFD. Причина та же: арифметическая интенсивность и коммуникации стадий отличаются. Но чем мельче граница, тем чаще тензоры пересекают сеть и тем сильнее система зависит от специализированного межсоединения. Это направление совместного проектирования, а не рекомендация строить разделение на четыре стадии сегодня.
Модель → локальный движок → KV-контур → маршрутизатор → планировщик мощности → SLO
Главный сдвиг последних лет: инференс перестал быть библиотечной функцией в конце ML-процесса. Это самостоятельная распределённая система, где модель задаёт размер состояния и допустимые форматы, оборудование — пределы вычислений и памяти, а также топологию, среда выполнения — порядок работы, а продукт — распределение запросов и SLO. Оптимизировать один слой без остальных можно лишь до следующего узкого места.
Выбор начинается с трейса, а не с названия движка
Практическая последовательность начинается с воспроизведения рабочей нагрузки. Нужны совместные распределения входных и выходных токенов, процесс поступления, параллельность, доля общих префиксов, расстояние между ходами и паузы агентов. Затем фиксируются SLO и стоимость нарушения. Только после этого можно сравнивать варианты, сохраняя одну модель, политику выбора токенов, качество и набор запросов.09Тот же принцип работает и на выборе модели, а не только движка. Разбирал в канале сравнение Artificial Analysis, показанное в докладе 2025 года: фронтир не один — отдельно интеллект, открытые веса, цена и скорость. В тех замерах o4-mini с высоким уровнем рассуждения отвечала дольше сорока секунд, а GPT-4.1 — около 4,7 секунды; в агентном цикле из тридцати шагов такая разница определяет общую задержку.Книжный куб · Artificial Analysis о границах фронтира
| Наблюдение | Следующий эксперимент | Ограничение |
|---|---|---|
| Модель помещается на один узел, нагрузка умеренная | Один движок, непрерывные пакеты, измерение TTFT/TPOT | Не строить распределённый KV-контур заранее |
| Много повторяющихся системных и RAG-префиксов | Префиксный кеш и маршрутизация с учётом локальности | Проверить реальную долю попаданий и перекос ключей |
| Длинные входы портят интервал текущей генерации | Сначала порционная обработка контекста | Подобрать размер на повторе рабочего трейса |
| TTFT и TPOT требуют разных планов параллелизма | Смоделировать и испытать P/D-разделение | Включить стоимость передачи KV и резерв мощности |
| Агенты часто ждут инструменты или человека | Сохранять/выгружать состояние и маршрутизировать продолжение к кешу | Не гонять KV туда-обратно на каждый ход автоматически |
| MoE не помещается или плохо балансируется | Сначала параллелизм экспертов и топологическое размещение | Не путать шардирование модели с разделением стадий запроса |
Минимальный протокол сравнения
- Снять базовую линию на одном совмещённом движке без экспериментальных флагов.
- Разложить TTFT на очередь, обработку входа, передачу и выдачу первого байта.
- Разложить TPOT по размеру пакета, длине активного KV, вытеснению и помехам новых входов.
- Повторить репрезентативный трейс до устойчивых P50/P95/P99, включая прогрев и холодные запуски.
- Проверить качество после квантования/спекуляции и устойчивость после отказа узла.
- Считать полезную пропускную способность на GPU и полную стоимость, а не лучший изолированный показатель токенов в секунду.
| Слой | Что записать | Как проверить |
|---|---|---|
| Профиль | длина входа/выхода (ISL/OSL) P50/P95/P99, поток поступления, параллельность, повтор префиксов | Репрезентативный трейс, а не одна синтетическая инструкция модели |
| Задержка | TTFT, TPOT и E2E по квантилям | Раздельно очередь, вычисления, передача KV и потоковая выдача |
| Мощность | полезная пропускная способность на GPU при заданных SLO | Отдельно P и D, доля простоя и резерв |
| Память | веса, KV, фрагментация, попадания и вытеснения | HBM, оперативная память узла и хранилище как разные уровни |
| Качество | регрессии формата и метода декодирования | Одинаковый набор задач и политика выбора токенов |
| Устойчивость | отказ узла, потеря KV, перегрузка и масштабирование | Время восстановления и объём пересчёта |
| Экономика | стоимость полезного миллиона токенов и запроса | Учитывать сеть, простой, резерв и работу платформенной команды |
Результат карты оценки — не универсальный победитель среди vLLM, SGLang или TensorRT-LLM. Это доказательство, что конкретный движок, формат, планировщик и топология выдерживают ваш профиль. На одном железе vLLM может иметь нужное покрытие моделей, SGLang — высокий повтор префиксов, TensorRT-LLM — лучшее специализированное GPU-ядро; после обновления модели порядок меняется. Контрактом должен оставаться воспроизводимый трейс и SLO, а не имя проекта.
Для небольшого парка разумный вариант по умолчанию скучен: одна проверенная модель, совмещённый движок, непрерывные пакеты, подходящий числовой формат, порционная обработка контекста при длинных входах и префиксный кеш там, где измерена повторяемость. Маршрутизация с учётом кеша появляется при нескольких репликах. P/D — после того, как профиль показывает устойчивый конфликт TTFT/TPOT и сеть доказанно перевозит KV дешевле пересчёта.
Пять выводов из истории инференса
- 01Инференс LLM отличается от обычного ML не размером модели, а формой работы: один запрос превращается в вычислительно тяжёлый проход по входу, затем в последовательный цикл с растущим состоянием.
- 02vLLM сделала поворот в сторону системного управления памятью: PagedAttention снизила фрагментацию KV-кеша и позволила держать больше активных последовательностей, но планирование на уровне итераций появилось раньше в Orca.
- 03Ни один «трюк» не ускоряет всё сразу: квантование, GPU-ядра, кеширование, планирование и спекуляция бьют по разным ресурсам и могут лишь перенести узкое место выше по стеку.
- 04Разделённый инференс возник в Splitwise и DistServe как ответ на несовместимые профили обработки контекста и генерации; его цена — распределённый KV-кеш, сеть, согласование темпа и новые режимы отказа.
- 05Архитектуру нужно выбирать по полезной пропускной способности на собственном трейсе под TTFT/TPOT SLO: начать с совмещённого движка, затем добавлять кеш, порции и разделение только после измеренного конфликта.
Работы, документация и границы доказательности
Список сгруппирован по механизму, а не по вендору. Цифры в статье сопровождаются исходной базой сравнения; документация проектов фиксирует состояние функций на дату исследования.
Архитектура и ранние системы
- Shazeer · Fast Transformer Decoding: One Write-Head is All You Needработа 2019 года, вводящая multi-query attention для сокращения объёма KV-тензоров и трафика памяти при пошаговой генерации
- Ainslie et al. · GQA: Training Generalized Multi-Query Transformer Modelsgrouped-query attention как промежуточная точка между качеством MHA и скоростью MQA
- Yu et al. · OrcaOSDI 2022: планирование на уровне итерации и выборочное формирование пакетов; исторический предшественник современных непрерывных пакетов
- Dao et al. · FlashAttentionточный механизм внимания с учётом иерархии памяти и сокращением обмена между HBM и SRAM
Квантование
- Frantar et al. · GPTQодношаговое weight-only-квантование больших генеративных трансформеров с использованием приближённой информации второго порядка
- Xiao et al. · SmoothQuantперенос сложности выбросов из активаций в веса для W8A8-инференса; результаты зависят от доступных GPU-ядер
- Lin et al. · AWQactivation-aware weight-only-квантование и TinyChat; пример связи алгоритма, упаковки весов и специализированных ядер
vLLM и управление памятью
- Kwon et al. · первый анонс vLLMистория разработки в UC Berkeley/LMSYS, внедрения в Vicuna/Chatbot Arena и ранние сравнения с Hugging Face/TGI
- Kwon et al. · Efficient Memory Management with PagedAttentionканоническая SOSP 2023 работа: блочное управление KV-кешем, совместное использование блоков и в 2–4 раза большая пропускная способность против FasterTransformer/Orca в измеренных конфигурациях
- Kwon · vLLM: An Efficient Inference Engine for Large Language Modelsдиссертация 2025 года с ретроспективой PagedAttention, планировщика и расширяемой архитектуры движка
Планирование и повтор вычислений
- Agrawal et al. · SARATHIисходная постановка порционной обработки контекста и формирования пакетов с приоритетом генерации для уменьшения её остановок
- Agrawal et al. · Sarathi-ServeOSDI 2024: измерения обслуживаемой нагрузки при ограничениях хвостовой задержки для нескольких моделей и конфигураций A100
- Holmes et al. · DeepSpeed-FastGenDynamic SplitFuse как альтернативная стратегия композиции длинных входов и шагов генерации
- Zheng et al. · SGLangRadixAttention для повторного использования общих префиксов и среда выполнения программ из нескольких вызовов модели
- Srivatsa et al. · Prebleраспределённое планирование с учётом префиксного кеша, стоимости пересчёта и справедливости очереди
- Prabhu et al. · vAttentionальтернатива PagedAttention на виртуальной памяти CUDA: физическое выделение по требованию при непрерывном виртуальном адресном пространстве
Ускорение декодирования
- Leviathan et al. · Fast Inference via Speculative Decodingточное спекулятивное декодирование: черновая модель предлагает несколько токенов, основная проверяет их параллельно без изменения распределения
- Cai et al. · Medusaнесколько дополнительных голов строят дерево кандидатов без отдельной черновой модели; требуется дообучение
- Li et al. · EAGLEспекуляция на уровне признаков предпоследнего слоя; опубликованные ускорения относятся к конкретным моделям и задачам
Разделение стадий
- Patel et al. · Splitwiseпрепринт от 30 ноября 2023 года: разнести вычислительно насыщенную обработку входа и ограниченную полосой памяти генерацию по разным машинам и независимо подбирать железо
- Zhong et al. · DistServeпрепринт от 18 января 2024 года: независимая настройка TTFT/TPOT, размещения и параллелизма для максимизации полезной пропускной способности под SLO
- Qin et al. · MooncakeKV-ориентированная архитектура платформы Kimi: разделённая обработка контекста, распределённый кеш и сеть как часть контура данных
- Jin et al. · P/D-Serveэксплуатационные задачи P/D на десятках тысяч xPU: организация пулов, отказы, динамическое соотношение стадий и передача KV
Современные реализации
- vLLM · Disaggregated Prefillingдокументация, проверенная 7 августа 2026 года: функция помечена как экспериментальная; заявлены независимая настройка TTFT/ITL и контроль хвоста, но не рост пропускной способности
- vLLM · Disaggregated Encoderдокументация, проверенная 8 августа 2026 года: отдельный пул кодировщика для мультимодальных моделей и передача кеша вложений в экземпляры обработки контекста и генерации; основа E/P/D-топологий
- llm-d · project proposalоткрытый Kubernetes-стек вокруг vLLM: маршрутизация с учётом префиксного кеша, многоуровневый KV-кеш и независимо масштабируемая xPyD-топология
- NVIDIA Dynamo · architectureразделение контуров запросов, управления и состояния, маршрутизация с учётом KV, передача через NIXL и восстановление при сбоях; показатели проекта остаются заявлениями поставщика
Ограничения и новые исследования
- Li et al. · Revisiting Disaggregated LLM Servingпрепринт от 14 ноября 2025 года: систематическая проверка производительности и энергии — выигрыш не гарантирован и зависит от нагрузки и пути передачи KV
- Song et al. · Analytical Provisioning for Attention-FFN Disaggregated LLM Servingпрепринт: разделение внимания и FFN как следующий уровень специализации стадий; оптимальное отношение пулов зависит от стохастической нагрузки
- Liu et al. · Revealing the Challenges of Attention-FFN Disaggregationпрепринт: AFD не универсален — выигрыш зависит от полосы межсоединения, гранулярности экспертов и режима нагрузки
- Li et al. · PPD Disaggregation for Multi-turn Servingпрепринт: append-prefill последующих ходов иногда выгоднее исполнять на decode-узле, сохраняя локальность кеша
- Arun et al. · Load-Aware Prefill Deflectionпрепринт о гибридном возврате части обработки входа на узлы генерации при очереди и дорогой передаче KV; сигнал направления, а не сложившийся стандарт