llm-wiki wiki · concepts 2026-10-11

把 LLM 推理的 prefill(处理 prompt 并生成 KV) 与 decode(逐 token 续写) 拆到独立资源池中分别调度和扩缩的部署模式。首个输出 token 在哪一侧产生由后端约定,不能仅凭 P/D 名称判断。dynamo、vllm、sglang 等项目的具体接口和支持范围见对应实体与 Source 页;本页描述跨实现需要对齐的角色和契约。

在 M4 中的位置

P/D 分离同时改变 llm-inference-serving-project-map 的请求路径和 KV 生命周期:Prefill 与 Decode 独立扩缩,交接时按明确的 backend contract 传递元数据与 KV。inference-routing 负责端点选择与协调,llm-serving-performance 解释排队、TTFT、ITL 和传输代价,llm-serving-reliability 解释取消、超时和故障边界。

请求到 CUDA 中的位置

三套平台的实际 P/D 时序分别见 aibrix-inference-request-flow、dynamo-inference-request-flow 和 llm-d-inference-request-flow。它们会在 engine handoff 处进入 vllm-gpu-execution-path 或 sglang-gpu-execution-path:control metadata、KV payload 与 token stream 是三条不同路径,不能只画成一根“KV transfer”箭头。

为什么要分离

Prefill 和 decode 通常具有不同的资源需求,实际瓶颈随模型、batch、上下文长度和硬件变化:

阶段 计算密度 内存压力 并行度 延迟敏感点
Prefill 多个输入 token 并行处理,常偏计算受限 长 prompt 的 KV 和工作区仍可能很大 可按输入 token 预算组织 batch TTFT(time to first token)
Decode 每步处理各序列的新 token,常偏带宽受限 驻留 KV 随活跃序列和长度增加 连续批处理提高利用率 ITL(inter-token latency)

聚合式 serving 由同一组 engine 实例承担两阶段,长 prefill 可能与 decode 争用计算、带宽和调度时间。Chunked prefill、batch 策略和 admission 能缓解干扰,因此分离并非唯一选择,也不保证更快。

P/D 是服务阶段的资源池划分,和 engine 内部 TP(张量并行)、PP(流水线并行)、DP(数据并行)、EP(专家并行)是不同维度。每个池内部仍可使用这些并行方式;跨池的 shard、rank 和 KV layout 是否能映射,需要 connector 明确支持。

A3 · P/D 分离数据面

下面按职责画出请求、KV 和异步扩缩三条路径。拓扑是角色模型,不是通用进程布局:Gateway、Router、协调器可以合并或拆分,队列也可能位于 engine 内部。

flowchart LR
    C[Client] -->|请求| G[Gateway / Router / 协调角色]
    subgraph PP[独立 Prefill 池]
        PQ[Prefill 队列] --> P[Prefill workers]
    end
    subgraph DP[独立 Decode 池]
        DQ[Decode 队列] --> D[Decode workers]
    end
    G -->|prompt 与请求元数据| PQ
    G -->|续写请求与请求元数据| DQ
    P -.->|KV 位置与传输句柄等控制元数据| G
    G -.->|KV 元数据与交接控制| D
    P ==>|KV bytes| T[直连传输或后端支持的分层路径]
    T ==>|KV bytes| D
    D -->|输出流| G
    G -->|输出流| C
    PQ -.->|异步排队与输入 token 指标| PS[Prefill 扩缩控制]
    PS -.->|扩缩信号| P
    DQ -.->|异步排队指标| DS[Decode 扩缩控制]
    D -.->|异步活跃序列与 KV 容量指标| DS
    DS -.->|扩缩信号| D

实线表示逻辑请求与输出,粗线表示 KV bytes,虚线按标签区分交接控制与异步指标/扩缩。KV 元数据是位置、句柄、布局和生命周期信息,不等于缓存内容。图假设后端支持所选传输路径,实际 KV 可由发送方推送或接收方拉取。不要从图中推断 KV 必经 Gateway、所有层级存储都可用,或扩缩动作属于请求的同步关键路径。

两池可分别按输入 token 工作量和活跃序列/KV 压力扩缩,但吞吐仍通过交接耦合:Prefill 过快会让待接收 KV、Decode 队列和显存积压,Decode 空闲也可能来自 Prefill 或网络不足。需要联合 admission、队列上限、传输并发和 KV 保留时间,不能仅对两条队列独立追求清零。

