Чтобы получить чистую 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 автоматически создается, когда:
- Регистрируется decode-модель, например через
register_model()сModelType.Chat | ModelType.Completions. - Обнаруживается 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.