推理优化是应用于生产环境的生成式人工智能应用中的关键部分。在大规模范围内高效使用大型语言模型是一个挑战,过去几年里已经开发出了许多技术来加快推理速度并降低成本。在本文中,我们将回顾这些技术。

A Focus On LLMs Architecture

大型语言模型(LLMs)均基于由瓦斯瓦尼等人于 2017 年发明的 Transformer 架构。该架构在各种语言任务中实现了卓越的准确性、少样本学习能力和接近人类的水平。然而,这些基础模型通常包含数十亿至数百亿个参数,训练成本高昂,在推理过程中资源需求也十分巨大。随着输入上下文的增加,推理成本会大幅上升,因为需要处理大量输入数据,这需要强大的计算能力。这使得高效推理成为一项关键挑战,尤其是在管理内存和计算资源方面。

在这里插入图片描述

在这里插入图片描述

更具体地说,大多数知名的大型语言模型都是仅具有解码功能的模型,例如 GPT-3、GPT-4、LLaMA、Mistral、DeepSeek 等。这些模型是在因果建模任务上进行预训练的,其功能类似于下一个词预测器。它们将一系列标记作为输入进行处理,并以自回归的方式生成后续标记,直到达到停止条件。

在仅使用解码器的模型中,LLM(语言模型)推理包含两个关键阶段:预填充阶段和解码阶段。在预填充阶段,模型处理输入标记以计算生成第一个新标记所需的中间状态(键和值)。这一阶段类似于矩阵与矩阵的运算,具有高度并行性,并能高效利用 GPU 能力。相反,解码阶段逐个生成标记,依赖于先前标记的状态。这一矩阵向量运算受内存限制,因为数据传输到 GPU 而非计算速度主要决定了延迟,从而导致 GPU 计算能力未得到充分利用。

优化解码阶段是解决推理难题的关键所在。其解决方案包括开发高效的注意力机制以及更好地管理键值对,以减少内存瓶颈。本文重点介绍了提高推理性能的实用方法,假设读者对 Transformer 架构和注意力机制有基本的了解。这些优化对于在实际的大型语言模型部署中提高吞吐量和降低延迟至关重要。

此外,由于不同语言模型使用了不同的分词器,这导致了分词的可比性受到影响。分词大致相当于四个英文字符,但其表示形式会因分词器的不同而有所差异,这使得对推理吞吐量(例如每秒的分词数量)的直接比较变得不准确。这种差异性凸显了需要标准化的评估指标,以便在推理过程中准确评估和比较语言模型的性能。

Batching

批处理是提高大型语言模型(LLM)中 GPU 利用率和吞吐量的关键策略。通过使用同一模型同时处理多个请求,批处理能够将模型权重的内存成本分配到各个请求中,从而使较大的批次能够利用更多的 GPU 计算能力。然而,批次大小存在一定的限制,因为过大的批次可能会由于 LLM 的内存需求(特别是与键值(KV)缓存相关的内存需求)而导致内存溢出(稍后会对此进行详细说明)。

在这里插入图片描述

在这里插入图片描述

传统的或静态的批处理方式存在局限性,因为一个批次内的请求通常会产生不同数量的完成令牌,从而导致执行时间各不相同。这会导致所有请求都要等待最慢的那个请求完成,当生成长度差异显著时,这种情况可能会带来问题。为了解决这个问题,已经开发出了诸如in-flight批处理等高级技术来优化性能。

in-flight 批处理,也被称为连续式批处理,能够应对大型语言模型工作负载的动态特性所带来的挑战。这些工作负载的规模可能从简单的聊天机器人回复到复杂的文档总结或代码生成不等。这些任务会产生大小差异极大的输出,使得并行高效地批处理和执行请求变得十分困难。与静态批处理不同,in-flight 批处理允许服务器立即从批处理中清除已完成的序列,并在其他请求仍在进行时开始处理新的请求。这种方法通过适应实际场景中请求的执行时间变化,显著提高了 GPU 的利用率。

Multi-GPU Deployment With Model Parallelization

模型并行化是管理大规模机器学习模型的内存和计算需求的关键策略,它通过将模型分布在多个 GPU 上来实现这一目的。这种方法能够处理超出单个设备内存容量的更大模型或输入批次,因此在内存限制严格的情况下,对于训练和推理都至关重要。存在多种分割模型权重的技术,包括管道并行、张量并行和序列并行,每种方法都针对模型分布的不同方面。与数据并行不同(数据并行侧重于在设备间复制模型权重以在训练期间处理更大的输入批次),这些方法更适用于在训练和推理过程中减少内存占用。

在这里插入图片描述

在这里插入图片描述

