推理
本章正在建设中 - 一些部分已经完成,一些刚刚开始,还有许多尚未开始,但已经有足够多的有用部分完成,使其值得阅读。
术语表
- CLA: 跨层注意力(Cross-Layer Attention)
- FHE: 全同态加密(Fully Homomorphic Encryption)
- GQA: 分组查询注意力(Grouped-Query Attention)
- ITL: 词间延迟(Inter-Token Latency)
- KV: 键值(Key Value)
- LPU: 语言处理单元™(Language Processing Unit™)
- MHA: 多头注意力(Multi-Head Attention)
- MPC: 安全多方计算(Secure Multi-Party Computation
- MQA: 多查询注意力(Multi-Query Attention)
- PPML: 隐私保护机器学习(Privacy-Preserving Machine Learning)
- QPS: 每秒查询数(Queries Per Second)
- TPOT: 每个输出token的时间(Time Per Output Token)
- TTFT: 第一个token的时间(Time to First Token)
参见下面的概念部分获取更多类似术语的条目。
概念
预填充和解码
在进行推理时,有两个阶段:
预填充
预填充:由于提示的所有token都是已知的 - 一次处理完整的提示长度(类似于训练)并缓存中间状态(KV缓存)。由于即使是1k的提示也可以在足够的内存下非常快地处理,因此这一阶段几乎不会增加延迟。
解码
解码:新token的生成是基于所有先前的token(提示和迄今为止生成的任何新token)一次生成一个新token(回归方法)。因此,与预填充不同,这一阶段对生成的延迟贡献最大,因为解码无法并行化。
在线推理与离线推理
当用户实时发送查询时 - 这是在线推理,也称为部署。示例:聊天机器人、搜索引擎、通用REST API。在这种情况下,通常会运行一个推理服务器,并且可能有各种客户端连接到它。
当你有一个包含提示的文件需要进行推理时 - 这是离线推理。示例:基准评估、合成数据生成。在这种情况下,通常不需要推理服务器,推理直接在发送查询的同一程序中运行(客户端和服务器在一个应用程序中)。
基础(Grounding)
这是为预训练模型提供在训练期间不可用的额外信息的过程。例如,输入基础任务(input-grounded-tasks,见下面的任务的第一个)在提示中为模型提供了大量额外信息。非零样本提示在示例中为模型提供基础,改变了默认的模型行为。提示工程的全部内容是使模型在推理期间以某种特定方式来推理。
检索增强生成(RAG)是为模型提供基础的主要技术之一,因为它为推理过程提供了与提示相关的额外数据。目的是使模型比其训练时的大量压缩信息更重视这些信息。
微调到不同的知识领域是另一种基础方法,我们更新模型,使其在一个新的数据集上有基础,这个数据集可能与基础模型训练的原始数据领域完全不同。
基础可以被认为是提供上下文。正如任何人都可以证明的那样,当一个人理解问题的上下文时,回答问题会更容易。模型生成也是如此。上下文越好,生成的输出就越相关。
在多模态使用情况下,图像或视频与文本提示一起提供可以作为基础或上下文。
任务(Tasks)
输入基础任务(Input-grounded tasks)
输入基础任务是那些生成响应主要来自提示的任务,即主要知识包含在提示中。这些包括:
- 翻译
- 摘要
- 文档问答
- 多轮对话
- 代码编辑
- 语音识别(音频转录)
批处理(Batching)
一次处理一个token的解码阶段对加速器来说是非常低效的。将多个查询一起批处理可以提高加速器的利用率,并使一次处理多个请求成为可能。
批处理的最大可能大小取决于在加载模型权重和填充KV缓存后剩余的内存量。
静态批处理(Static batching)
这是最简单直接的批处理方式,前N个查询一起批处理 - 问题在于,如果许多查询已经完成生成,它们将不得不等待最长的查询完成,然后才能返回给调用者 - 大大增加了延迟。
连续批处理或飞行中的批处理(Continuous Batching or In-flight batching)
连续批处理或飞行中的批处理是一个过程,在这个过程中,生成引擎在生成完成后立即删除完成的查询,并用新查询替换它们,而不等待整个批处理完成。因此,批处理中位置0的序列可能正在生成其第10个token,而批处理中位置1的序列可能刚刚开始其第一个token生成,位置3的序列正在生成其最后一个token。
这提高了响应时间,因为不需要一个已经完成的序列立即返回,也不需要一个新的提示等待下一个批处理变得可用。当然,如果所有计算都忙于处理,并且没有新的空闲位置,那么一些请求将不得不等待计算开始处理它们。
分页注意力(Paged Attention)
分页注意力是推理服务器中非常流行的技术,因为它允许非常高效地利用加速器内存,通过接近加速器内存的方式使用分页,从而允许动态内存分配并防止内存碎片。
解码方法(Decoding methods)
主要的解码方法有:贪心解码、束搜索和采样。
(一)贪心解码(Greedy decoding)
贪心解码是模型总是选择概率最高的token。这是最快的解码方法,但它不一定生成最好的结果,因为它可能会选择一个不太理想的token路径,并错过一个很好的未来token序列。
贪心解码的主要问题是创建循环,即相同的句子被一遍又一遍地重复。
(二)束搜索(Beam search)
束搜索通过同时生成多个输出克服了贪心解码的限制,因此,在每个新token上,它遵循概率最高的3个输出(束大小为3),然后丢弃所有但3个子路径(3*3),这些子路径在链中的所有token的总概率最高。最后,选择概率最高的所有token的路径。
这种方法比贪心解码慢,因为它必须生成n倍多的token,并且需要n倍多的内存。
(三)采样(Sampling)
采样引入随机性。
但是,当然,选择随机词不会产生好的结果,所以我们仍然想要贪心解码的确定性,但通过向其添加受控的随机性使其更有趣/更生动。
最常见的采样方法是:
- Top-K采样方法根据其logit概率选择前k个token,然后随机选择其中一个token。
- Top-p采样(也称为nucleus采样)类似于Top-K采样,但K对于每个下一个token是可变的,并通过添加前k个token的概率直到达到阈值p来计算。因此,只有模型非常有信心时才会考虑这些预测。
(四)温度(Temperature)
温度是Top-p采样策略的一部分,其值如下:
t==0.0:
最终选择概率最高的token - 没有随机性 - 与贪心解码相同 - 精确用例。t==1.0
: 对采样没有影响 - 这里保留了原始训练分布 - 平衡相关性和多样性用例。0.0<t<1.0
: 使logit概率进一步分离,因此越接近0.0随机性越少 - 介于精确和平衡用例之间。t>1.0
: 使logit概率更接近,创建大量随机性 - 创造性用例。
为了真正理解影响,温度因子通常在Softmax操作之前或作为其一部分应用到logit概率上。
logits = math.log(probs) / temperature
因此,很容易看出t=1.0
没有影响,t=0
会使最高logit趋于无穷大(避免除以零),而t<1.0
和t>1.0
会相应地推开或拉近值 - 因为log
。
温度对贪心解码、束搜索和Top-K采样策略没有影响,因为它影响logit概率之间的距离,而所有这些策略都使用基于其顺序的top概率,温度不会改变概率的顺序。而Top-p采样允许更多或更少的竞争者进入基于其总概率的子集,因此,概率越接近(高温)随机性越大。
除了t==0.0
和t==0
之外,没有硬性规定的值可以复制,您必须为每个用例实验以找到最适合您需求的值 - 尽管您肯定会找到人们在不同用例中提供良好的基线。
指导文本生成(Guided Text Generation)
也称为结构化文本生成和辅助生成。
如果模型可以返回其生成的输出在特定的格式,而不是不受限制的格式,您不希望模型产生无效的格式。例如,如果您希望模型返回一个JSON字典,它应该这样做。
实现这一点的方法是使用指导文本生成。而不是选择概率最高的生成token,该技术使用下一个最佳概率的token,该token适合下一个预期的token子集。为了举例说明:如果您希望模型生成一个JSON字符