一文详解大模型推理:从基础知识到 vLLM

推理

本章正在建设中 - 一些部分已经完成,一些刚刚开始,还有许多尚未开始,但已经有足够多的有用部分完成,使其值得阅读。

术语表

  • 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.0t>1.0会相应地推开或拉近值 - 因为log

温度对贪心解码、束搜索和Top-K采样策略没有影响,因为它影响logit概率之间的距离,而所有这些策略都使用基于其顺序的top概率,温度不会改变概率的顺序。而Top-p采样允许更多或更少的竞争者进入基于其总概率的子集,因此,概率越接近(高温)随机性越大。

除了t==0.0t==0之外,没有硬性规定的值可以复制,您必须为每个用例实验以找到最适合您需求的值 - 尽管您肯定会找到人们在不同用例中提供良好的基线。

指导文本生成(Guided Text Generation)

也称为结构化文本生成和辅助生成。

如果模型可以返回其生成的输出在特定的格式,而不是不受限制的格式,您不希望模型产生无效的格式。例如,如果您希望模型返回一个JSON字典,它应该这样做。

实现这一点的方法是使用指导文本生成。而不是选择概率最高的生成token,该技术使用下一个最佳概率的token,该token适合下一个预期的token子集。为了举例说明:如果您希望模型生成一个JSON字符

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值