管道并行处理将模型纵向划分为一系列顺序的块,每个块包含一组被分配到单独设备的层。例如,在一个四路管道设置中,每个设备负责处理模型四分之一的层,并按顺序将输出传递给下一个设备。虽然这显著降低了每个设备的内存需求,但它引入了被称为“管道气泡”的低效现象,即设备在等待前一层的输出时可能会处于闲置状态。微批处理将输入批次分割成较小的子批次以进行顺序处理,可以减少这些“气泡”,但无法完全消除它们,因为在前向和后向传播过程中,闲置时间仍然存在。

相比之下,张量并行技术将单个层横向拆分为较小的计算块,这些计算块可以在不同设备上独立执行。这对于诸如注意力块和多层感知器(MLP)这样的 transformer 组件尤其有效,在这些组件中,例如不同的注意力头可以分配到不同的设备上进行并行计算。然而,张量并行在诸如 LayerNorm 和dropout操作等操作中效果较差,因为这些操作无法轻易分割,必须在不同设备上重复执行,从而导致用于存储激活值的内存使用出现冗余。这一局限性凸显了需要采用互补方法来优化内存效率的必要性。

序列并行性通过沿着输入序列维度对诸如层归一化和丢弃操作等操作进行划分来解决这些操作在内存使用方面的低效问题,利用了它们在序列元素之间的独立性。这种方法减少了冗余激活的内存占用,使其成为张量并行性的一个有价值的补充。这些并行化技术并非相互排斥,可以结合起来进一步优化大型语言模型(LLMs)。此外,针对注意力模块的特定优化策略可以提高可扩展性并减少每个 GPU 的内存需求,从而为大型模型实现更高效的训练和推理。

Attention Optimization

2017 年,瓦斯瓦尼等人发表的论文《Attention Is All You Need》介绍了 Transformer 模型,其中自注意力机制是其核心。自注意力使模型能够评估句子中不同单词之间的相关性,从而增强诸如自然语言处理等任务中的上下文理解能力。该论文对自注意力进行了规范,特别是通过了缩放点积注意力(SDPA)机制,该机制将查询和键值对映射为输出,使其成为现代神经网络中的关键组成部分。以下是优化注意力计算的一些最重要的技术:

多头注意力机制(MHA)是在 SDPA 的基础上发展而来的,它通过并行运行多个注意力操作来实现,每个操作都有不同的查询、键和值矩阵的投影。这些并行操作或“头”专注于不同的表示子空间,从而丰富了模型对输入的理解。这些“头”的输出被连接起来并进行线性投影,通过降低每个“头”的维度(例如,将模型维度除以“头”的数量,比如 8),保持了与单头注意力相同的计算效率。

多查询注意力机制(MQA)通过在多个注意力头之间共享关键值投影(同时保留多个查询投影),优化了多头注意力机制(MHA)在推理过程中的性能。这降低了内存带宽需求以及关键值-值(KV)缓存的大小,从而能够实现更大的批处理规模和更高的计算利用率。然而,MQA 可能会略微降低准确性,并且使用其的模型需要在训练或微调过程中启用 MQA 来保持性能。

分组查询注意力机制(GQA)通过将查询头进行分组,并在每个组内共享键值投影,实现了与多头自注意力机制(MHA)相当的性能,同时在计算效率方面又接近查询注意力机制(MQA)。像 Llama 2 70B 这样的模型采用了 GQA,而那些使用 MHA 训练的模型可以通过最少的额外训练即可适应 GQA。MQA 和 GQA 都降低了键值缓存内存需求,但缓存管理方面的进一步优化仍有必要。

FlashAttention 通过重新安排计算顺序来增强注意力机制,从而更有效地利用 GPU 内存层次结构。与传统的逐层处理方式不同,FlashAttention 将操作融合在一起,并使用“分块”技术一次性计算输出矩阵的小部分,从而最大程度地减少内存读/写操作。这种对输入/输出敏感的精确注意力算法能够无缝地集成到现有模型中,无需进行任何修改,通过优化数据移动实现了显著的性能提升。

Key-Value Caching

KV 缓存是一种在大型语言模型(LLM)解码阶段使用的关键优化技术,旨在提高自注意力计算的效率。在这一阶段,每个生成的标记都依赖于所有先前标记的键(K)和值(V)张量,包括在预填充阶段和后续解码步骤中计算出的那些。与在每个时间步对每个标记重新计算这些张量不同,KV 缓存会将它们存储在 GPU 内存中,并在计算出新的张量时将其添加到缓存中。通常,模型的每个层都会维护一个单独的 KV 缓存,这大大减少了冗余计算,并加快了解码过程。

在这里插入图片描述

