LLM 中的几种基础解码策略:贪心搜索(Greedy Search)、束搜索 (Beam Search),以及采样方法如 Top-K 和 Top-P(Nucleus)采样。它们之间的核心权衡是什么?在哪些场景下你会选择使用某一种策略而不是其他?
自回归语言模型生成文本的核心问题是,在每一步根据已生成的序列,从整个词汇表的概率分布中选择下一个 token 。不同的解码策略为这一选择过程提供了不同的方法论。
贪心搜索 (Greedy Search):简单直接。在每个时间步,模型总是选择概率最高的那个词元作为输出。这个过程不断重复,直到生成结束符或达到最大长度。其优点是计算效率极高、速度快,但容易陷入“局部最优”,导致生成内容单调、重复或缺乏逻辑连贯性 。
束搜索 (Beam Search):为了克服贪心搜索的短视问题,束搜索在每一步保留 k 个(k 即“束宽”或 beam width)最可能的候选序列。在下一步生成时,模型会基于这 k 个序列分别预测下一个词元,然后从所有产生的 k*V(V 为词表大小)个新序列中,再次选出总概率最高的 k 个。这个过程持续进行,通过探索更广的搜索空间来寻找一个更接近全局最优的序列。束搜索通常能生成比贪心搜索更流畅、更连贯的文本,但代价是计算成本更高,因为需要维护和评估多个候选序列 。
采样方法 (Sampling Methods):与前两种确定性策略不同,采样方法引入了随机性,旨在增加生成文本的多样性和创造性。
-
:此方法将采样范围限制在当前预测概率最高的
K个词元内。模型首先选出这K个词元,然后根据它们的概率重新归一化,并从中随机采样一个。这避免了从概率极低的“长尾”词元中采样,在一定程度上保证了文本的通顺性 。 -
Top-P (Nucleus) 采样:这是一种更动态的采样策略。它不限制候选词元的数量,而是选择一个累积概率超过阈值
p(例如 0.9)的最小词元集合(即“核”,nucleus)。词元按概率从高到低排序,直到它们的累积概率和刚好超过p。模型随后在这个动态生成的“核”中进行采样。这种方法比 Top-K 更灵活,当模型对下一个词元的预测非常确定时(概率分布尖锐),“核”会很小;当不确定时(概率分布平坦),“核”会变大,从而在保证质量和激发创造性之间取得了很好的平衡。
选择哪种策略高度依赖于具体应用场景。对于需要事实准确性、逻辑严谨性的任务,如机器翻译、代码生成或知识问答,确定性更强的束搜索通常是首选,因为它能找到概率上最合理的序列。而对于创造性任务,如故事创作、诗歌生成或开放域对话,采样方法(尤其是 Top-P)则更为合适,因为它们能引入多样性和新颖性,避免生成可预测的、乏味的内容 。
【Q5】为什么说(Key-Value Cache)是 LLM 推理,尤其是在长上下文场景下的主要瓶颈?请描述它在内存和延迟方面带来的挑战
在 Transformer 架构中,自注意力机制是其核心。为了生成第 i 个词元,模型需要关注(attend to)前面所有 i-1 个词元。在这个过程中,每个词元都会被计算出对应的键(Key, K)和值(Value, V)向量。KV Cache 的核心作用就是缓存这些已经计算过的 K 和 V 向量。当生成下一个词元时,模型只需计算当前词元的查询(Query, Q)向量,并与缓存中所有历史词元的 K 和 V 向量进行注意力计算,而无需重新为整个上下文计算 K 和 V。
KV Cache 的大小与序列长度 N 和模型隐藏维度 d 成正比。其内存占用可以粗略估算为:2 * N * d * num_layers * num_heads * sizeof(datatype)。对于一个拥有数万甚至数十万词元上下文的现代 LLM 来说,KV Cache 的体积会变得极其庞大,甚至可能超过模型权重本身占用的内存。以一个 70 亿参数的模型(如 Llama-7B)为例,假设其隐藏维度 d=4096,有 32 层,使用半精度(BF16,2 字节)。在 32k(32768)的上下文长度下,KV Cache 的大小约为 2 * 32768 * 4096 * 32 * 2 字节 ≈ 17.2 GB。
KV Cache 之所以成为瓶颈,尤其是在长上下文场景下,主要源于以下两点:
-
内存瓶颈 (Memory Bottleneck):
-
容量限制:巨大的 KV Cache 会消耗大量的 GPU 显存。对于消费级硬件或边缘设备,这直接限制了模型能够处理的最大上下文长度。
-
带宽限制:这是更关键的瓶颈。在自回归生成的每一步,模型都需要从相对较慢的 GPU HBM(高带宽内存)中读取完整的、巨大的 KV Cache 到处理器核心的高速 SRAM 中进行计算。对于长序列,这个数据传输量是巨大的。现代 GPU 的算力增长速度远超内存带宽的增长速度,导致推理过程从计算密集型(compute-bound)转变为内存带宽密集型(memory-bandwidth bound) 。换言之,GPU 大部分时间在等待数据加载,而不是在进行有意义的计算。
-
延迟瓶颈 (Latency Bottleneck):
-
加载延迟:将 GB 级别的 KV Cache 从 HBM 加载到 SRAM 所需的时间,构成了每一步解码延迟的主要部分。序列越长,这个延迟就越高,导致长文本生成的“首词元延迟”(Time to First Token)虽然不变,但“逐词元延迟”(Time per Output Token)显著增加。
-
对并行化的限制:自回归生成的顺序性限制了其并行能力。虽然草稿模型等技术试图缓解,但根本的 KV Cache 加载问题依然存在于验证的每一步。
总结来说,KV Cache 虽然避免了大量重复计算,但其随序列长度线性增长的体积,在现代硬件条件下,使其成为了长上下文推理中内存消耗和处理延迟的罪魁祸首。