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

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

Дисагрегированное обслуживание

简体中文

Фазы prefill и decode в запросах LLM отличаются по характеру вычислений и по потреблению памяти. Разделение этих фаз между специализированными llm engines позволяет лучше распределять аппаратные ресурсы, повышать масштабируемость и в целом улучшать производительность. Например, использование большего TP для memory-bound decoding phase и меньшего TP для computation-bound prefill phase позволяет эффективно вычислять обе фазы. Кроме того, для запросов с длинным контекстом выделение prefill phase в отдельные prefill engines позволяет эффективно обрабатывать текущие decoding requests, не блокируя их длинными prefill.

Disaggregated execution request состоит из трех основных шагов:

  1. Prefill engine вычисляет prefill phase и генерирует KV cache
  2. Prefill engine передает KV cache в decode engine
  3. Decode engine вычисляет decode phase.

Дизайн disaggregation в Dynamo использует гибкий framework, который обеспечивает высокую производительность в различных условиях.

Эффективная передача KV

Ключ к высокопроизводительной disaggregation - эффективная передача KV. Dynamo использует NIXL, чтобы передавать KV cache напрямую из VRAM prefill engine в VRAM decode engine. Передача KV не блокирует выполнение, поэтому GPU forward pass может продолжать обслуживать другие requests во время transfer.

Оркестрация Router

Поток disaggregated serving orchestrates PrefillRouter:

sequenceDiagram
participant Client
participant Frontend
participant Router as PrefillRouter
participant Prefill as Prefill Worker
participant Decode as Decode Worker

Client->>Frontend: Request
Frontend->>Router: Preprocessed Request
Router->>Router: Select prefill worker
Router->>Prefill: Prefill request
Prefill->>Prefill: Compute KV cache
Prefill-->>Router: disaggregated_params
Router->>Router: Select decode worker
Router->>Decode: Decode request + transfer metadata
Decode<<->>Prefill: KV transfer (NIXL)
Decode->>Decode: Generate tokens
Decode-->>Frontend: Stream tokens
Frontend-->>Client: Response
  1. Выбор worker: router выбирает prefill worker с помощью KV-aware routing (по score перекрытия cache и нагрузке) либо простого балансирования нагрузки.

  2. Выполнение prefill: router отправляет prefill request выбранному prefill worker. Prefill worker вычисляет KV cache и возвращает disaggregated_params, содержащий metadata transfer, специфичную для backend.

  3. Routing decode: router внедряет результат prefill в decode request, затем направляет его decode worker.

  4. Передача KV: decode worker использует metadata transfer, чтобы координировать действия с prefill worker. NIXL выполняет прямую GPU-to-GPU передачу с помощью оптимального доступного transport (NVLink, InfiniBand/UCX и т. д.).

Передача metadata, специфичная для backend

Формат metadata transfer зависит от backend:

  • SGLang: использует bootstrap_info (host, port, room_id) для RDMA bootstrap coordination. Prefill workers SGLang публикуют свой bootstrap endpoint в discovery service во время инициализации. Благодаря этому prefill может выполняться как фоновая задача, а decode phase может начинаться сразу, пока KV transfer идет параллельно.

  • vLLM: использует kv_transfer_params, содержащий block ID и информацию о подключении к remote worker. Prefill выполняется синхронно; decode ждет завершения prefill, прежде чем продолжить.

  • TRTLLM: использует opaque_state, содержащий сериализованную внутреннюю metadata TRT-LLM. Prefill выполняется синхронно; decode ждет завершения prefill, прежде чем продолжить.

Перенастраиваемый на лету xPyD

Dynamo disaggregation design поддерживает runtime-reconfigurable xPyD (x prefill workers, y decode workers). Workers можно добавлять и удалять во время работы:

  • Добавить worker: worker регистрируется в discovery service и публикует свой RuntimeConfig (включая KV capacity).
  • Удалить worker: worker завершает active requests и снимается с регистрации в discovery.

Router автоматически обнаруживает новых workers через discovery service и учитывает их при принятии routing decisions.