AIКомпонент AI Platform
Префиксный кэш
Как сохранить повторное использование контекста между запросами и выбрать реплику, на которой выгода кэша не исчезнет в очереди.
Содержание
У обсуждения префиксного кэша есть три разных вопроса: изменился ли вход после шаблонизации, попал ли запрос на реплику с нужным префиксом и не съела ли очередь выигрыш от кэша. Здесь разберём, как их отличить и что проверить в каждом случае.
Начните с вопроса, который хотите проверить:
| Задача | Куда перейти |
|---|---|
| Найти раннее различие в инструкциях, инструментах или схемах | Проверить кэш в своём проекте, затем воспроизвести кейс с перестановкой инструментов |
| Узнать, сколько входных токенов прочитано из кэша | Разделить форму входа и сигналы провайдера |
| Выбрать реплику с учётом кэша и очереди | Сравнить sticky sessions и маршрутизацию по префиксу, затем проверить границу в учебном эксперименте |
| Проверить, какие сведения о KV доступны роутеру | Разобрать, что знает кэш-роутер, и подготовить вход для аудита маршрута |
| Решить, стоит ли выносить KV из памяти GPU | Оценить экономику KV offload до выбора уровня хранения |
Если ранних изменений нет, перестраивать запрос ради кэша не нужно. Совпавший вход сам по себе ещё не показывает, были ли прочитаны готовые блоки: для этого нужны данные провайдера или движка.
Проблема
Агент несколько раз отправляет инструкции, описания инструментов и растущую историю. Меняется небольшой хвост, а движок снова тратит время на обработку общего начала. Префиксный кэш (prefix cache) позволяет переиспользовать вычисленное состояние этой части входа.
В пуле из нескольких реплик задача усложняется. Даже полностью совпадающий вход бесполезен для локального кэша сервера B, если нужное состояние осталось только на A. Но закрепить все повторы за A тоже недостаточно: там может накопиться очередь.
Кэш сокращает повторную обработку входа (prefill). Генерацию нового ответа (decode) всё равно нужно выполнить. Если основное время уходит на длинный ответ, сокращение обработки входа может мало изменить полное время запроса. Это ограничение описано в документации vLLMВнешняя ссылка, откроется в новой вкладке.
Симптомы
| Наблюдение | Что проверить первым |
|---|---|
| После изменения инструментов стало меньше чтений кэша | Токены и порядок сериализации до первого различия |
| На одной реплике повтор работает, через балансировщик — нестабильно | Выбранную реплику и доступность блоков |
| Попаданий больше, время до ответа хуже | Ожидание у реплик с популярными префиксами |
| После паузы повтор снова требует полной обработки | Вытеснения, перезапуски и смену реплики |
Сопоставляйте эти наблюдения по одному запросу: так можно проследить, где именно потерялось повторное использование.
Ментальная модель
Нужны три совпадения: то же начало, совместимое состояние, доступное место выполнения.
В vLLM блок идентифицируется с учётом предшествующего префикса, токенов самого блока и дополнительных признаков — например, адаптера или входного изображения. Повторно используются полные блоки. Одинаковый на вид текст до шаблонизации ещё не гарантирует одинаковый ключ. Устройство кэша vLLMВнешняя ссылка, откроется в новой вкладке.
Запрос 1: [инструкции v1][инструменты v3][история][вопрос A]
Запрос 2: [инструкции v1][инструменты v3][история][вопрос B]
└──────── общее начало ────────────┘
Запрос 3: [новая дата][инструкции v1][инструменты v3][история]…
↑ различие до полезного общего контекстаДлину пригодного для кэша префикса нужно считать в токенах после применения шаблона модели. Для повторного использования важны совпадение и порядок токенов; близость смысла эту работу не заменяет.
Стабильность — договорённость с приложением. Версии инструкций и инструментов должны меняться осознанно. Удалять обязательные ограничения или сохранять недоступный пользователю инструмент ради совпадения префикса нельзя.
Архитектура
Сначала выбираем сценарий и совместимый пул. Потом решаем, можно ли принять запрос с текущими лимитами и сроком. И только среди подходящих реплик сравниваем локальность и нагрузку.
Сценарный роутер
Выбрать возможности
Модель, инструменты, класс обслуживания и допустимый пул.
Допуск и очередь
Проверить ёмкость
Принять, отложить или отклонить по политике и дедлайну.
Кэш-роутер
Выбрать реплику
Учесть доступный префикс и оставшуюся работу.
Это разделение ответственности. Допуск и выбор реплики могут уточняться совместно; схема не требует трёх отдельных сервисов.
Исправность, совместимость модели и изоляцию данных проверяем до оценки выгоды. Реплика с неподходящей моделью или без нужной изоляции выпадает из списка кандидатов, сколько бы нужных блоков на ней ни лежало. После фильтрации маршрутизатору нужны размер доступного префикса, нагрузка и достаточно свежие сведения о памяти. Если сведения пропали, нужен заранее выбранный режим работы с учётом только нагрузки.
В Dynamo 1.0Внешняя ссылка, откроется в новой вкладке стоимость кандидата учитывает обработку входа и нагрузку генерации, а сведения о блоках могут поступать через события либо оцениваться приближённо. SGLang Model GatewayВнешняя ссылка, откроется в новой вкладке сочетает поиск совпадающего префикса с порогами балансировки.
Когда холодная реплика выигрывает
Для одного запроса упростим сравнение до двух величин:
T_A = очередь A + оставшаяся обработка входа на A
T_B = очередь B + полная обработка входа на B
Выбираем A, когда T_A < T_B.
При равенстве эта модель не даёт предпочтения.Возьмём условные числа: очередь B — 100 мс, полная обработка — 600 мс, обработка с кэшем — 80 мс. Тогда граница для очереди A — 620 мс. Ниже выгоднее A, выше — B. В этом расчёте реплики одинаковы по производительности, а кэш хранится локально.
Интерактивная модель
Кэш или свободная очередь?
Меняйте очередь и время обработки входа, чтобы найти, когда выгоднее пересчитать префикс. В этой учебной модели складываются ожидание и prefill; сеть и генерацию ответа оценивают отдельно.
Побеждает реплика A: меньше расчётное время. A — 180 мс, B — 700 мс.
Очередь 100 мс + prefill 80 мс
Очередь 100 мс + prefill 600 мс
Граница для очереди A: 620 мс. Ниже неё быстрее A, выше — B, на границе получается ничья.
total = queue + remaining prefill
Повторить вычисление вне браузера
Из локальной копии исходного кода сайтаВнешняя ссылка, откроется в новой вкладке на Node.js 22.18 или новее:
node --experimental-strip-types scripts/cache-routing-experiment.tsЧетыре сценария используют ту же функцию, что и интерактивный пример. Результаты и допущенияВнешняя ссылка, откроется в новой вкладке сохранены в репозитории сайта.
Метрики
Сначала закрепите модель, токенизатор, шаблон, версию движка, политику маршрутизации и границы пула. Затем соберите данные одного сценария за один интервал.
| Вопрос | Нужные наблюдения |
|---|---|
| Было ли что переиспользовать? | Число входных токенов и общий префикс после шаблонизации |
| Произошло ли чтение? | Документированный счётчик повторно использованных токенов или блоков |
| Где выполнили запрос? | Идентификатор реплики, политика и причина выбора |
| Что сравнивал роутер? | Версия, endpoint и фактический вход политики: текст, ключ сессии или другое представление |
| Что выиграл пользователь? | Ожидание, prefill, время до первого токена (TTFT), полное время |
| Какую цену заплатил пул? | Параллельность, занятость KV-памяти, вытеснения и задержки соседних запросов |
Если есть счётчики токенов с согласованным охватом, доля повторного использования равна сумме переиспользованных токенов, делённой на сумму входных. Не усредняйте проценты реплик без весов. Не смешивайте счётчик запросов со счётчиком токенов и не считайте отсутствующее поле нулём.
Название политики не раскрывает её вход, а HTTP 200 не подтверждает завершение потокового ответа. В разборе кэш-роутера показано, почему chat-путь может сравнивать ключ сессии вместо текста и зачем отдельно проверять завершение SSE на клиенте.
План проверки на настоящем движке: повторить один очищенный запрос на той же реплике; отправить его на другую; затем сравнить политики на одинаковом потоке с сохранённым распределением длин, интервалов и параллельности. Для каждой политики отдельно получить холодное и прогретое состояние. Чередовать порядок прогонов, повторять их и сохранять исходные результаты. Не очищать кэш общего рабочего пула ради теста.
По данным о чтении кэша и времени выполнения будет видно, сколько работы удалось сэкономить и как это повлияло на задержку.
Компромиссы
| Подход | Когда полезен | За что платим |
|---|---|---|
| Распределение по нагрузке | Короткие или редко повторяющиеся входы | Не используем сведения о локальном префиксе |
| Закрепление сессии или префикса за репликой | Повторы часты, нагрузка относительно ровная | Популярные ключи создают очередь; нужна обработка отказа |
| Кэш и нагрузка вместе | Цена повторного prefill заметна и измерима | Индекс кэша, свежесть данных, настройка политики |
| Общий или переносимый KV-кэш | Локальности одной реплики недостаточно | Сеть, хранение, совместимость и отдельная модель стоимости |
При росте числа реплик один и тот же префикс может прогреваться в нескольких местах. Это не обязательно ошибка: дополнительная копия иногда снимает очередь. Выбор зависит от частоты повторов и цены ожидания.
В управляемом API реплика обычно скрыта. Там проверяют контракт конкретного провайдера и возвращаемые поля использования; собственный кэш-роутер перед API не даёт контроля над внутренними GPU-серверами.
Антипаттерны
- Максимизировать попадания, не ограничивая время ожидания.
- Принимать назначение реплики за доказанное чтение кэша.
- Диагностировать промах только по TTFT: задержка включает больше одной причины.
- Менять модель, права или границу изоляции ради тёплого состояния.
- Считать процент занятой KV-памяти прямым измерением числа вытеснений.
- Использовать один вес скоринга для любых длин входа, ответа и классов обслуживания.
- Выдавать сокращение вычислений за такую же экономию денег: аренда, тариф и полезная загрузка считаются отдельно.
Чеклист
- Закреплены модель, шаблон, токенизатор и версия движка.
- Сравнивается фактический вход, а не исходный объект до сериализации.
- Проверено, какое представление получает политика на выбранном endpoint и версии роутера.
- Определено, кому разрешено совместное использование кэша.
- Реплики фильтруются по совместимости и исправности до оценки выгоды.
- Есть связь между запросом, выбранной репликой и чтением кэша.
- Измерены очередь и TTFT по сценариям, а не только среднее по платформе.
- Завершение потокового ответа проверяется на клиенте отдельно от HTTP-статуса и success роутера.
- Определены действия при устаревшем индексе, отказе и перегрузке.
- Выгода проверена на повторяемом потоке, а ухудшение соседних запросов ограничено.
Связанные главы
Inference Plane описывает более широкую границу исполнения. Проверка стабильности инструментов помогает найти изменение формы запроса до исследования маршрута. audit-prompt-caching даёт инструмент для такого первого прохода.
Авторский вход в тему — «Тёплый кэш — ещё не быстрый ответ». Три условия повторного использования можно услышать в эфире «Каждый токен на счету».
Источники и условия применения
Применимость
Повторяющиеся запросы с длинным общим началом; основной пример — совместимые реплики с локальным KV-кэшем.
Ограничения
Расчёт сравнивает очередь и обработку входа на совместимых репликах с локальным KV-кэшем. Для оценки полного времени ответа нужно также учесть сеть и генерацию.
Источники
- vLLM: устройство Automatic Prefix CachingПроверено Внешняя ссылка, откроется в новой вкладке
- vLLM: возможности и ограничения кэшированияПроверено Внешняя ссылка, откроется в новой вкладке
- NVIDIA Dynamo 1.0: маршрутизация с учётом KV-кэшаПроверено Внешняя ссылка, откроется в новой вкладке
- SGLang Model Gateway: политики маршрутизацииПроверено Внешняя ссылка, откроется в новой вкладке