For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://docs.nvidia.com/dynamo/llms.txt. For full content including API reference and SDK examples, see https://docs.nvidia.com/dynamo/llms-full.txt.
Руководство по Router
Обзор
Dynamo KV Router интеллектуально направляет запросы, оценивая их вычислительную стоимость на разных workers. Он учитывает и стоимость decode (по активным блокам), и стоимость prefill (по вновь вычисляемым блокам), используя перекрытие KV cache, чтобы минимизировать лишние вычисления. Настройка KV Router критически важна для достижения максимального throughput и минимальной задержки в распределенных сценариях inference. Это руководство поможет начать работу с Dynamo router и подскажет страницы, где подробнее разобраны концепции роутинга, конфигурация, disaggregated serving и эксплуатация.
Быстрый старт
Router можно развернуть через Python / CLI, Kubernetes или как самостоятельный компонент.
Развертывание через Python / CLI
Чтобы запустить Dynamo frontend с KV Router:
python -m dynamo.frontend --router-mode kv --http-port 8000
Эта команда:
- запускает сервис Dynamo frontend с включенным KV routing
- открывает сервис на порту 8000 (можно изменить)
- автоматически обрабатывает всех backend workers, зарегистрированных в Dynamo endpoint
Backend workers регистрируются через API register_model. Чтобы состояние prefix-cache было точным, workers также должны публиковать KV cache events с backend-specific флагами событий; иначе router может работать в approximate mode с --no-router-kv-events.
Аргументы CLI
| Аргумент | По умолчанию | Описание |
|---|---|---|
--router-mode kv | round-robin | Включить KV cache-aware routing |
--router-temperature <float> | 0.0 | Управляет случайностью роутинга (0.0 = детерминированно, больше - случайнее) |
--kv-cache-block-size <size> | Backend-specific | Размер блока KV cache (должен совпадать с конфигурацией backend) |
--router-kv-events / --no-router-kv-events | --router-kv-events | Включить/отключить отслеживание KV events в реальном времени |
--load-aware / --no-load-aware | --no-load-aware | Роутить по активной нагрузке без сигналов повторного использования cache; подразумевает --router-mode kv на frontend |
--router-kv-overlap-score-credit <float> | 1.0 | Множитель кредитов для device-local prefix overlap, от 0.0 до 1.0 |
--router-prefill-load-scale <float> | 1.0 | Масштабировать скорректированную нагрузку prompt-side prefill перед добавлением decode blocks |
--router-track-prefill-tokens / --no-router-track-prefill-tokens | --router-track-prefill-tokens | Учитывать prompt-side load в учете активной нагрузки worker'а |
--router-prefill-load-model <none|aic> | none | Модель нагрузки prompt-side; см. Routing Concepts и Configuration and Tuning |
--router-queue-threshold <float> | 16.0 | Доля порога очереди; включает приоритетное планирование через priority |
--router-queue-policy <str> | fcfs | Политика планирования очереди: fcfs (tail TTFT), wspt (avg TTFT) или lcfs (обратный порядок только для сравнения) |
--serve-indexer | false | Отдавать из этого frontend/router Dynamo-native remote indexer на worker component |
--use-remote-indexer | false | Запрашивать remote indexer, отданный worker component, вместо поддержки локального overlap indexer |
Для всех доступных опций: python -m dynamo.frontend --help
Для всех доступных опций: python -m dynamo.frontend --help
Подробные опции конфигурации и параметры настройки см. в Configuration and Tuning. Правила допуска кандидатов см. в Router Filtering. О том, как router моделирует нагрузку prefill и decode в cost function, см. в Routing Concepts.
Развертывание в Kubernetes
Чтобы включить KV Router в Kubernetes, добавьте переменную окружения DYN_ROUTER_MODE в service frontend:
apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: my-deployment
spec:
services:
Frontend:
componentType: frontend
replicas: 1
envs:
- name: DYN_ROUTER_MODE
value: kv # Включить KV Smart Router
Ключевые моменты:
- Устанавливайте
DYN_ROUTER_MODE=kvтолько для service Frontend - Настраивайте публикацию KV events на стороне worker, когда нужен event-driven prefix-cache state
- Используйте
--no-router-kv-eventsдля approximate cache-state prediction, если workers не публикуют events
Переменные окружения
Все аргументы CLI можно настроить через переменные окружения с префиксом DYN_:
| Аргумент CLI | Переменная окружения | По умолчанию |
|---|---|---|
--router-mode kv | DYN_ROUTER_MODE=kv | round-robin |
--load-aware | DYN_ROUTER_LOAD_AWARE=true | false |
--router-temperature | DYN_ROUTER_TEMPERATURE | 0.0 |
--kv-cache-block-size | DYN_KV_CACHE_BLOCK_SIZE | Backend-specific |
--no-router-kv-events | DYN_ROUTER_USE_KV_EVENTS=false | true |
--router-kv-overlap-score-credit | DYN_ROUTER_KV_OVERLAP_SCORE_CREDIT | 1.0 |
--router-prefill-load-scale | DYN_ROUTER_PREFILL_LOAD_SCALE | 1.0 |
--router-queue-policy | DYN_ROUTER_QUEUE_POLICY | fcfs |
DYN_ENCODER_CUDA_TO_CPU_RATIO | 8 | Соотношение throughput не-CPU worker'а к одному CPU worker'у для роутинга device-aware-weighted |
Полные примеры для K8s и продвинутую настройку см. в K8s Examples и Configuration and Tuning. Для A/B-тестирования и продвинутой K8s-настройки см. KV Router A/B Benchmarking Guide.
Самостоятельный Router
KV router можно также запускать как самостоятельный service (без Dynamo frontend) для disaggregated serving (например, для маршрутизации к prefill workers), многоуровневых архитектур или любого сценария, где нужны интеллектуальные решения KV cache-aware routing. Подробнее см. компонент Standalone Router.
Router, встроенный во Frontend, и Standalone Router
| Развертывание | Процесс | Порт метрик | Сценарий использования |
|---|---|---|---|
| Frontend-embedded | python -m dynamo.frontend --router-mode kv | HTTP-порт Frontend (по умолчанию 8000) | Стандартное развертывание; router работает внутри процесса frontend |
| Standalone | python -m dynamo.router | DYN_SYSTEM_PORT (если задан) | Многоуровневые архитектуры, продвинутый disaggregated prefill routing, кастомные pipelines |
Standalone router не включает HTTP frontend (нет endpoint /v1/chat/completions). Он экспонирует только RouterRequestMetrics через system status server. См. Standalone Router README.
Режимы развертывания
Dynamo router можно развернуть в нескольких конфигурациях. В таблице ниже показаны все комбинации и случаи, когда их использовать:
| Режим | Команда | Логика роутинга | KV Events | Топология | Сценарий использования |
|---|---|---|---|---|---|
| Frontend + Round-Robin | python -m dynamo.frontend --router-mode round-robin | Последовательно циклирует по workers | Нет | Aggregated | Самый простой baseline; без учета KV |
| Frontend + Random | python -m dynamo.frontend --router-mode random | Случайный выбор worker'а | Нет | Aggregated | Stateless load balancing |
| Frontend + KV (Aggregated) | python -m dynamo.frontend --router-mode kv | Перекрытие KV cache + load | NATS Core / JetStream / ZMQ / Approx | Aggregated | Production single-pool serving с повторным использованием cache |
| Frontend + KV (Disaggregated) | python -m dynamo.frontend --router-mode kv with prefill + decode workers | Перекрытие KV cache + load | NATS Core / JetStream / ZMQ / Approx | Disaggregated (prefill + decode pools) | Раздельные prefill/decode для крупномасштабного serving |
| Frontend + Least-Loaded | python -m dynamo.frontend --router-mode least-loaded | Меньше всего активных соединений | Нет | Aggregated или disaggregated fallback | Простое балансирование с учетом нагрузки без учета KV |
| Frontend + Device-Aware Weighted | python -m dynamo.frontend --router-mode device-aware-weighted | Device-aware budget + least-loaded внутри выбранной группы устройств | Нет | Aggregated или disaggregated fallback | Балансирование разнородного парка (CPU/non-CPU); при одном классе устройств сводится к least-loaded |
| Frontend + Direct | python -m dynamo.frontend --router-mode direct | Worker ID из hints запроса | Нет | Aggregated | Внешний orchestrator (например, EPP/GAIE) выбирает workers |
| Standalone Router | python -m dynamo.router | Перекрытие KV cache + load | NATS Core / JetStream / ZMQ | Любая | Роутинг без HTTP frontend (multi-tier, custom pipelines) |
Режимы роутинга (--router-mode)
| Режим | Значение | Как выбираются workers |
|---|---|---|
| Round-Robin | round-robin (по умолчанию) | Обходит доступных workers по порядку |
| Random | random | Выбирает случайного worker'а для каждого запроса |
| KV | kv | Оценивает перекрытие KV cache и decode load для каждого worker'а; выбирает вариант с минимальной стоимостью |
| Least-Loaded | least-loaded | Направляет запрос к worker'у с наименьшим числом активных соединений; в disaggregated prefill-путях пропускает bootstrap optimization и переходит к synchronous prefill |
| Device-Aware Weighted | device-aware-weighted | Делит workers на группы CPU и non-CPU, применяет budget, нормализованный по возможностям, с использованием DYN_ENCODER_CUDA_TO_CPU_RATIO, чтобы решить, какая группа получит запрос, а затем выбирает наименее загруженного worker'а внутри этой группы |
| Direct | direct | Читает целевой worker_id из routing hints запроса; логики выбора нет |
Маршрутизация с учетом типа устройства
device-aware-weighted предназначен для гетерогенных флотилий, где workers разной вычислительной мощности, например CPU embedding encoders рядом с GPU embedding encoders, используют один и тот же endpoint.
Workers делятся на группы CPU и non-CPU. Router сравнивает нагрузку, нормализованную по возможностям, между двумя группами:
normalized_load = total_inflight(group) / (instance_count(group) x throughput_weight)
Вес throughput равен 1 для CPU workers и DYN_ENCODER_CUDA_TO_CPU_RATIO для non-CPU workers. Следующий запрос направляется в группу с меньшей нормализованной нагрузкой, а затем к наименее загруженному worker'у внутри этой группы.
Используйте DYN_ENCODER_CUDA_TO_CPU_RATIO, чтобы приблизить отношение throughput non-CPU worker'а к одному CPU worker'у. Значение по умолчанию - 8.
Когда присутствует только один класс устройств, политика сводится к стандартному least-loaded routing.
Режимы транспортировки KV Events (внутри --router-mode kv)
При использовании KV routing router должен знать, что закэшировал каждый worker. Есть четыре способа получить эту информацию:
| Режим событий | Как включить | Описание |
|---|---|---|
| NATS Core (local indexer) | Router по умолчанию (без флага router) | Workers ведут локальный indexer; настройте публикацию KV events на стороне backend, чтобы router мог восстанавливать состояние и получать events через NATS Core |
| JetStream (durable) | --router-durable-kv-events | Events сохраняются в NATS JetStream; поддерживаются snapshots и durable consumers. Устарело. |
| ZMQ | --event-plane zmq | Workers публикуют через ZMQ PUB sockets; самостоятельный сервис dynamo.indexer агрегирует events |
| Approximate (no events) | --no-router-kv-events | Events не потребляются; router предсказывает состояние cache на основе собственных решений о роутинге с истечением по TTL |
Топология aggregated и disaggregated
| Топология | Workers | Как это работает |
|---|---|---|
| Aggregated | Один pool (prefill + decode в одном процессе) | Все workers обрабатывают полный жизненный цикл запроса |
| Disaggregated | Раздельные pool'ы prefill и decode | Frontend сначала направляет запрос к prefill worker'у, затем к decode worker'у; требуется, чтобы workers были зарегистрированы с ModelType.Prefill |
Режим disaggregated включается автоматически, когда prefill workers регистрируются вместе с decode workers. Подробности см. в Раздельном обслуживании.
Дополнительная документация по Router
- Routing Concepts: cost model, выбор worker'а и primitives роутинга
- Configuration and Tuning: флаги router, режимы transport, отслеживание нагрузки и метрики
- Раздельное обслуживание: настройки роутинга prefill и decode
- Topology-Aware KV Transfer: runtime metadata и ограничения decode routing для topology-aware handoff prefill/decode
- Router Operations: реплики, remote indexers, persistence и recovery
- Router Examples: использование Python API, примеры K8s и кастомные шаблоны роутинга
- Router Testing: рекомендуемые уровни тестирования для нетривиальных изменений router'а
- Standalone Indexer: запуск KV indexer как отдельного сервиса
- KV Event Replay — Dynamo vs vLLM: обнаружение разрывов и поведение replay