llm-wiki wiki · sources 2026-09-13

原文:raw/dynamo-architecture-analysis.md · 仓库:https://github.com/ai-dynamo/dynamo · 分析版本 HEAD ed64b7d
本页按当前 README 与官方文档重构;“文档明确”与“架构推导”已尽量区分。

一句话定位

dynamo 是位于 SGLang、vLLM、TensorRT-LLM 之上的数据中心级 LLM 推理编排层。它解决跨节点、P/D 分离、KV 局部性、SLA 扩缩和故障迁移问题,而不是替代推理引擎本身。

它想解决的业务问题

核心架构图

                              ┌───────────────────────────────┐
                              │        在线业务 / Agent        │
                              │ OpenAI API · Responses · Tools │
                              └───────────────┬───────────────┘
                                              │ HTTP / SSE / gRPC
                       ┌──────────────────────▼──────────────────────┐
                       │             入口与请求编排层                 │
                       │ Frontend / Gateway EPP / Standalone Router  │
                       │ auth · protocol · tokenize · session hints  │
                       └───────────────┬──────────────────┬───────────┘
                                       │                  │
                              route decision       request dispatch
                                       │                  │
                       ┌──────────────▼──────────────────▼───────────┐
                       │                 Dynamo Runtime                │
                       │ Namespace → Component → Endpoint             │
                       │ discovery · request plane · event plane       │
                       └───────┬───────────────────┬──────────────────┘
                               │                   │
                KV overlap + load          endpoint registration / health
                               │                   │
              ┌────────────────▼───────┐   ┌─────▼────────────────────┐
              │     KV-aware Router     │   │ Discovery / Control       │
              │ prefix index + scoring  │   │ etcd / Kubernetes / file  │
              │ filters + worker choice │   │ EndpointSlice / metadata  │
              └───────────┬─────────────┘   └──────────┬────────────────┘
                          │                            │
             ┌────────────▼────────────┐  ┌───────────▼───────────────┐
             │      Serving graph       │  │    Capacity control       │
             │  Prefill pool ↔ Decode   │  │ Profiler → Planner        │
             │  pool; aggregated mode   │  │ Prometheus → scale target  │
             └───────┬──────────┬───────┘  └───────────┬───────────────┘
                     │          │                     │
              KV via NIXL   engine API          DGD / DGDR reconcile
                     │          │                     │
        ┌────────────▼───┐ ┌────▼─────────────┐ ┌─────▼─────────────────┐
        │ Prefill Worker  │ │ Decode Worker    │ │ Kubernetes Platform    │
        │ prompt → KV     │ │ KV → tokens      │ │ Operator · DGD · DCD   │
        │ SGLang/vLLM/TRT │ │ SGLang/vLLM/TRT  │ │ Grove / Gateway API     │
        └────────┬────────┘ └──────┬──────────┘ └──────────┬────────────┘
                 │                 │                       │
                 └────────┬────────┴──────────────┬────────┘
                          │                       │
                ┌─────────▼─────────┐   ┌────────▼────────────────────┐
                │ KV state & events │   │ Observability               │
                │ GPU/CPU/NVMe/Blob │   │ Prometheus · OTLP · Grafana  │
                │ KV events/index   │   │ traces · logs · FPM          │
                └───────────────────┘   └─────────────────────────────┘

模块分层与边界

层 功能 边界
入口 Frontend、Gateway EPP、Standalone Router 协议、tokenize、入口治理;不实现 GPU kernel
决策 KV-aware Router、PrefillRouter 选择 worker;不拥有全局 Kubernetes 状态
Runtime Namespace、Component、Endpoint、discovery/request/event planes 连接与生命周期;不替代 Operator
执行 Prefill/Decode/Aggregated Workers + backend engine batching、sampling、KV、token generation
KV/传输 NIXL、KV index/events、KVBM/offload KV transfer 与分层存储;不等价于强一致数据库
控制 DGDR、Profiler、AIConfigurator、Planner、DGD/DCD、Operator、Grove 配置搜索、扩缩、放置;不进入 token 热路径
横切 Prometheus、OTLP、canary、migration 观测与可靠性;不能阻塞推理热路径

请求与控制流

聚合请求

Client
  │ 1. OpenAI-compatible request
  ▼
Frontend
  │ 2. validate → chat template → tokenize → normalize sampling
  ▼
Router
  │ 3. filter ready workers
  │ 4. score KV overlap + active prefill + active decode + request count
  ▼
Selected aggregated worker
  │ 5. continuous/inflight batching inside backend engine
  │ 6. prefill + decode on the same worker pool
  ▼
Token stream
  │ 7. detokenize / aggregate if non-streaming
  ▼
Frontend ───────────────────────────────────────────────► Client

P/D 分离请求

