For the complete documentation index, see llms.txt. This page is also available as Markdown.

本章小结

本章沿着一条链展开:前向交出一行 logits,经约束与偏置、惩罚、温度、截断、选词、停止判定六个环节,变成一个词元,再送回模型。各节的结论如下。

自回归解码(9.1 节)。 选出 n 个词元需要 1 次 Prefill 加 n − 1 次 Decode,带 KV 缓存时每轮只送入 1 个词元。Llama 3 8B 的 LM head 约占一轮 Decode 矩阵乘法的 7%,此后各环节的运算量比前向低约五个数量级。循环有四种出口;“模型停不下来”多数是停止集合配漏,例如对话模型只配了 <|end_of_text|> 而漏了 <|eot_id|>。批量生成用左填充并让位置索引跳过填充,服务引擎则用不填充的一维批。流式输出要按窗口增量反分词,等 UTF-8 字节凑齐再发。

贪心与束搜索(9.2 节)。 贪心只看单步,两步小树里它得到 0.200,束宽 2 得到 0.360。束搜索每轮从 W × n_vocab 个候选中取 W 个(W 是束宽,全书其余各处的 B 是批大小),KV 缓存按 beam_idx 重排。累积对数概率偏好短序列,长度归一化的指数是要按任务调的旋钮。Prefill 只做一次,共享 Prompt 后 KV 占用由 W × (P + t) 降到至多 P + W × t。束宽并非越大越好:对翻译模型做精确搜索,51.8% 的句子最高分输出是空译文。概率最高不等于最好。

采样(9.3 节)。 温度 $\tau$ 等价于对概率取 $1/\tau$ 次幂,不改变 argmax,只改变熵。Top-k 看名次,Top-p 看累积质量,Min-p 看相对峰值的比例;分布被拉平时 Top-p 的核里会装进大量尾部词元,Min-p 在峰值很高时退化为贪心。乘性的重复惩罚对 logit 尺度敏感,加性的频次惩罚随输出长度累积。处理顺序是结果的一部分:同样的 $\tau = 2$、top_p = 0.9,先调温度保留 4 个词元,先截断只保留 3 个,而各引擎的默认顺序并不相同。最后的抽取用指数竞赛实现,即逐元素除以指数噪声再取 argmax,与 Gumbel-Max 等价;指定 Top-k 或 Top-p 时,vLLM 在 CUDA 上默认改走 FlashInfer 的拒绝采样内核。temperature = 0 不保证可复现,规约顺序随批组成变化,并列的 logit 会被翻转。

约束解码(9.4 节)。 每一轮按语法状态遮掉不合法词元,输出的每个前缀必然合乎语法。难点在于语法写在字符上而模型选的是词元,一个词元可以横跨几个语法成分,合不合法取决于状态。代价是逐步归一化不等于原分布在合法输出上的条件分布;它也不保证输出在截断之前写完,更不保证语义正确。引擎一侧的索引、缓存与重叠执行见 11.7 节。

解码侧的推理时扩展(9.5 节)。 二元简化下,单条正确率 0.6 时 5 票多数的正确率是 0.683;单条正确率低于一半且错误集中时,票越多错得越稳。采到正确答案容易,选出它才是瓶颈,奖励模型作选择器时 n 过大还会选中钻空子的样本。并行采样共享 Prefill,Decode 受带宽限制,采 8 条的单轮耗时只增加约 8%,按 N 倍增长的是词元数和 KV 占用;单路径加长则直接拉长延迟。训练一侧的内容见 14.6 节。

扩散语言模型(9.6 节)。 掩码去噪把前向次数从生成长度中解耦出来,代价是同一步内解开的位置按条件独立采样。块扩散在画布内并行去噪、画布间自回归,已定稿的画布写入 KV 缓存。按模型卡的数字,生成 256 个词元的计算量是自回归的 13 到 17 倍,前向次数是它的 1/15 到 1/20。收益来自把瓶颈从访存转向算力,套利的是低并发时闲置的算力,随并发升高而消退。

9.5 节和 9.6 节的成本账都借用了“访存受限”“拐点”这两个概念,其定义和推导在第十章。


📝 发现错误或有改进建议? 欢迎提交 Issue 或 PR。

最后更新于