在这里插入图片描述

在 GPU 上运行大型语言模型(LLMs)所需的内存主要由两个部分决定:模型权重和键值缓存(KV 缓存)。模型权重由模型的参数组成,占据了大量内存;例如,像 Llama 2 7B 这样具有 70 亿参数的模型,在 16 位精度下大约需要 14GB 的内存。而 KV 缓存则用于存储自注意力张量以避免重复计算,其大小取决于诸如层数、注意力头数、头维度和精度等因素。对于每个标记,缓存大小的计算公式为 2 * num_layers * (num_heads * dim_head) * precision_in_bytes,其中 2 这个系数同时涵盖了 K 和 V 矩阵。对于一批输入,总 KV 缓存大小会随着批次大小和序列长度而变化,可能会达到相当大的规模,例如对于一个序列长度为 4096、批次大小为 1 的 Llama 2 7B 模型,KV 缓存大小约为 2GB。

由于 KV 缓存的容量会随着批次大小和序列长度的增加而呈线性增长,这给其管理带来了挑战,可能会限制吞吐量并使处理长上下文输入变得复杂。常见的低效之处在于静态过度预留的情况,即无论实际输入大小如何,都会为最大支持的序列长度(例如 2048 个标记)预留内存。这会导致严重的内存浪费或碎片化,因为预留的空间中往往有大量空间在请求的整个生命周期内都处于闲置状态,从而占用宝贵的 GPU 内存资源。

为解决这些效率低下的问题,PagedAttention 算法引入了一种受操作系统分页机制启发的新方法。它将 KV 缓存划分为固定大小的块,每个块代表一定数量的标记,这些标记可以非连续地存储在内存中。一个块表跟踪这些块,在注意力计算过程中根据需要调用它们。随着新标记的生成,会动态分配更多的块。这种方法通过消除对连续分配和过度预留的需求,最大限度地减少了内存浪费,从而能够实现更大的批处理规模并提高吞吐量,因此在为 LLM 管理 KV 缓存内存方面是一项重大的进步。

Model Optimization

在本节中,我们将探讨用于优化大型语言模型(LLM)的各种技术,以降低其内存消耗并提升在 GPU 上的性能。主要方法包括量化、稀疏化和蒸馏,每种方法针对模型效率的不同方面。这些技术会修改模型权重,利用 GPU 硬件加速,并将知识转移至更小的模型,从而使大型模型能够在有限的硬件上运行,同时保持性能。这些方法可能会降低模型的准确性,因此使用时应谨慎。

量化会降低模型权重和激活值的精度,通常会从 32 位或 16 位降低到 8 位或更少位,这样可以减少模型占用的内存,并更高效地传输数据。由于权重在训练完成后是固定的,因此量化权重的过程相对简单;而激活值由于存在异常值从而扩大了其动态范围,所以量化激活值的过程则更为复杂。例如,LLM.int8() 这种技术通过有选择地对某些激活值应用更高的精度,或者利用量化权重的动态范围来重复使用该范围来解决这一问题,不过 GPU 在执行操作时可能需要将权重转换回更高精度的值。

稀疏性涉及剔除接近零的模型值,从而生成需要更少内存的稀疏矩阵。GPU 支持结构化稀疏性,例如将每四个值中的两个表示为零,这能加快计算速度。将稀疏性与量化相结合还能进一步提高执行速度。研究仍在探索针对大型语言模型的最佳稀疏表示方式,这为提高推理速度开辟了一条有前景的途径。

蒸馏技术将知识从一个较大的“教师”模型传递到一个较小的“学生”模型中,既能缩小模型的规模,又能保持其性能。例如,DistilBERT 与 BERT 相比,实现了 40% 的规模缩减和 60% 的速度提升,同时保留了 97% 的功能。蒸馏可以包括模仿教师的输出或使用教师生成的数据进行训练,比如“逐步蒸馏法”就包含了高效学习的原理说明。然而,许多高级语言模型的严格许可限制了适合用于蒸馏的教师模型的可用性。

Speculative Inference

推测性推理,又称推测性采样或辅助生成,是一种用于并行执行自回归大型语言模型(如 GPT 类型模型)的方法,这类模型通常逐个生成文本字符。在标准执行过程中,每个字符都依赖于所有先前的字符作为上下文,这使得并行生成变得不可能,因为第 n 个字符必须在第 (n+1) 个字符之前生成。推测性推理解决了这一问题,它使用一个“成本更低”的草稿模型来同时预测多个后续字符,然后由主模型并行地对其进行验证或否定,从而实现更快的文本生成。

