🏠 总目录📚 本教程 06d · 降延迟与指标 ← →
📑 本页目录(点开跳转)

06d · 降延迟,以及三个指标怎么权衡

⏱ 26 分钟 | ⭐ 显存和吞吐都够了,用户还是觉得慢的时候看这页


🎯 一句话

上一页把模型压小、把卡榨满,解决的是「装不装得下、够不够多」。 这一页解决「够不够快」 —— 投机解码和几种缓存怎么降延迟,以及为什么 TTFT、TPOT、吞吐这三个指标不可能同时最优,你必须先挑一个。


⚡ 武器三:投机解码(降低延迟)

因果链

常规:大模型一次吐 1 个 token,每次都要搬 140GB 权重
投机解码:
① 让一个小模型(草稿模型)快速猜 5 个 token
② 大模型一次性并行验证这 5 个 ← 关键:验证和生成 1 个的成本差不多!
(因为瓶颈是搬权重,不是算力)
③ 猜对的部分直接采纳,第一个猜错的地方开始重来
猜中率高时,延迟降低 2–3 倍,且输出分布严格等价 ✅

💡 为什么能白赚:正因为 decode 是访存密集的,GPU 算力本来就在空转——并行验证 5 个 token 几乎不额外花时间。

变体:Medusa(多头并行预测)、EAGLE、n-gram 查表(无需额外模型)。

🎲 三大武器管的都是「这一步跑得多快」——但还有一半不在这一章。 Decode 每一步吐出来的其实是一个概率分布,「从分布里挑哪个词」是完全另一套东西: temperature、top_p、那几个 penalty 全住在那里,和速度优化正交。

两章的分工看现象就能分清:慢、贵、显存不够 → 留在这一章; 输出飘、复读、每次结果不一样、JSON 间歇性打不开 → 去 06b · 解码策略。

⚠️ 顺带说,两章有一个真实的交集:T=0 也不保证逐位复现——归约顺序会随 batch 组成变化, 而动态 batch 正是上面武器二连续批处理造成的。吞吐优化和逐位复现是一对天然矛盾,那条在 06b 讲透。


🧰 其他常用手段

手段 作用
GQA/MQA 多个 Q 头共享 K/V 头 → KV Cache 省好几倍(原理见主线 2 · 模型怎样看懂一句话,完整展开见AI基础设施 16)
Prefix Caching 相同的系统提示词只算一次,多请求复用 ⭐ 省钱利器
FlashAttention 减少显存读写,长上下文提速明显
张量并行 一个模型切到多张卡上(放不下时的必选)
算子融合 / CUDA Graph 减少 kernel 启动开销

💰 Prefix Caching 对做 Agent 的人特别重要:Agent 每轮都重发完整历史(智能体教程第 1 章), 前缀完全相同——缓存后能省掉绝大部分 prefill 成本。这也是为什么「稳定内容放前面、动态内容放后面」是条金规则。

🚨 Prefix Caching 的杀手:三个会让命中率归零的写法

流程图

❌ 系统提示词开头放当前时间→每次前缀都不同,命中率 0%
❌ 每次动态排序工具列表→顺序一变前缀就变
❌ 把用户 ID / 会话 ID 放最前面→每个用户各自一份缓存,等于没缓存
✅ 正确布局:
[固定的系统提示词]
[固定的工具定义]
[很少变的背景资料]
缓存边界大致在这里
[会话历史]
[当前时间、用户信息等动态内容]
[用户问题]

🔑 一句话:前缀一个字符变了,从那里往后的缓存全部失效。 这是最容易犯、代价最大、也最容易修的一个错——改一下顺序就能省掉大半账单。


🎯 三个指标,别只盯一个

信息关系

TTFT(首字延迟) ← 用户感知"它反应快不快"
TPOT(每字延迟) ← 用户感知"它打字快不快"
吞吐(总 token/秒) ← 你感知"这张卡能服务多少人"
⚠️ 它们互相冲突:
· 加大 batch→吞吐↑ 但 TTFT 和 TPOT→(要排队)
· 减小 batch→延迟→但吞吐→(卡在空转)
你的场景 该优先什么
对话产品(有人在等) TTFT ⭐ ——首字出来得快,用户就觉得快
Agent / 批处理任务 吞吐 ——没人盯着,把卡榨满
代码补全 TPOT ——要跟得上打字速度