Client → Frontend → PrefillRouter
                         │
                         ├─① 选择 prefill worker
                         │       │
                         │       ├─计算 prompt
                         │       ├─生成 KV blocks
                         │       └─返回 disaggregated_params
                         │
                         ├─② 选择 decode worker
                         │       │
                         │       ├─注入 transfer metadata
                         │       ├─通过 NIXL 协调 GPU↔GPU KV transfer
                         │       └─使用 KV 开始逐 token decode
                         │
                         └─③ stream tokens → Frontend → Client

KV-aware 路由反馈环

              ┌──────────────────────────────────────────┐
              │              Request arrives              │
              └────────────────────┬─────────────────────┘
                                   ▼
                         tokenize / normalize
                                   │
                 ┌─────────────────┴─────────────────┐
                 ▼                                   ▼
        KV prefix index                         active-load snapshot
        cached block overlap                    prefill/decode/request
                 └─────────────────┬─────────────────┘
                                   ▼
                       worker filters + cost score
                                   │
                                   ▼
                              worker choice
                                   │
                 ┌─────────────────┴─────────────────┐
                 ▼                                   ▼
           request dispatch                    KV lifecycle events
                                                     │
                                                     └──► index refresh

路由本质是把 cache locality 转成成本折扣,同时惩罚已分配的 prefill/decode 工作:adjusted_prefill = max(raw_prefill - overlap_credit, 0),再与 projected decode blocks、active request penalty 合并。它不是“永远选择 cache 命中最多的 worker”。详见 inference-routing 与 radix-attention。

DGDR → DGD → Serving

用户意图
  │ model + backend + hardware + workload + SLA + optional planner
  ▼
DGDR
  │ discover GPU type / memory / node capacity
  ▼
Profiler
  │ rapid: performance estimates
  │ thorough: deploy candidates and benchmark on real GPUs
  ▼
AIConfigurator
  │ enumerate → evaluate → rank candidate topology / parallelism / replicas
  ▼
Generated DGD
  │ autoApply=true  ───────────────┐
  │ autoApply=false → user review   │
  ▼                                ▼
Operator reconcile                 DGD applied
  │ create worker graph / DCD / services / optional planner
  ▼
Serving deployment

Planner 扩缩闭环

┌─────────┐   ┌─────────┐   ┌───────────┐   ┌──────────────┐
│ OBSERVE │ → │ PREDICT │ → │ PROPOSE   │ → │ RECONCILE    │
│ metrics │   │ req/ISL │   │ replicas  │   │ constraints  │
└─────────┘   └─────────┘   └───────────┘   └──────┬───────┘
                                                   ▼
                                           ┌──────────────┐
                                           │ CONSTRAIN    │
                                           │ min/GPU/SLA  │
                                           └──────┬───────┘
                                                  ▼
                                           ┌──────────────┐
                                           │ EXECUTE      │
                                           │ scale_to     │
                                           └──────┬───────┘
                                                  ▼
                                  Operator / connector changes replicas
                                                  │
                                                  └──── feedback ────► OBSERVE

throughput loop 预测持续需求并提供下界,load loop 快速纠正 SLA 压力。它们共享 worker inventory、性能模型、KV hit rate、speculative accept length 与 GPU budget;因此 Planner 不是普通 CPU utilization HPA。

Gateway API 路由

Client
  │
  ▼
Kubernetes Gateway / HTTPRoute
  │ 入口策略、认证、限流、边缘观测
  ▼
GAIE Endpoint Picker Plugin (EPP)
  │ 复用 Dynamo KV-aware selection
  ▼
Selected worker Frontend sidecar
  │ router-mode=direct
  ▼
Worker / engine

故障迁移

request in flight
      │
      ▼
worker error / timeout / disconnect
      │
      ├─不可迁移错误 → reject / return error
      │
      └─可迁移错误
            │ cache token/request state
            │ inhibit failed worker locally
            ▼
      choose healthy endpoint
            │ migration_limit not exceeded
            ├───────────────┐
            ▼               │
      replay request        │ limit reached
            │               ▼
            └──────► stream response or final failure

可观测性

Dynamo processes
  ├─ pull /metrics ─────────────► Prometheus ───────► Grafana
  ├─ OTLP traces/logs ──────────► OTel Collector ───► Tempo / Loki
  ├─ FPM event publication ─────► event plane
  │                                └─ bounded trace queue → JSONL(.gz)
  └─ request trace rows ─────────► JSONL / NATS / OTLP / stderr sinks

关键设计判断

选型与限制

适合长上下文、多 GPU/多节点、P/D 分离、需要 KV-aware routing、SLA autoscaling 或快速扩容的生产推理。单模型、单 GPU、没有跨节点协调需求时,直接使用 vllm 或 sglang 更简单。

P/D 分离会增加 KV transfer;Planner 依赖指标与性能模型;migration 需要请求幂等;远端 KV 需要额外的数据驻留和租户隔离治理。README 中的 2x TTFT、7x 启动等数字是特定 benchmark,不应视为通用保证;本次没有运行 GPU benchmark。