Перейти к основному содержимому

Чтобы получить чистую Markdown-версию этой страницы, добавьте .md к этому URL. Полный индекс документации см. в https://docs.nvidia.com/dynamo/llms.txt. Полное содержимое, включая справочник API и примеры SDK, см. в https://docs.nvidia.com/dynamo/llms-full.txt.

Раздельное обслуживание

Dynamo поддерживает раздельное обслуживание, при котором prefill (обработка prompt) и decode (генерация токенов) обрабатываются разными пулами worker-узлов. Когда вы регистрируете worker-узлы с ModelType.Prefill, frontend автоматически обнаруживает их и активирует внутренний prefill router.

Общую матрицу развертывания см. в Router Guide. О флагах маршрутизатора, используемых в этой схеме, см. Configuration and Tuning.

Если worker-узлы prefill и decode распределены по доменным топологиям, например по зонам или стойкам, используйте Topology-Aware KV Transfer, чтобы ограничить маршрутизацию decode или сместить ее в сторону worker-узлов из домена передачи выбранного prefill worker-узла.

Автоматическая активация prefill router

Prefill router автоматически создается, когда:

  1. Регистрируется decode-модель, например через register_model() с ModelType.Chat | ModelType.Completions.
  2. Обнаруживается prefill worker с тем же именем модели и ModelType.Prefill.

Ключевые свойства prefill router:

  • Всегда отключает отслеживание активных блоков (track_active_blocks=false), поскольку prefill worker-узлы не выполняют decode.
  • Бесшовно встраивается в конвейер обработки запросов между preprocessing и маршрутизацией decode.
  • Корректно переходит в запасной режим decode-only, если prefill завершается с ошибкой или prefill worker-узлы недоступны.

Ключевые свойства этапа decode routing в раздельном режиме:

  • Отключает оценку overlap (overlap_score_credit=0), потому что decode routing не должен гоняться за повторным использованием префикса.
  • Отключает предположение о повторном использовании KV (assume_kv_reuse=false), если только backend не может действительно дедуплицировать переданные блоки.
  • Отключает отслеживание prefill-токенов (track_prefill_tokens=false), чтобы нагрузка на стороне decode отражала именно decode-работу, а не уже завершенную prompt-работу.

Пример настройки

Когда зарегистрированы оба worker-узла, запросы маршрутизируются автоматически.

# Decode worker registration (in your decode worker)
decode_endpoint = runtime.endpoint("dynamo.decode.generate")

await register_model(
model_input=ModelInput.Tokens,
model_type=ModelType.Chat | ModelType.Completions,
endpoint=decode_endpoint,
model_name="meta-llama/Llama-2-7b-hf",
# ... other parameters
)

await decode_endpoint.serve_endpoint(decode_handler.generate)

# Prefill worker registration (in your prefill worker)
prefill_endpoint = runtime.endpoint("dynamo.prefill.generate")

await register_model(
model_input=ModelInput.Tokens,
model_type=ModelType.Prefill,
endpoint=prefill_endpoint,
model_name="meta-llama/Llama-2-7b-hf",
# ... other parameters
)

await prefill_endpoint.serve_endpoint(prefill_handler.generate)

Описанная здесь автоматическая схема раздельной маршрутизации в настоящее время поддерживается интегрированным путем dynamo.frontend. Она не предоставляется как единый готовый режим в standalone Python router (python -m dynamo.router). Если вы строите такую топологию с помощью standalone routers, вам придется самостоятельно запускать и связывать этапы маршрутизации prefill и decode, а также обрабатывать передачу запроса, включая disaggregated_params, возвращаемые prefill. В качестве продвинутого примера см. Global Router, который явно объединяет локальные пулы prefill и decode router.

Поток запроса

Следующая диаграмма показывает обзор основных компонентов при раздельном обслуживании:

graph TD
HTTP[HTTP]
ROUTER[Router]
PREFILL[Prefill Worker]
DECODE[Decode Worker]

classDef worker_style fill:#f3e5f5,stroke:#333,stroke-width:2px,color:#333;
classDef router_style fill:#2e8b57,stroke:#333,stroke-width:2px,color:#fff;

class PREFILL,DECODE worker_style
class ROUTER router_style

HTTP <--> |"request/response"| ROUTER
ROUTER --> |"1. send to prefill"| PREFILL
PREFILL --> |"2. return NIXL metadata"| ROUTER
ROUTER --> |"3. send with metadata"| DECODE
DECODE --> |"4. stream response"| ROUTER

PREFILL -.-> |"publish kv events"| ROUTER

linkStyle 0,1,2,3,4 stroke:#8b4513,stroke-width:2px
linkStyle 5 stroke:#2196f3,stroke-width:2px

Когда включен topology-aware KV transfer, prefill router также выводит RoutingConstraints для decode из метаданных runtime topology выбранного prefill worker-узла до того, как запрос попадет в decode router.