💡 一个便宜的心理学优化:开流式输出。 总时长没变,但用户看到字在动,感知延迟大幅下降—— 这往往比任何推理优化都划算。


🔗 想再深一层,去哪一套

去哪 为什么
AI基础设施 19 · 投机解码 ⭐ 武器三的完整展开:接受-拒绝规则、加速比公式、什么场景是白赚
模型上线之后 18 · 成本与容量 ⭐ 省下来的算力怎么换算成容量:排队、超时、雪崩
智能体工程教程 04 · 上下文工程 Prefix Caching 为什么对 Agent 特别值钱 —— 那一章的原话是「Agent 每轮都重发完整历史,前缀完全相同 → 可以被缓存复用」,并给了「稳定内容在前、动态在后」的写法
AI全栈 05 · 流式输出 「最便宜的延迟优化是开流式」那一条,工程上怎么真的接起来

📦 深挖的话要学什么

📍 每条后面标了它在哪: 📗 本库有 = 站内已经讲透,点进去就行;📙 半有 = 站内讲了一半,另一半得外找; 📕 要外找 = 站内没有,得去论文或别处。 (这份清单以前只列词不说去哪,指到的坑有些站内根本没挖过,按图索骥会扑空。) ⭐ 这一章是全导论「本库有」比例最高的一章——《AI基础设施》基本是它的完整展开版。

需要的前置:第 2 章 Transformer + Linux/GPU 基础。不需要深厚数学。


⚖️ 要不要深挖

你的情况 建议
只用 API,量不大 ⛔ 不用。知道 Prefix Caching 会用就行
API 账单开始肉疼 🟡 先做提示词优化和缓存,再考虑自建
数据不能出内网 / 有合规要求 ✅ 必须,配合第 7 章
有稳定的大流量,自建更划算 ✅ 必须,这块直接省真金白银
做 AI 基础设施 / 平台岗 ✅ 核心技能

🔑 我的判断:这块工程性极强、几乎不涉及数学,对有后端背景的人上手很快。 价值判断很简单:看你的账单。如果每月 API 花费还不够租一张 GPU,就别折腾自建。 但「Prefix Caching + 提示词结构优化」是所有人现在就该做的,本章内容已经够。


✅ 检查点

  1. 投机解码为什么能「白赚」速度?
  2. Prefix Caching 对 Agent 场景为什么特别有价值?哪三个写法会让命中率归零?
  3. TTFT / TPOT / 吞吐三个指标怎么互相冲突?对话产品该优先哪个?
  4. 最便宜的「延迟优化」是什么?为什么它有效?
👀 答案
  1. 因为 decode 是访存密集的,GPU 算力本来就在空转 —— 大模型并行验证 5 个 token 和生成 1 个 token 的耗时几乎一样,所以只要小模型猜中率够高就是净赚,而且输出分布和原模型完全一致。
  2. Agent 每轮都重发完整历史,前缀完全相同,缓存后能省掉绝大部分 prefill 成本。三个会让命中率归零的写法见正文那一节 —— 共同点都是把会变的东西放到了前面。
  3. 加大 batch → 吞吐↑ 但 TTFT 和 TPOT 变差(要排队);减小 batch → 延迟↓ 但吞吐↓(卡在空转)。对话产品该优先 TTFT:首字出来得快,用户就觉得快。
  4. 开流式输出。总时长一点没变,但用户看到字在动,感知延迟大幅下降 —— 这往往比任何推理优化都划算。

🛑 可以停在这里

⚠️ 什么时候回来:你已经知道该优化哪个指标了,但输出本身有问题 —— 一会儿飘一会儿复读、同样的输入两次结果不一样。那不是推理优化的事,是解码策略的事,从 06b 进去。

⚡ 走神救援

先记住这几件事

下一节 👉 06b-解码策略.md

打卡记录保存在你的浏览器里,首页能看到总进度