本文深入解析了大模型推理优化技术从LLM推理的基本流程到批处理、KV缓存等关键优化策略再到模型并行、注意力机制优化如SDPA、MHA、MQA、GQA、FlashAttention、PageAttention等高级技术以及量化、稀疏、蒸馏等模型优化方法最后介绍模型服务技术中的动态批处理和预测推理。旨在帮助读者全面了解并掌握大模型推理优化的核心知识提升模型应用落地的效率与性能。1. 什么是LLM推理大多数流行的only-decode LLM例如 GPT-4、Qwen系列都是针对因果建模目标进行预训练的本质上是作为下一个词预测器。「这些 LLM 将一系列tokens作为输入并自回归生成后续tokens直到满足停止条件」例如生成tokens数量的限制或遇到停止词或直到生成特殊的end标记生成结束的tokens。该过程涉及两个阶段预填充阶段和解码阶段。请注意tokens是模型处理的语言的原子部分。一个tokens大约是四个英文字符。所有自然语言在输入模型之前都会转换为tokens。下图是大模型推理过程。1.1 预填充阶段Prefill在预填充阶段也可以理解为输入阶段。LLM处理输入token以计算中间状态keys和value用于生成“第一个”token。每个新的token都依赖于所有先前的token但由于输入的全部已知因此在运算上都是高度并行化矩阵运算可以有效地使用GPU。1.2 解码阶段Decode在解码阶段可以理解为输出阶段。LLM一次自回归生成一个输出token直到满足停止条件。「每个输出tokens都需要直到之前迭代的所有输出状态keys和values」。这与预填充输入处理相比就像矩阵向量运算未充分利用GPU计算能力。数据weights, keys, values, activations 从内存传输到GPU的速度决定了延迟而不是计算实际时间消耗。即这是一个内存限制操作。本文中的许多推理挑战和相应的解决方案都涉及此解码阶段的优化高效的注意力模块、有效管理键和值等。不同的LLMs可能使用不同的tokenizers因此比较它们之间的输出tokens可能并不简单。在比较推理吞吐量时即使两个 LLMs每秒输出的tokens相似如果它们使用不同的tokenizers也可能不相等。这是因为相应的tokens可能代表不同数量的字符。1.3 批处理Batching提高 GPU 利用率和有效吞吐量的最简单方法是通过批处理。由于多个请求使用相同的模型因此权重的内存成本被分散。「大批量数据传输到 GPU 一次处理将提高GPU资源的利用率。然而批量大小只能增加到一定限制此时可能会导致内存溢出」。为了防止这种情况发生需要查看键值 (KV) 缓存和 LLM 内存要求。传统批处理也称为静态批处理 static batching不是最佳的。这是因为对于批次中的每个请求LLM 可能会生成不同数量的tokens并且不同tokens有不同的执行时间。因此批次中的所有请求都必须等待最长token的处理完成而生成长度的巨大差异可能会加剧这种情况。有一些方法可以缓解这种情况例如稍动态批处理。1.4 KV缓存解码阶段的一种常见优化是 KV 缓存。解码阶段在每个时间步生成单个token但每个token依赖于之前token的键和值张量包括预填充时计算的输入tokens的 KV 张量以及当前时间步之前计算的任何新 KV 张量 。「为了避免在每个时间步重新计算所有tokens的这些张量可以将它们缓存在 GPU 内存中」。每次迭代当需要计算新token时它们都会被添加到正在运行的缓存中以便在下一次迭代中使用。在一些实现中模型的每一层都有一个KV缓存。下图展示了KV的缓存机制。1.5 大模型内存需求实际上LLM对GPU显存的需求主要是模型权重和KV缓存「模型权重」模型参数占用内存。例如具有 70 亿个参数的模型例如 Llama 2-7B 以 16 位精度FP16 或 BF16加载将占用大约7B * sizeof(FP16) ~ 14 GB的内存。「KV缓存」自注意力张量的缓存占用内存避免冗余计算。使用批处理时批处理中每个请求的 KV 缓存仍然必须单独分配并且可能会占用大量内存。下面的公式描述了 KV 缓存的大小适用于当今最常见的 LLM 架构。每个Token KV缓存字节2 * (num_layers) * (num_heads * dim_head) * precision_in_bytes第一个因子 2 代表K和V矩阵。通常(num_heads * dim_head)的值与Transformer的hidden_size或模型的维度d_model相同。这些模型属性通常可以在配置文件中找到。输入批次中输入序列中的每个tokens都需要此内存大小。假设半精度KV缓存的总大小由以下公式给出:总的Token KV缓存字节 (batch_size) * (sequence_length) * 2 * (num_layers) * (hidden_size) * sizeof(FP16)例如对于 16 位精度的 Llama 2-7B 模型批量大小为 1KV 缓存的大小将为 1 * 4096 * 2 * 32 * 4096 * 2 字节即约 2 GB。可以发现Llama 2-7B本身模型权重占用为14G单个输入序列长度4096需要缓存为2G这就需要16GB的显存要运行该模型可见单个显存的要求。为此如何高效的管理 KV 缓存就成为了一项重要的挑战。内存需求随着批量大小和序列长度线性增长它限制了可服务的吞吐量并对长上下文输入提出了挑战。这就是本文中介绍的多项优化背后的动机。2.模型并行「减少模型权重在每设备的显存占用的一种方法是将模型分布在多个 GPU 上。分散内存和计算可以运行更大的模型或更大批量的输入」。模型并行化是训练或推理模型所必需的模型并行化需要比单个设备更多的内存用来训练和推理延迟或者吐量。根据模型权重的划分方式有多种方法可以并行化模型。请注意数据并行也是一种经常在与下面列出的其他技术相同的技术。在这种情况下模型的权重被复制到多个设备上并且输入的全局批量大小在每个设备上被分成微批次。它通过处理较大的批次来减少总体执行时间。然而这是一种训练时间优化在推理过程中不太相关。2.1 Pipeline并行Pipeline并行化将模型垂直分片为块其中每个块包含在单独设备上执行的层的子集。下图展示了四路Pipeline其中模型按顺序分区并且所有层的四分之一子集在每个设备上执行。一个设备上的一组操作的输出被传递到下一个设备后者继续执行后续块。 和 分别表示设备 n 上的前向传播和后向传播。每个设备上存储模型权重的内存需求被分成四份。该方法的**「缺点是由于处理的顺序性质某些设备或层在等待前一层的输出激活、梯度时可能保持空闲状态」**。这会导致前向和后向传递效率低下或出现“Pipeline bubbles”。在上图b中白色空白区域是Pipeline并行性产生的Pipeline bubbles其中设备闲置且未得到充分利用。为了在一定时间内充分利用GPU可以通过微批处理的方式即分成多批一个GPU完成之后立马安排下一次计算但是这种方式可以在一定程度上缓解这种情况如图 2c 所示。输入的全局批次大小被分成了批次这些子批次被一一处理最后累积梯度。请注意 和 分别表示设备 n 上 m 批次的前向和后向传递。这种方法缩小了管道气泡的尺寸但并没有完全消除它们。2.2 Tensor并行Tensor并行化将模型的各个层水平分片为更小的、独立的计算块这些计算块可以在不同的设备上执行。Transformer的主要组成部分注意力块和多层感知器MLP层是可以利用Tensor并行化的。在多头注意力块中每个头或一组头可以分配给不同的设备以便它们可以独立且并行地计算。上图a显示了两层 MLP Tensor并行的示例每一层都由一个圆角框表示。在第一层中权重矩阵 分为 和 。对于输入 可以在同一批次不同设备上计算 和 其中是identity 操作。这将每个设备上存储权重的内存需求减半。归约操作 组合了第二层的输出。上图b是自注意力层中Tensor并行的示例。多个注意力头本质上是并行的并且可以跨设备分割。2.3 Sequence并行Tensor并行化是有局限性它需要将层划分为独立的、可管理的块不适用于 LayerNorm和 Dropout等操作而是在tensor并行中复制。虽然 LayerNorm和 Dropout的计算成本较低但它们确实需要大量内存来存储冗余激活。如Reducing Activation Recomputation in Large Transformer Models所示这些操作在输入序列中是独立的并且这些操作可以沿着“序列维度”进行分区从而提高内存效率。这称为序列并行性。模型并行技术不是唯一的可以结合使用。它们可以帮助扩展和减少 LLM 的每 GPU 内存占用量但也有专门针对注意力模块的优化技术。3.注意力机制优化缩放点积注意力 (SDPA scaled dot-product attention) 操作将query和key对映射到输出如论文Attention Is All You Need所述。3.1 多头注意力MHA作为 SDPA 的增强「三个变换张量对QKV分别进行线性变换这些变换不会改变原有张量的尺寸」使模型能够共同关注来自不同位置的不同表示子空间的信息。这些子空间是独立学习的使模型能够更丰富地理解输入中的不同位置。如下图所示缩放点积注意力左和多头注意力右多个并行注意力操作的输出被拼接后线性投影以组合起来。每个并行注意力层称为“头”这种方法称为多头注意力MHA。当使用八个并行注意力头时每个注意力头的维度都会减少例如。这使得计算成本与单头注意力相似。3.2 多查询注意力MQAMHA 的推理优化之一称为多查询注意力 (MQA)如 Fast Transformer Decoding 中提出的在多个注意力头之间共享键和值。与以前一样查询向量仍然被投影多次。虽然 MQA 中完成的计算量与 MHA 相同但从内存读取的数据量键、值只是以前的一小部分。「当受内存带宽限制时这可以实现更好的计算利用率」。它还减少了内存中 KV 缓存的大小为更大的批量大小留出了空间。「key头的减少会带来潜在的准确性下降」。此外需要在推理时利用这种优化的模型需要在启用 MQA 的情况下进行训练或至少使用大约 5% 的训练量进行微调。3.3 分组注意力GQA分组查询注意力 (GQA) 通过将键和值投影到几组查询头在 MHA 和 MQA 之间取得平衡如下图所示。在每个组中它的行为类似于多查询注意力。上图显示多头注意力有多个键值头左。「分组查询注意力中心的键值头多于一个但少于查询头的数量这是内存需求和模型质量之间的平衡」。多查询注意力右具有单个键值头有助于节省内存。最初使用 MHA 训练的模型可以使用原始训练计算的一小部分通过 GQA 进行“升级训练”。它们获得接近 MHA 的质量同时保持接近 MQA 的计算效率。「Llama 2 70B 是利用 GQA 的模型示例」。「MQA 和 GQA 等优化通过减少存储的key头和value头的数量来帮助减少 KV 缓存所需的内存」。 KV 缓存的管理方式可能仍然效率低下。与优化注意力模块本身不同下一节将介绍一种更高效的 KV 缓存管理技术。3.4 Flash attention优化注意力机制的另一种方法是修改某些计算的顺序以更好地利用 GPU 的内存层次结构。神经网络通常用层来描述大多数实现也以这种方式布局每次按顺序对输入数据进行一种计算。这并不总是能带来最佳性能因为对已经进入内存层次结构的更高、性能更高级别的值进行更多计算可能是有益的。在实际计算过程中将多个层融合在一起可以最大限度地减少 GPU 需要读取和写入内存的次数并将需要相同数据的计算分组在一起即使它们是神经网络中不同层的一部分。一种非常流行的融合是**「FlashAttention这是一种 I/O 感知精确注意算法」详细信息请参阅:https://arxiv.org/abs/2205.14135。精确注意力意味着它在数学上与标准多头注意力相同具有可用于多查询和分组查询注意力的变体因此可以无需修改即可交换到现有的模型架构甚至是已经训练的模型。I/O 感知意味着在将操作融合在一起时它会考虑前面讨论的一些内存移动成本。特别是「FlashAttention 使用“平铺”一次性完全计算并写出最终矩阵的一小部分而不是分步对整个矩阵进行部分计算写出中间值」**。上图显示了 40 GB GPU 上的平铺 FlashAttention 计算模式和内存层次结构。右图显示了对注意力机制的不同组件进行融合和重新排序所带来的相对加速。3.5 PageAttention有时KV 缓存会静态地“过度配置”(over-provisioned)以考虑最大可能的输入支持的序列长度因为输入的大小是不可预测的。例如如果模型支持的最大序列长度为 2,048则无论请求中输入和生成的输出的大小如何都将在内存中保留大小为 2,048 的数据。该空间可以是连续分配的并且通常其中大部分未被使用从而导致内存浪费或碎片。该保留空间在请求的生命周期内被占用。下图展示了由于过度配置和低效的 KV 缓存管理而导致的内存浪费和碎片。为此UC伯克利的研究人员受操作系统分页的启发提出了PagedAttention(https://arxiv.org/pdf/2309.06180)算法「PagedAttention 算法能够将连续的键和值存储在内存中的不连续空间中」。它将每个请求的 KV 缓存划分为代表固定数量token的块这些块可以不连续存储。在注意力计算期间使用根据记录索引获取这些块。当新的token产生时就会进行新的区块分配。这些块的大小是固定的消除了因不同请求需要不同分配等挑战而产生的低效率。这极大地限制了内存浪费从而实现了更大的批量大小从而提高了吞吐量。常用的vLLM推理框架就是采用的PagedAttention技术。5.模型优化技术到目前为止我们已经讨论了 LLM 消耗内存的不同方式、跨多个不同 GPU 分配内存的一些方式以及优化注意力机制和 KV 缓存。还有多种模型优化技术可以通过修改模型权重本身来减少每个 GPU 上的内存使用。 GPU 还具有专用硬件来加速这些修改值的运算从而为模型提供更多加速。5.1 量化Quantization「量化是降低模型权重和激活精度的过程」。大多数模型都以 32 或 16 位精度进行训练其中每个参数和激活元素占用 32 或 16 位内存单精度浮点。然而大多数深度学习模型可以用每个值八个甚至更少的位来有效表示。上图显示了一种可能的量化方法之前和之后的值分布。在这种情况下会丢失一些精度并且剪裁会丢失一些动态范围从而允许以更小的格式表示值。但是降低模型的精度可以带来多种好处。如果模型占用的内存空间较少则可以在相同数量的硬件上安运行更大的模型。「量化还意味着可以在相同的带宽上传输更多参数这有助于加速带宽有限的模型」。LLM 有许多不同的量化技术涉及降低激活、权重或两者的精度。量化权重要简单得多因为它们在训练后是固定的。然而这可能会留下一些性能问题因为激活仍然保持在更高的精度。 GPU 没有用于乘以 INT8 和 FP16 数字的专用硬件因此必须将权重转换回更高精度以进行实际运算。还可以量化激活、Transformer块和网络层的输入但这也有其自身的挑战。激活向量通常包含异常值有效地增加了它们的动态范围并使以比权重更低的精度表示这些值变得更具挑战性。一种选择是通过模型传递代表性数据集并选择以比其他激活更高的精度表示某些激活来找出这些异常值可能出现的位置 (LLM.int8())。另一种选择是借用易于量化的权重的动态范围并在激活中重用该范围。5.2 稀疏Sparsity与量化类似事实证明许多深度学习模型对于修剪或用 0 本身替换某些接近 0 的值具有鲁棒性。「稀疏矩阵是许多元素为 0 的矩阵」。这些矩阵可以用压缩形式表示比完整的稠密矩阵占用的空间更少。GPU 尤其具有针对某种结构化稀疏性的硬件加速其中每四个值中有两个由零表示。稀疏表示还可以与量化相结合以实现更大的执行速度。「寻找以稀疏格式表示大型语言模型的最佳方法仍然是一个活跃的研究领域」并为未来提高推理速度提供了一个有希望的方向。5.3 蒸馏Distillation缩小模型大小的另一种方法是通过称为蒸馏的过程将其知识转移到较小的模型。「此过程涉及训练较小的模型称为学生来模仿较大模型教师的行为」。蒸馏模型的成功例子包括 DistilBERT它将 BERT 模型压缩了 40%同时保留了 97% 的语言理解能力速度提高了 60%。虽然LLMs中的蒸馏是一个活跃的研究领域但神经网络的一般方法首次在论文Distilling the Knowledge in a Neural Network(https://arxiv.org/abs/1503.02531)中提出学生网络经过训练可以反映较大教师网络的性能使用损失函数来测量其输出之间的差异。该目标还可能包括将学生的输出与真实标签进行匹配的原始损失函数。匹配的教师输出可以是最后一层称为 logits或中间层激活。上图显示了知识蒸馏通用的总体框架(https://arxiv.org/pdf/2006.05525)。教师的 logits是学生使用蒸馏损失进行优化的软目标。其他蒸馏方法可能会使用其他损失措施来从老师那里“蒸馏”知识。「蒸馏的另一种方法是使用教师合成的数据对LLMs学生进行监督培训这在人工注释稀缺或不可用时特别有用」。一步一步蒸馏更进一步除了作为基本事实的标签之外还从LLMs教师那里提取基本原理。这些基本原理作为中间推理步骤以数据有效的方式培训规模较小的LLMs。值得注意的是当今许多最先进的LLMs都拥有限制性许可证禁止使用他们的成果来训练其他LLMs这使得找到合适的教师模型具有挑战性。6.模型服务技术模型执行通常受内存带宽限制特别是权重中的带宽限制。即使在应用了前面描述的所有模型优化之后它仍然很可能受到内存限制。因此在加载模型权重时尽可能多地处理它们。换句话说尝试并行。可以采取两种方法「动态批处理」(In-flight batching) 同时执行多个不同的请求。「预测推理」(Speculative inference) 并行执行序列的多个不同步骤以尝试节省时间。6.1 动态批处理In-flight batchingLLMs 具有一些独特的执行特征这些特征可能导致在实践中难以有效地处理批量请求。一个模型可以同时用于多种不同的任务。从聊天机器人中的简单问答响应到文档摘要或代码块的生成工作负载是高度动态的输出大小变化几个数量级。这种多功能性使得批处理请求并有效地并行执行它们变得具有挑战性这是服务神经网络的常见优化。这可能会导致某些请求比其他请求更早完成。为了管理这些动态负载「许多LLMs 服务解决方案包括一种称为连续或动态批处理的优化调度技术」。这利用了这样一个事实LLMs的整个文本生成过程可以分解为模型上的多次执行迭代。「通过动态批处理服务器运行时会立即从批处理中剔除已完成的序列而不是等待整个批处理完成后再继续处理下一组请求」。然后它开始执行新请求而其他请求仍在进行中。因此动态批处理可以极大地提高实际用例中 GPU 的整体利用率。6.2 预测推理Speculative inference预测推理也称为推测采样、辅助生成或分块并行解码是并行执行 LLM 的另一种方式。通常GPT 风格的大语言模型是自回归模型逐个生成文本标记。生成的每个标记都依赖于它之前的所有标记来提供上下文。这意味着在常规执行中「不可能从同一个序列并行生成多个token必须等待第 n 个token生成后才能生成 n1 个token」。上图为预测推理的示例其中临时模型临时预测并行验证或拒绝的多个未来步骤。在这种情况下临时模型中的前两个预测token被接受而最后一个在继续生成之前被拒绝并删除。预测性抽样提供了一种解决方法。「这种方法的基本思想是使用一些“更便宜”的过程来生成几个token长的临时序列」。然后并行执行多个步骤的主要“验证”模型使用廉价临时序列作为需要的执行步骤的“预测”上下文。如果验证模型生成与临时序列相同的token那么就知道接受这些token作为输出。否则可以丢弃第一个不匹配标记之后的所有内容并使用新的临时序列重复该过程。如何生成临时token有许多不同的选项每个选项都有不同的权衡。可以训练多个模型或在单个预训练模型上微调多个头以预测未来多个步骤的标记。或者可以使用小型模型作为临时模型使用更大、功能更强大的模型作为验证器。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】为什么要学习大模型我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年人才缺口已超百万凸显培养不足。随着AI技术飞速发展预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。大模型入门到实战全套学习大礼包1、大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通2、大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。3、AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。4、大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。5、大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。适用人群第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
收藏 | 保姆级教程:大模型推理优化技术,小白也能看懂并实践
本文深入解析了大模型推理优化技术从LLM推理的基本流程到批处理、KV缓存等关键优化策略再到模型并行、注意力机制优化如SDPA、MHA、MQA、GQA、FlashAttention、PageAttention等高级技术以及量化、稀疏、蒸馏等模型优化方法最后介绍模型服务技术中的动态批处理和预测推理。旨在帮助读者全面了解并掌握大模型推理优化的核心知识提升模型应用落地的效率与性能。1. 什么是LLM推理大多数流行的only-decode LLM例如 GPT-4、Qwen系列都是针对因果建模目标进行预训练的本质上是作为下一个词预测器。「这些 LLM 将一系列tokens作为输入并自回归生成后续tokens直到满足停止条件」例如生成tokens数量的限制或遇到停止词或直到生成特殊的end标记生成结束的tokens。该过程涉及两个阶段预填充阶段和解码阶段。请注意tokens是模型处理的语言的原子部分。一个tokens大约是四个英文字符。所有自然语言在输入模型之前都会转换为tokens。下图是大模型推理过程。1.1 预填充阶段Prefill在预填充阶段也可以理解为输入阶段。LLM处理输入token以计算中间状态keys和value用于生成“第一个”token。每个新的token都依赖于所有先前的token但由于输入的全部已知因此在运算上都是高度并行化矩阵运算可以有效地使用GPU。1.2 解码阶段Decode在解码阶段可以理解为输出阶段。LLM一次自回归生成一个输出token直到满足停止条件。「每个输出tokens都需要直到之前迭代的所有输出状态keys和values」。这与预填充输入处理相比就像矩阵向量运算未充分利用GPU计算能力。数据weights, keys, values, activations 从内存传输到GPU的速度决定了延迟而不是计算实际时间消耗。即这是一个内存限制操作。本文中的许多推理挑战和相应的解决方案都涉及此解码阶段的优化高效的注意力模块、有效管理键和值等。不同的LLMs可能使用不同的tokenizers因此比较它们之间的输出tokens可能并不简单。在比较推理吞吐量时即使两个 LLMs每秒输出的tokens相似如果它们使用不同的tokenizers也可能不相等。这是因为相应的tokens可能代表不同数量的字符。1.3 批处理Batching提高 GPU 利用率和有效吞吐量的最简单方法是通过批处理。由于多个请求使用相同的模型因此权重的内存成本被分散。「大批量数据传输到 GPU 一次处理将提高GPU资源的利用率。然而批量大小只能增加到一定限制此时可能会导致内存溢出」。为了防止这种情况发生需要查看键值 (KV) 缓存和 LLM 内存要求。传统批处理也称为静态批处理 static batching不是最佳的。这是因为对于批次中的每个请求LLM 可能会生成不同数量的tokens并且不同tokens有不同的执行时间。因此批次中的所有请求都必须等待最长token的处理完成而生成长度的巨大差异可能会加剧这种情况。有一些方法可以缓解这种情况例如稍动态批处理。1.4 KV缓存解码阶段的一种常见优化是 KV 缓存。解码阶段在每个时间步生成单个token但每个token依赖于之前token的键和值张量包括预填充时计算的输入tokens的 KV 张量以及当前时间步之前计算的任何新 KV 张量 。「为了避免在每个时间步重新计算所有tokens的这些张量可以将它们缓存在 GPU 内存中」。每次迭代当需要计算新token时它们都会被添加到正在运行的缓存中以便在下一次迭代中使用。在一些实现中模型的每一层都有一个KV缓存。下图展示了KV的缓存机制。1.5 大模型内存需求实际上LLM对GPU显存的需求主要是模型权重和KV缓存「模型权重」模型参数占用内存。例如具有 70 亿个参数的模型例如 Llama 2-7B 以 16 位精度FP16 或 BF16加载将占用大约7B * sizeof(FP16) ~ 14 GB的内存。「KV缓存」自注意力张量的缓存占用内存避免冗余计算。使用批处理时批处理中每个请求的 KV 缓存仍然必须单独分配并且可能会占用大量内存。下面的公式描述了 KV 缓存的大小适用于当今最常见的 LLM 架构。每个Token KV缓存字节2 * (num_layers) * (num_heads * dim_head) * precision_in_bytes第一个因子 2 代表K和V矩阵。通常(num_heads * dim_head)的值与Transformer的hidden_size或模型的维度d_model相同。这些模型属性通常可以在配置文件中找到。输入批次中输入序列中的每个tokens都需要此内存大小。假设半精度KV缓存的总大小由以下公式给出:总的Token KV缓存字节 (batch_size) * (sequence_length) * 2 * (num_layers) * (hidden_size) * sizeof(FP16)例如对于 16 位精度的 Llama 2-7B 模型批量大小为 1KV 缓存的大小将为 1 * 4096 * 2 * 32 * 4096 * 2 字节即约 2 GB。可以发现Llama 2-7B本身模型权重占用为14G单个输入序列长度4096需要缓存为2G这就需要16GB的显存要运行该模型可见单个显存的要求。为此如何高效的管理 KV 缓存就成为了一项重要的挑战。内存需求随着批量大小和序列长度线性增长它限制了可服务的吞吐量并对长上下文输入提出了挑战。这就是本文中介绍的多项优化背后的动机。2.模型并行「减少模型权重在每设备的显存占用的一种方法是将模型分布在多个 GPU 上。分散内存和计算可以运行更大的模型或更大批量的输入」。模型并行化是训练或推理模型所必需的模型并行化需要比单个设备更多的内存用来训练和推理延迟或者吐量。根据模型权重的划分方式有多种方法可以并行化模型。请注意数据并行也是一种经常在与下面列出的其他技术相同的技术。在这种情况下模型的权重被复制到多个设备上并且输入的全局批量大小在每个设备上被分成微批次。它通过处理较大的批次来减少总体执行时间。然而这是一种训练时间优化在推理过程中不太相关。2.1 Pipeline并行Pipeline并行化将模型垂直分片为块其中每个块包含在单独设备上执行的层的子集。下图展示了四路Pipeline其中模型按顺序分区并且所有层的四分之一子集在每个设备上执行。一个设备上的一组操作的输出被传递到下一个设备后者继续执行后续块。 和 分别表示设备 n 上的前向传播和后向传播。每个设备上存储模型权重的内存需求被分成四份。该方法的**「缺点是由于处理的顺序性质某些设备或层在等待前一层的输出激活、梯度时可能保持空闲状态」**。这会导致前向和后向传递效率低下或出现“Pipeline bubbles”。在上图b中白色空白区域是Pipeline并行性产生的Pipeline bubbles其中设备闲置且未得到充分利用。为了在一定时间内充分利用GPU可以通过微批处理的方式即分成多批一个GPU完成之后立马安排下一次计算但是这种方式可以在一定程度上缓解这种情况如图 2c 所示。输入的全局批次大小被分成了批次这些子批次被一一处理最后累积梯度。请注意 和 分别表示设备 n 上 m 批次的前向和后向传递。这种方法缩小了管道气泡的尺寸但并没有完全消除它们。2.2 Tensor并行Tensor并行化将模型的各个层水平分片为更小的、独立的计算块这些计算块可以在不同的设备上执行。Transformer的主要组成部分注意力块和多层感知器MLP层是可以利用Tensor并行化的。在多头注意力块中每个头或一组头可以分配给不同的设备以便它们可以独立且并行地计算。上图a显示了两层 MLP Tensor并行的示例每一层都由一个圆角框表示。在第一层中权重矩阵 分为 和 。对于输入 可以在同一批次不同设备上计算 和 其中是identity 操作。这将每个设备上存储权重的内存需求减半。归约操作 组合了第二层的输出。上图b是自注意力层中Tensor并行的示例。多个注意力头本质上是并行的并且可以跨设备分割。2.3 Sequence并行Tensor并行化是有局限性它需要将层划分为独立的、可管理的块不适用于 LayerNorm和 Dropout等操作而是在tensor并行中复制。虽然 LayerNorm和 Dropout的计算成本较低但它们确实需要大量内存来存储冗余激活。如Reducing Activation Recomputation in Large Transformer Models所示这些操作在输入序列中是独立的并且这些操作可以沿着“序列维度”进行分区从而提高内存效率。这称为序列并行性。模型并行技术不是唯一的可以结合使用。它们可以帮助扩展和减少 LLM 的每 GPU 内存占用量但也有专门针对注意力模块的优化技术。3.注意力机制优化缩放点积注意力 (SDPA scaled dot-product attention) 操作将query和key对映射到输出如论文Attention Is All You Need所述。3.1 多头注意力MHA作为 SDPA 的增强「三个变换张量对QKV分别进行线性变换这些变换不会改变原有张量的尺寸」使模型能够共同关注来自不同位置的不同表示子空间的信息。这些子空间是独立学习的使模型能够更丰富地理解输入中的不同位置。如下图所示缩放点积注意力左和多头注意力右多个并行注意力操作的输出被拼接后线性投影以组合起来。每个并行注意力层称为“头”这种方法称为多头注意力MHA。当使用八个并行注意力头时每个注意力头的维度都会减少例如。这使得计算成本与单头注意力相似。3.2 多查询注意力MQAMHA 的推理优化之一称为多查询注意力 (MQA)如 Fast Transformer Decoding 中提出的在多个注意力头之间共享键和值。与以前一样查询向量仍然被投影多次。虽然 MQA 中完成的计算量与 MHA 相同但从内存读取的数据量键、值只是以前的一小部分。「当受内存带宽限制时这可以实现更好的计算利用率」。它还减少了内存中 KV 缓存的大小为更大的批量大小留出了空间。「key头的减少会带来潜在的准确性下降」。此外需要在推理时利用这种优化的模型需要在启用 MQA 的情况下进行训练或至少使用大约 5% 的训练量进行微调。3.3 分组注意力GQA分组查询注意力 (GQA) 通过将键和值投影到几组查询头在 MHA 和 MQA 之间取得平衡如下图所示。在每个组中它的行为类似于多查询注意力。上图显示多头注意力有多个键值头左。「分组查询注意力中心的键值头多于一个但少于查询头的数量这是内存需求和模型质量之间的平衡」。多查询注意力右具有单个键值头有助于节省内存。最初使用 MHA 训练的模型可以使用原始训练计算的一小部分通过 GQA 进行“升级训练”。它们获得接近 MHA 的质量同时保持接近 MQA 的计算效率。「Llama 2 70B 是利用 GQA 的模型示例」。「MQA 和 GQA 等优化通过减少存储的key头和value头的数量来帮助减少 KV 缓存所需的内存」。 KV 缓存的管理方式可能仍然效率低下。与优化注意力模块本身不同下一节将介绍一种更高效的 KV 缓存管理技术。3.4 Flash attention优化注意力机制的另一种方法是修改某些计算的顺序以更好地利用 GPU 的内存层次结构。神经网络通常用层来描述大多数实现也以这种方式布局每次按顺序对输入数据进行一种计算。这并不总是能带来最佳性能因为对已经进入内存层次结构的更高、性能更高级别的值进行更多计算可能是有益的。在实际计算过程中将多个层融合在一起可以最大限度地减少 GPU 需要读取和写入内存的次数并将需要相同数据的计算分组在一起即使它们是神经网络中不同层的一部分。一种非常流行的融合是**「FlashAttention这是一种 I/O 感知精确注意算法」详细信息请参阅:https://arxiv.org/abs/2205.14135。精确注意力意味着它在数学上与标准多头注意力相同具有可用于多查询和分组查询注意力的变体因此可以无需修改即可交换到现有的模型架构甚至是已经训练的模型。I/O 感知意味着在将操作融合在一起时它会考虑前面讨论的一些内存移动成本。特别是「FlashAttention 使用“平铺”一次性完全计算并写出最终矩阵的一小部分而不是分步对整个矩阵进行部分计算写出中间值」**。上图显示了 40 GB GPU 上的平铺 FlashAttention 计算模式和内存层次结构。右图显示了对注意力机制的不同组件进行融合和重新排序所带来的相对加速。3.5 PageAttention有时KV 缓存会静态地“过度配置”(over-provisioned)以考虑最大可能的输入支持的序列长度因为输入的大小是不可预测的。例如如果模型支持的最大序列长度为 2,048则无论请求中输入和生成的输出的大小如何都将在内存中保留大小为 2,048 的数据。该空间可以是连续分配的并且通常其中大部分未被使用从而导致内存浪费或碎片。该保留空间在请求的生命周期内被占用。下图展示了由于过度配置和低效的 KV 缓存管理而导致的内存浪费和碎片。为此UC伯克利的研究人员受操作系统分页的启发提出了PagedAttention(https://arxiv.org/pdf/2309.06180)算法「PagedAttention 算法能够将连续的键和值存储在内存中的不连续空间中」。它将每个请求的 KV 缓存划分为代表固定数量token的块这些块可以不连续存储。在注意力计算期间使用根据记录索引获取这些块。当新的token产生时就会进行新的区块分配。这些块的大小是固定的消除了因不同请求需要不同分配等挑战而产生的低效率。这极大地限制了内存浪费从而实现了更大的批量大小从而提高了吞吐量。常用的vLLM推理框架就是采用的PagedAttention技术。5.模型优化技术到目前为止我们已经讨论了 LLM 消耗内存的不同方式、跨多个不同 GPU 分配内存的一些方式以及优化注意力机制和 KV 缓存。还有多种模型优化技术可以通过修改模型权重本身来减少每个 GPU 上的内存使用。 GPU 还具有专用硬件来加速这些修改值的运算从而为模型提供更多加速。5.1 量化Quantization「量化是降低模型权重和激活精度的过程」。大多数模型都以 32 或 16 位精度进行训练其中每个参数和激活元素占用 32 或 16 位内存单精度浮点。然而大多数深度学习模型可以用每个值八个甚至更少的位来有效表示。上图显示了一种可能的量化方法之前和之后的值分布。在这种情况下会丢失一些精度并且剪裁会丢失一些动态范围从而允许以更小的格式表示值。但是降低模型的精度可以带来多种好处。如果模型占用的内存空间较少则可以在相同数量的硬件上安运行更大的模型。「量化还意味着可以在相同的带宽上传输更多参数这有助于加速带宽有限的模型」。LLM 有许多不同的量化技术涉及降低激活、权重或两者的精度。量化权重要简单得多因为它们在训练后是固定的。然而这可能会留下一些性能问题因为激活仍然保持在更高的精度。 GPU 没有用于乘以 INT8 和 FP16 数字的专用硬件因此必须将权重转换回更高精度以进行实际运算。还可以量化激活、Transformer块和网络层的输入但这也有其自身的挑战。激活向量通常包含异常值有效地增加了它们的动态范围并使以比权重更低的精度表示这些值变得更具挑战性。一种选择是通过模型传递代表性数据集并选择以比其他激活更高的精度表示某些激活来找出这些异常值可能出现的位置 (LLM.int8())。另一种选择是借用易于量化的权重的动态范围并在激活中重用该范围。5.2 稀疏Sparsity与量化类似事实证明许多深度学习模型对于修剪或用 0 本身替换某些接近 0 的值具有鲁棒性。「稀疏矩阵是许多元素为 0 的矩阵」。这些矩阵可以用压缩形式表示比完整的稠密矩阵占用的空间更少。GPU 尤其具有针对某种结构化稀疏性的硬件加速其中每四个值中有两个由零表示。稀疏表示还可以与量化相结合以实现更大的执行速度。「寻找以稀疏格式表示大型语言模型的最佳方法仍然是一个活跃的研究领域」并为未来提高推理速度提供了一个有希望的方向。5.3 蒸馏Distillation缩小模型大小的另一种方法是通过称为蒸馏的过程将其知识转移到较小的模型。「此过程涉及训练较小的模型称为学生来模仿较大模型教师的行为」。蒸馏模型的成功例子包括 DistilBERT它将 BERT 模型压缩了 40%同时保留了 97% 的语言理解能力速度提高了 60%。虽然LLMs中的蒸馏是一个活跃的研究领域但神经网络的一般方法首次在论文Distilling the Knowledge in a Neural Network(https://arxiv.org/abs/1503.02531)中提出学生网络经过训练可以反映较大教师网络的性能使用损失函数来测量其输出之间的差异。该目标还可能包括将学生的输出与真实标签进行匹配的原始损失函数。匹配的教师输出可以是最后一层称为 logits或中间层激活。上图显示了知识蒸馏通用的总体框架(https://arxiv.org/pdf/2006.05525)。教师的 logits是学生使用蒸馏损失进行优化的软目标。其他蒸馏方法可能会使用其他损失措施来从老师那里“蒸馏”知识。「蒸馏的另一种方法是使用教师合成的数据对LLMs学生进行监督培训这在人工注释稀缺或不可用时特别有用」。一步一步蒸馏更进一步除了作为基本事实的标签之外还从LLMs教师那里提取基本原理。这些基本原理作为中间推理步骤以数据有效的方式培训规模较小的LLMs。值得注意的是当今许多最先进的LLMs都拥有限制性许可证禁止使用他们的成果来训练其他LLMs这使得找到合适的教师模型具有挑战性。6.模型服务技术模型执行通常受内存带宽限制特别是权重中的带宽限制。即使在应用了前面描述的所有模型优化之后它仍然很可能受到内存限制。因此在加载模型权重时尽可能多地处理它们。换句话说尝试并行。可以采取两种方法「动态批处理」(In-flight batching) 同时执行多个不同的请求。「预测推理」(Speculative inference) 并行执行序列的多个不同步骤以尝试节省时间。6.1 动态批处理In-flight batchingLLMs 具有一些独特的执行特征这些特征可能导致在实践中难以有效地处理批量请求。一个模型可以同时用于多种不同的任务。从聊天机器人中的简单问答响应到文档摘要或代码块的生成工作负载是高度动态的输出大小变化几个数量级。这种多功能性使得批处理请求并有效地并行执行它们变得具有挑战性这是服务神经网络的常见优化。这可能会导致某些请求比其他请求更早完成。为了管理这些动态负载「许多LLMs 服务解决方案包括一种称为连续或动态批处理的优化调度技术」。这利用了这样一个事实LLMs的整个文本生成过程可以分解为模型上的多次执行迭代。「通过动态批处理服务器运行时会立即从批处理中剔除已完成的序列而不是等待整个批处理完成后再继续处理下一组请求」。然后它开始执行新请求而其他请求仍在进行中。因此动态批处理可以极大地提高实际用例中 GPU 的整体利用率。6.2 预测推理Speculative inference预测推理也称为推测采样、辅助生成或分块并行解码是并行执行 LLM 的另一种方式。通常GPT 风格的大语言模型是自回归模型逐个生成文本标记。生成的每个标记都依赖于它之前的所有标记来提供上下文。这意味着在常规执行中「不可能从同一个序列并行生成多个token必须等待第 n 个token生成后才能生成 n1 个token」。上图为预测推理的示例其中临时模型临时预测并行验证或拒绝的多个未来步骤。在这种情况下临时模型中的前两个预测token被接受而最后一个在继续生成之前被拒绝并删除。预测性抽样提供了一种解决方法。「这种方法的基本思想是使用一些“更便宜”的过程来生成几个token长的临时序列」。然后并行执行多个步骤的主要“验证”模型使用廉价临时序列作为需要的执行步骤的“预测”上下文。如果验证模型生成与临时序列相同的token那么就知道接受这些token作为输出。否则可以丢弃第一个不匹配标记之后的所有内容并使用新的临时序列重复该过程。如何生成临时token有许多不同的选项每个选项都有不同的权衡。可以训练多个模型或在单个预训练模型上微调多个头以预测未来多个步骤的标记。或者可以使用小型模型作为临时模型使用更大、功能更强大的模型作为验证器。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】为什么要学习大模型我国在A大模型领域面临人才短缺,数量与质量均落后于发达国家。2023年人才缺口已超百万凸显培养不足。随着AI技术飞速发展预计到2025年,这一缺口将急剧扩大至400万,严重制约我国AI产业的创新步伐。加强人才培养,优化教育体系,国际合作并进是破解困局、推动AI发展的关键。大模型入门到实战全套学习大礼包1、大模型系统化学习路线作为学习AI大模型技术的新手方向至关重要。 正确的学习路线可以为你节省时间少走弯路方向不对努力白费。这里我给大家准备了一份最科学最系统的学习成长路线图和学习规划带你从零基础入门到精通2、大模型学习书籍文档学习AI大模型离不开书籍文档我精选了一系列大模型技术的书籍和学习文档电子版它们由领域内的顶尖专家撰写内容全面、深入、详尽为你学习大模型提供坚实的理论基础。3、AI大模型最新行业报告2025最新行业报告针对不同行业的现状、趋势、问题、机会等进行系统地调研和评估以了解哪些行业更适合引入大模型的技术和应用以及在哪些方面可以发挥大模型的优势。4、大模型项目实战配套源码学以致用在项目实战中检验和巩固你所学到的知识同时为你找工作就业和职业发展打下坚实的基础。5、大模型大厂面试真题面试不仅是技术的较量更需要充分的准备。在你已经掌握了大模型技术之后就需要开始准备面试我精心整理了一份大模型面试题库涵盖当前面试中可能遇到的各种技术问题让你在面试中游刃有余。适用人群第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】