该过程包括使用一种资源消耗较少的方法生成若干标记的续篇草案,然后由主模型利用该草案作为推测性上下文进行并行验证。如果验证模型与草案中的标记相匹配,则这些标记被接受;否则,不匹配的标记及其后续标记将被丢弃,然后以新的草案重新开始该过程。草案标记可以通过多种方法生成,例如训练多个模型、对预训练模型的多个头进行微调以预测未来标记,或者使用较小的草案模型与一个更大、更强大的验证模型一起使用,每种方法都有其自身的优缺点。

Disaggregated Inference

“分解式推理”是一种将计算任务分散到不同硬件上的技术,旨在优化性能、成本和资源使用。具体而言,它将预填充和解码阶段分开处理。通过将这些阶段进行分解,每个阶段都可以分配给最适合其计算需求的硬件,从而提高效率和可扩展性。

在这里插入图片描述

在这里插入图片描述

预填充是一项计算密集型任务,需要进行大量的矩阵乘法运算来处理整个输入提示并生成键值缓存。这一阶段得益于像 GPU 或 TPU 这样的高性能硬件,它们在并行计算方面表现出色。由于预填充是每次推理请求时的一次性任务,因此可以将其卸载到专门针对此类工作负载进行优化的集中式强大计算节点上。这种设置能够加快对大型提示的处理速度,并减轻性能较弱设备的负担,使其非常适合在具有高吞吐量硬件的云环境或数据中心环境中使用。

相比之下,解码则依赖于内存,并涉及迭代的令牌生成过程,很大程度上依赖于访问键值缓存。它所需的计算能力较少,但需要快速的内存访问,因此适用于性能较弱、注重内存优化的硬件,如中央处理器(CPU)或边缘设备。将解码转移到独立的硬件上——可能更靠近最终用户,例如内部服务器或边缘设备——使分布式推理降低了延迟和网络带宽需求。这种分离使得部署更加灵活,预填充在高端云服务器上进行,而解码则在本地或边缘设备上进行,从而优化资源分配,并为实时聊天机器人或交互式人工智能系统等应用实现高效扩展。

Conclusion

近来,为了提升大型语言模型的性能,已经发明了许多推理优化技术。

要实现这些技术,需要对 LLM 架构以及所使用的硬件有深入的了解,因此通常使用已经实现了这些技术的现有推理引擎会更简便,比如 vLLM、TensorRT-LLM、LMDeploy 等。

这里给大家精心整理了一份全面的AI大模型学习资源包括:AI大模型全套学习路线图(从入门到实战)、精品AI大模型学习书籍手册、视频教程、实战学习、面试题等,资料免费分享

👇👇扫码免费领取全部内容👇👇
在这里插入图片描述

1. 成长路线图&学习规划

要学习一门新的技术,作为新手一定要先学习成长路线图方向不对,努力白费

这里,我们为新手和想要进一步提升的专业人士准备了一份详细的学习成长路线图和规划。可以说是最科学最系统的学习成长路线。
在这里插入图片描述

2. 大模型经典PDF书籍

书籍和学习文档资料是学习大模型过程中必不可少的,我们精选了一系列深入探讨大模型技术的书籍和学习文档,它们由领域内的顶尖专家撰写,内容全面、深入、详尽,为你学习大模型提供坚实的理论基础(书籍含电子版PDF)

在这里插入图片描述

3. 大模型视频教程

对于很多自学或者没有基础的同学来说,书籍这些纯文字类的学习教材会觉得比较晦涩难以理解,因此,我们提供了丰富的大模型视频教程,以动态、形象的方式展示技术概念,帮助你更快、更轻松地掌握核心知识

在这里插入图片描述

4. 2026行业报告

行业分析主要包括对不同行业的现状、趋势、问题、机会等进行系统地调研和评估,以了解哪些行业更适合引入大模型的技术和应用,以及在哪些方面可以发挥大模型的优势。

5. 大模型项目实战

学以致用 ,当你的理论知识积累到一定程度,就需要通过项目实战,在实际操作中检验和巩固你所学到的知识,同时为你找工作和职业发展打下坚实的基础。

在这里插入图片描述

6. 大模型面试题

面试不仅是技术的较量,更需要充分的准备。

在你已经掌握了大模型技术之后,就需要开始准备面试,我们将提供精心整理的大模型面试题库,涵盖当前面试中可能遇到的各种技术问题,让你在面试中游刃有余。

在这里插入图片描述

7. 资料领取:全套内容免费抱走,学 AI 不用再找第二份

不管你是 0 基础想入门 AI 大模型,还是有基础想冲刺大厂、了解行业趋势,这份资料都能满足你!
现在只需按照提示操作,就能免费领取:

👇👇扫码免费领取全部内容👇👇
在这里插入图片描述

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