03. Decoding Strategies | 解码策略
页面目标
从首 token 之后的生成循环开始,观察单条请求每轮如何读取已有 KV 状态、产生输出,再比较生成策略对速度、质量和额外成本的影响。
核心机制
Decode 是一轮一轮的小步生成:每一步读取已有 KV 状态,得到 logits,再选择下一个 token,并把新的 token 和状态追加到序列中。先用贪心解码建立基线:直接选择 logits 最大的 token,直到遇到 EOS 或达到最大长度;再比较采样、speculative decoding 和 multi-token decoding。本页重点是单条请求的生成决策;多个请求如何组织执行,放到 Task4 的调度正文中。
| 策略 | 主要改变什么 | 需要观察什么 |
|---|---|---|
| 贪心 Decode(基线) | 每轮选择 logits 最大的一个 token | 输出长度、TPOT、KV Cache 访问、质量 |
| 随机采样 | 按 temperature、top-k / top-p 选择 token | 质量、重复率、TPOT、输出稳定性 |
| Speculative Decoding | draft 提议、target 验证 | acceptance rate、draft cost、TPOT |
| Multi-token Decoding | 单轮尝试产出多个 token | 接受与回退、generated tokens/s |
| Decode Scheduling | 不同请求的执行顺序 | 吞吐、TPOT、P99 |
单请求的 Decode 可以按“读取状态 → 计算 logits → 选择 token → 检查停止 → 追加状态”理解。策略改变的是其中的候选生成、验证或单轮产出;它不会自动消除 KV Cache 的容量约束,也不能用吞吐提升替代质量检查。比较 speculative decoding 或 multi-token decoding 时,还要记录接受情况和回退成本。
| 生成环节 | 需要回答的问题 | 证据 |
|---|---|---|
| 读取状态 | 本轮使用了哪些历史 KV? | Cache 长度、TPOT、读写量 |
| 选择 token | 是贪心、采样,还是 draft 提议后验证? | temperature、top-k/top-p、acceptance rate |
| 停止与回退 | 何时遇到 EOS,何时拒绝候选? | generated tokens、停止原因、回退次数 |
| 质量与成本 | 更快是否保持了目标质量? | 质量指标、TPOT、吞吐、额外模型成本 |
生成策略的比较需要把“可重复性”和“质量门槛”一起固定。贪心 Decode 适合作为确定性基线;采样实验应固定随机种子和采样参数;speculative decoding 还要记录 draft 与 target 的版本、接受率和拒绝后的回退路径。只有在输出质量达到同一门槛后,TPOT 或吞吐的改善才可以作为性能收益。
| 对照条件 | 应固定的内容 | 额外记录 |
|---|---|---|
| 贪心基线 | 模型、Prompt、最大输出长度、停止条件 | 输出 token、TPOT、E2E、质量基线 |
| 随机采样 | seed、temperature、top-k/top-p、Prompt 集 | 重复率、格式成功率、质量分布 |
| Speculative | draft/target 模型、proposal 长度、验证规则 | acceptance rate、回退次数、额外显存 |
| Multi-token | 单轮候选数量、接受与回退规则 | 有效输出 tokens/s、失败比例、TPOT |
参考入口:论文 Fast Inference from Transformers via Speculative Decoding;开源实现 vLLM Speculative Decoding。
判断框架
本节承接 02 的 Prefill 与 Attention,先用 21 Decoding Strategies 建立单步生成口径,再用 23 Speculative Decoding 和 35 Multi Token Decoding 比较生成策略,最后通过 36 Decode Scheduling 观察请求组织。阅读下表时,先固定 TPOT、decode_share、generated tokens 和质量约束,再根据现象选择下一步动作。
| 观察到的现象 | 优先判断 | 下一步 |
|---|---|---|
| 每轮生成耗时高 | Decode 计算、KV Cache 访问或 sampling | 检查基础 Decode 和 04 |
| 循环次数过多 | 生成长度或单轮产出受限 | 检查 speculative / multi-token |
| acceptance rate 低 | draft model 或 proposal 不匹配 | 调整 draft、长度或放弃策略 |
| 多请求吞吐低、P99 高 | 请求组织或调度问题 | 进入 07 / 06 |