S2 · P/D 请求与 KV Handoff 时序

本图选择“Prefill 返回元数据后协调 Decode”的逻辑顺序。某些实现会先预留 Decode、提前交换传输句柄或重叠计算和传输,必须按后端协议调整;这些顺序不改变就绪校验与资源回收的责任。

sequenceDiagram
    participant C as Client
    participant G as Gateway / 逻辑路由协调
    participant P as Prefill worker
    participant T as 可选 KV 层级
    participant D as Decode worker
    C->>G: 请求与 deadline
    G->>G: 选择 Prefill
    G->>P: prompt 与请求标识
    P->>P: 计算 KV
    P-->>G: 后端特定的 KV transfer metadata
    G->>G: 选择或协调已预留的 Decode
    G->>D: 请求标识与交接元数据
    alt 后端支持直连
        P->>D: 传输 KV bytes
    else 后端支持分层传输
        P->>T: 写入 KV bytes
        T->>D: 传输 KV bytes
    end
    D->>D: 校验完成信号与 KV 就绪及 deadline
    alt 就绪且请求仍有效
        D->>D: Decode 续写
        D-->>G: 输出 token 流
        G-->>C: 输出 token 流
    else 传输超时或客户端取消
        D-->>G: 交接未完成或请求已取消
        G->>P: 取消相关工作并回收或释放租约
        G->>D: 取消接收与生成并回收资源
        opt 使用分层传输
            G->>T: 按后端契约撤销或到期回收临时引用
        end
        Note over G,D: 仅按契约选择重算或拒绝或安全重试
        G-->>C: 连接仍有效时返回失败状态
    end

交接成功需要接收侧确认可消费的完整状态,收到元数据或提交传输操作都不代表 KV 已可读。图中的取消由协调角色传播,实际发起方、通知顺序和回收确认机制由协议规定;取消可能发生在任一阶段。不要从图中推断统一字段名、传输调用完成即 GPU 可见、取消必然即时完成,或任意故障都能透明续传。

KV Handoff 契约

契约项 需要对齐的语义
Request identity 请求、尝试和会话如何关联,如何防止旧尝试的完成信号污染新尝试
Model / tokenizer / layout compatibility 模型权重版本、adapter、tokenization、位置编码、KV dtype 和布局兼容,不能只比较模型名称
Block / layout mapping token 范围、块边界、层与 shard/rank 的映射,哪些转换由 connector 支持
Transfer metadata KV 的位置、传输句柄、有效期和访问权限,字段名与序列化形式由后端定义
Completion signal 由谁确认传输完成、目标内存可见且 KV 可消费,如何拒绝部分或过期状态
Cancellation 传播到计算、传输、接收和临时引用的范围,回收责任与重复取消的处理
Timeout / deadline 端到端预算如何覆盖排队、计算、传输和就绪等待,超时后谁负责释放资源
Recompute policy KV 缺失时是否允许从原始输入重算,是否仍有预算,重试是否会重复输出或外部副作用

重算依赖输入和执行上下文仍可获得,也依赖后端支持重新进入相应阶段;不能假设总能“只重算 suffix”。首 token 前也要防止重复尝试和资源泄漏。首 token 已发出后,新 worker 的重新采样通常不能视为原输出流的无缝延续,必须遵守显式的会话恢复与输出去重协议,否则终止流并报告失败。路由重选本身不能提供这个保证,详见 llm-serving-reliability。

Dynamo 示例的适用范围

src-dynamo-architecture 记录了 Dynamo 的 P/D 协调和传输实现,包括 backend 特定的交接元数据与 connector。它是本页角色模型的一个实例;组件名称、部署方式、元数据字段及支持的 backend/传输组合以该 Source 对应版本为边界,不构成所有 P/D 系统的统一协议。

收益与代价

收益来自阶段隔离、独立 batch 策略和按资源需求配置容量,有机会减少 prefill 对 decode 的干扰。两池也可选择不同硬件,但兼容性、容量利用率和传输成本必须共同评估,不能保证消除 ITL 抖动。

代价包括额外排队、KV 传输、状态协调和故障域。有效带宽取决于 GPU/NIC/NUMA 拓扑、跨机链路竞争及并发传输,设备标称带宽不足以预测 TTFT。短 prompt、小规模部署或互联不足时,聚合式可能更合适。判断应比较同一工作负载下的端到端 SLO、队列、传输时间和成本,见 llm-serving-performance 与 kv-cache-offload。