7.4 分离式推理与多模态/Agent 推理:架构级的优化与未来 当单个节点的优化做到极致,下一步就是把架构「拆开」——把 Prefill 与 Decode 分到不同节点、把多模态编码与文本生成解耦、把多轮 Agent 的 KV Cache 跨调用复用。PD 分离(Prefill/Decode Disaggregation)是 2024 年以来 LLM 推理最前沿的架构级创新。 7.4.1 从节点优化到架构优化 第 6-7 章的前三节(PagedAttention、Chunked Prefill、量化、Speculative)都是「节点内优化」——让单个推理节点更高效。
当单个节点的优化做到极致,下一步就是把架构「拆开」——把 Prefill 与 Decode 分到不同节点、把多模态编码与文本生成解耦、把多轮 Agent 的 KV Cache 跨调用复用。PD 分离(Prefill/Decode Disaggregation)是 2024 年以来 LLM 推理最前沿的架构级创新。
第 6-7 章的前三节(PagedAttention、Chunked Prefill、量化、Speculative)都是「节点内优化」——让单个推理节点更高效。但当单个节点的优化接近物理极限时,下一步的突破必须来自「架构级」:
本节讲清这三个方向,它们是 LLM 推理的前沿,也是未来 1-2 年的工程热点。
PD 分离(Prefill/Decode Disaggregation) 的核心思想:把 Prefill 与 Decode 这两个特性截然不同的阶段(回顾 6.2 节)拆到不同节点,各自最优。
回顾两阶段的不对称:
传统「PD 混合部署」(Prefill 与 Decode 在同一节点)的问题:
PD 分离的解决方案:
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 340" font-family="sans-serif" font-size="12"> <text x="440" y="22" text-anchor="middle" font-size="15" font-weight="bold">PD 分离架构</text> <!-- 客户端 --> <rect x="380" y="50" width="120" height="40" rx="6" fill="#fef9c3" stroke="#ca8a04"/> <text x="440" y="75" text-anchor="middle">客户端请求</text> <!-- 路由 --> <rect x="350" y="110" width="180" height="40" rx="6" fill="#dbeafe" stroke="#2563eb"/> <text x="440" y="135" text-anchor="middle">Router</text> <!-- P 池 --> <rect x="40" y="180" width="280" height="100" rx="8" fill="#dcfce7" stroke="#16a34a"/> <text x="180" y="205" text-anchor="middle" font-weight="bold" fill="#15803d">P 池(Prefill)</text> <text x="180" y="225" text-anchor="middle" font-size="11">配大算力卡(H100)</text> <text x="180" y="245" text-anchor="middle" font-size="11">承担 TTFT</text> <text x="180" y="265" text-anchor="middle" font-size="11">计算密集优化</text> <!-- D 池 --> <rect x="560" y="180" width="280" height="100" rx="8" fill="#fce7f3" stroke="#db2777"/> <text x="700" y="205" text-anchor="middle" font-weight="bold" fill="#9d174d">D 池(Decode)</text> <text x="700" y="225" text-anchor="middle" font-size="11">配大显存带宽卡</text> <text x="700" y="245" text-anchor="middle" font-size="11">承担吞吐</text> <text x="700" y="265" text-anchor="middle" font-size="11">内存密集优化</text> <!-- 跨节点 KV 传输 --> <line x1="180" y1="150" x2="180" y2="180" stroke="#16a34a" stroke-width="2" marker-end="url(#arr8)"/> <line x1="700" y1="180" x2="700" y2="150" stroke="#db2777" stroke-width="2" marker-end="url(#arr8)"/> <line x1="180" y1="150" x2="440" y2="110" stroke="#475569" stroke-width="1.5"/> <line x1="700" y1="150" x2="440" y2="110" stroke="#475569" stroke-width="1.5"/> <!-- KV 传输说明 --> <rect x="320" y="180" width="240" height="40" rx="6" fill="#fed7aa" stroke="#ea580c"/> <text x="440" y="205" text-anchor="middle" font-weight="bold" fill="#9a3412">跨节点 KV 传输</text> <text x="440" y="220" text-anchor="middle" font-size="10">Prefill 完成后传 KV 到 D 节点</text> <line x1="320" y1="200" x2="280" y2="200" stroke="#ea580c" stroke-width="2" marker-end="url(#arr8)"/> <line x1="560" y1="200" x2="600" y2="200" stroke="#ea580c" stroke-width="2" marker-end="url(#arr8)"/> <text x="440" y="310" text-anchor="middle" font-size="11" fill="#475569">P 池与 D 池独立扩缩、独立优化,跨节点 KV 传输是关键挑战</text> <defs> <marker id="arr8" markerWidth="10" markerHeight="10" refX="8" refY="3" orient="auto"> <path d="M0,0 L8,3 L0,6 z" fill="#475569"/> </marker> </defs> </svg>
PD 分离带来的收益:
| 维度 | PD 混合 | PD 分离 |
|---|---|---|
| 资源配置 | 一个池兼顾 | 两池独立优化 |
| PD 干扰 | 存在 | 消除 |
| 扩缩容 | 按总流量 | 按阶段流量 |
| SLO 保障 | 混合 | 分阶段 |
| 复杂度 | 低 | 高 |
PD 分离的最大挑战是「跨节点 KV 传输」——Prefill 完成后,KV Cache 要从 P 节点传到 D 节点。这个 KV Cache 可能高达几 GB(回顾 6.2 节),跨节点传输本身可能成为瓶颈。
挑战与解决:
| 挑战 | 解决方案 |
|---|---|
| 传输量大 | 用 RDMA/IB 高速网络、KV Cache 压缩 |
| 传输延迟 | 异步传输(Prefill 后期就开始传)、KV Cache 量化 |
| D 节点选择 | 按 KV 大小、负载、亲和性选 D 节点 |
| KV Cache 兼容 | 保证 P 节点与 D 节点模型版本、量化配置一致 |
| 失败处理 | 传输失败要回退或重试 |
业界已有几种 PD 分离实现:
💡 判读:PD 分离是「用网络带宽换架构灵活性」——用跨节点 KV 传输的代价,换取 Prefill 与 Decode 的独立优化。这个权衡在「高并发、长上下文」场景下特别划算,因为混合部署的 PD 干扰问题在这些场景被放大。但对中小流量场景,混合部署可能更简单经济。
多模态 LLM(如 GPT-4V、Gemini、Qwen-VL、LLaVA)能处理图像、音频、视频等非文本输入。多模态推理的工程挑战与纯文本不同:
大多数多模态 LLM 是「视觉编码器 + LLM」两段式:
Agent(智能体) 是 LLM 应用的下一形态——LLM 不再是「单轮问答」,而是「多轮调用工具、规划任务、执行操作」。Agent 的推理特性给优化带来新挑战与新机会。
一个典型的 Agent 任务:
用户:"帮我订一张明天去上海的机票" LLM: - 轮 1:思考 + 调用工具 search_flights(date="2026-07-20", to="上海") - 工具返回:航班列表 - 轮 2:思考 + 调用工具 book_flight(flight_id="CA1234") - 工具返回:预订成功 - 轮 3:回复用户"已为您预订 CA1234 航班"
每一轮 LLM 调用都要重新跑一次推理,但前几轮的对话历史会反复出现在后续每一轮中。如果不优化,每轮都要重新计算前几轮的 KV Cache。
Agent 推理的核心优化是 KV Cache 跨轮复用:
这与第 6 章 6.3 节的 Prefix Caching 是同一思想——多轮 Agent 是「不断增长的前缀」,每轮只增加少量内容。Prefix Caching 让 Agent 推理的成本随轮次增加而线性降低(而非每轮全算)。
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 880 260" font-family="sans-serif" font-size="12"> <text x="440" y="22" text-anchor="middle" font-size="15" font-weight="bold">Agent 推理的 KV Cache 跨轮复用</text> <!-- 轮 1 --> <rect x="40" y="60" width="800" height="40" rx="4" fill="#dbeafe" stroke="#2563eb"/> <text x="50" y="85" font-size="11">轮 1:[System Prompt + 用户问题] → KV Cache 1(全算)</text> <!-- 轮 2 --> <rect x="40" y="110" width="800" height="40" rx="4" fill="#dcfce7" stroke="#16a34a"/> <rect x="40" y="115" width="600" height="30" fill="#16a34a" opacity="0.3"/> <text x="50" y="135" font-size="11">轮 2:[KV1 复用 ✓] + [轮1输出 + 工具返回](新算)→ KV Cache 2</text> <!-- 轮 3 --> <rect x="40" y="160" width="800" height="40" rx="4" fill="#fef9c3" stroke="#ca8a04"/> <rect x="40" y="165" width="700" height="30" fill="#ca8a04" opacity="0.3"/> <text x="50" y="185" font-size="11">轮 3:[KV2 复用 ✓] + [轮2输出 + 工具返回](新算)→ KV Cache 3</text> <text x="440" y="230" text-anchor="middle" font-size="11" fill="#16a34a" font-style="italic">每轮只算新增部分,前缀 KV 复用 → 多轮 Agent 成本随轮次线性下降</text> </svg>
Agent 流行推动了 LLM 推理服务的架构变化:
这些变化让 LLM 推理服务从「HTTP API」向「有状态推理平台」演进,是 2024 年以来的重要趋势。
LLM 的上下文长度从早期的 2K、4K 一路增长到 128K、1M(如 Gemini 1.5 Pro)。长上下文推理的工程挑战:
优化方向:
长上下文是 LLM 推理的前沿,许多技术仍在快速演进。
到这里,第 7 章完成了「高效交付层」的进阶内容:
加上第 6 章的基础(服务化架构、PagedAttention),第 6-7 章合起来回答了「LLM 怎么高效交付」的完整问题。第 8 章将进入最后一层——「稳定运行层」,讲清这些推理服务上线后如何监控、扩缩容、保障稳定性。
第 7 章完结。下一章《第 8 章 可观测性、弹性扩缩容与大流量稳定性》将进入最后一层——稳定运行层。