大语言模型高效推理知多少?三万字长文带你揭开神秘面纱(数据级、模型级和系统级) 精华
论文链接:https://arxiv.org/pdf/2404.14294.pdf
大语言模型(LLMs)因其在各种任务中表现出色而受到广泛关注。然而,LLM推理所需的大量计算和内存资源对于在资源受限场景中部署提出了挑战。该领域的努力集中在开发旨在提高LLM推理效率的技术上。本文对现有文献中关于高效LLM推理的内容进行了全面调研。首先分析了导致LLM推理低效的主要原因,即大模型大小、二次复杂度的注意力操作和自回归解码方法。然后,本文引入了一个全面的分类法,将当前的文献组织成数据级、模型级和系统级优化。此外,本文还包括对关键子领域中代表性方法的比较实验,以提供定量洞见。最后,本文提供了一些知识总结,并讨论了未来的研究方向。
介绍
近年来,大语言模型(LLMs)引起了学术界和工业界的广泛关注。LLMs领域经历了显着增长和重大成就。出现了许多开源的LLMs,包括GPT系列(GPT-1 、GPT-2 、GPT-3 和 GPT-4)、OPT 、LLaMA系列(LLaMA 、LLaMA 2 、Baichuan 2 、Vicuna 、LongChat )、BLOOM 、FALCON 、GLM 和Mistral ,它们被用于学术研究和商业用途。LLMs的成功源于它们在处理各种任务方面的强大能力,例如神经语言理解(NLU)、神经语言生成(NLG)、推理和代码生成,从而使得像ChatGPT、Copilot和Bing这样有影响力的应用成为可能。有人认为LLMs的崛起和成就标志着人类迈向人工通用智能(AGI)迈出了重要的一步。
然而,LLMs的部署并不总是顺利的。如下图1所示,LLMs在推理过程中通常需要更高的计算成本、内存访问成本和内存使用量(本文将分析根本原因),这会降低资源受限情景下的效率指标(例如延迟、吞吐量、功耗和存储)。这给边缘和云场景中LLMs的应用带来了挑战。例如,巨大的存储需求使得在个人笔记本电脑上部署一个拥有70亿参数的模型对于开发辅助等任务是不切实际的。此外,低吞吐量将导致如果LLMs用于每个搜索引擎请求,将会产生巨大的成本,从而导致搜索引擎的利润大幅减少。
幸运的是,已经有大量的技术来实现LLMs的高效推理。为了全面了解现有研究并激发进一步的研究,本调研采用了分层分类和对当前高效LLMs推理领域的系统总结。具体来说,本文将相关研究分为三个层面:数据级优化、模型级优化和系统级优化。此外,本文对关键子领域内具有代表性的方法进行了实验分析,以巩固知识、提供实用建议,并为未来的研究工作提供指导。
目前,已经有几项关于高效大型语言模型(LLMs)的调研研究。这些调研主要集中在LLMs效率的不同方面,但仍有进一步改进的机会。[17],[18]和[19]集中在模型级别优化中的模型压缩技术。[20]关注于从数据和模型架构两个角度考虑的效率研究。[21]从机器学习系统(MLSys)研究的角度探讨了高效LLM推理。
与此相反,本文的调研提供了更全面的研究范围,涵盖了在三个层面上的优化:数据级别、模型级别和系统级别,并包括了最近的进展。而[22]和[23]也提供了高效LLM研究的全面回顾,本文的工作通过结合比较实验,并根据关键子领域的实验分析提供实用见解和建议,进一步拓展了这方面的研究。这些调研的比较总结在下表1中。
本调研的剩余部分结构如下:第2部分介绍了LLMs的基本概念和知识,并详细分析了LLMs推理过程中的效率瓶颈。第3部分展示了本文的分类法。第4部分到第6部分分别介绍和讨论了在三个不同层面上的效率优化研究。第7部分对几个关键应用场景进行了更广泛的讨论。第8部分总结了本调研提供的关键贡献。
前置知识
大语言模型的Transformer类型
语言建模作为语言模型(LMs)的基本功能,涉及对单词序列的可能性建模和预测后续单词的分布。近年来,研究人员发现,扩展语言模型不仅增强了它们的语言建模能力,还产生了处理更复杂任务的新能力,超越了传统的自然语言处理任务。这些扩展的语言模型被称为大型语言模型(LLMs)。
主流的LLMs是基于Transformer架构设计的。具体来说,典型的Transformer架构由若干个堆叠的Transformer块组成。通常,一个Transformer块由一个多头自注意力(MultiHead Self-Attention (MHSA))块、一个前馈神经网络(Feed Forward Network (FFN))和一个层归一化( LayerNorm (LN))操作组成。对于每个块,它接收前一个块的输出特征作为输入,并通过每个子模块传递特征以获得输出。特别地,在第一个块之前,使用分词器将原始输入句子转换为token序列,接着的embedding层用于将token转换为输入特征。然后,将额外的位置embedding添加到输入特征中以编码每个输入token的顺序。
其中,dk是查询(键)的维度。注意,自注意力操作包含矩阵乘法操作,其计算复杂度随输入长度的增加呈二次增长。最后,MHSA块将所有注意力头的特征连接起来,并对它们应用线性投影,形成其输出 Z ,如公式3所示:
其中Wo是投影矩阵,自注意力机制使模型能够识别不同输入部分的重要性,而不受距离的限制,因此可以捕捉输入句子中的长距离依赖关系和复杂关系。 在Transformer块中的另一个重要模块是FFN。通常,FFN位于MHSA块之后,由两个线性转换层和一个非线性激活函数组成。它接收来自MHSA块的输出特征 X ,并对其进行处理,如下所示:
其中, 和 表示两个线性层的权重矩阵, 表示激活函数。
LLM的推理过程
最流行的LLM,即仅解码器的LLM,通常采用自回归方法来生成输出句子。具体来说,自回归方法逐个生成token。在每个生成步骤中,LLM将整个token序列作为输入,包括输入token和先前生成的token,并生成下一个token。随着序列长度的增加,生成过程的时间成本呈指数增长。为了解决这一挑战,引入了一种关键技术,即键-值(KV)缓存,以加速生成过程。KV缓存技术涉及在多头自注意力(MHSA)块中存储和重用先前的键(K)和值(V)对。由于其显著优化了生成延迟,这种技术已被广泛采用于LLM推理引擎和系统中。基于上述方法和技术,LLM的推理过程可以分为两个阶段:
- 预填阶段:LLM计算并存储初始输入token的KV缓存,并生成第一个输出token,如下图2(a)所示。
- 解码阶段:LLM使用KV缓存逐个生成输出token,然后使用新生成的token的键(K)和值(V)对更新它,如下图2(b)所示。
如下图3所示,本文说明了一些关键的效率指标。对于延迟,本文将首个token延迟表示为在预填阶段生成第一个输出token的延迟,而将每个输出token延迟表示为解码阶段生成一个输出token的平均延迟。
此外,本文使用生成延迟来表示生成整个输出token序列的延迟。至于内存,本文使用模型大小来表示存储模型权重所需的内存,并使用KV缓存大小来表示存储KV缓存所需的内存。此外,峰值内存表示在生成过程中的最大内存使用量,大致等于模型权重和KV缓存的内存总和。除了延迟和内存之外,吞吐量在LLM服务系统中也是一个广泛使用的指标。本文使用token吞吐量来表示每秒生成的token数,并使用请求吞吐量来表示每秒完成的请求数。
效率分析
在资源受限的情况下部署LLM并保留其强大的能力对于从业者和研究人员都是一个重大挑战。例如,考虑部署一个包含70亿参数的LLaMA-2-70B模型。将其权重存储为FP16格式需要140GB的VRAM,至少需要6个RTX 3090Ti GPU(每个GPU具有24GB VRAM)或2个NVIDIA A100 GPU(每个GPU具有80GB VRAM)进行推理。至于延迟,在2个NVIDIA A100 GPU上生成一个token大约需要100毫秒。因此,生成数百个token的序列需要超过10秒的时间。
除了存储和延迟之外,还需要考虑效率指标,如吞吐量、能耗和功耗。在LLM推理过程中,三个重要因素将主要影响这些指标,即计算成本、内存访问成本和内存使用。Yuan等人提供了更系统的分析,通过屋顶线模型来展示这些因素如何影响推理的低效性。接下来,本文将进一步分析LLM推理过程中的三个低效根本原因,重点关注上述三个关键因素:
- 模型大小:主流的LLM通常包含数十亿甚至数万亿个参数。例如,LLaMA-70B模型包含70亿个参数,而GPT-3模型的规模达到1750亿个参数。这个庞大的模型大小在LLM推理过程中显著增加了计算成本、内存访问成本和内存使用率。
- 注意力操作:在预填充阶段,自注意力操作在输入长度上表现出二次计算复杂度。因此,随着输入长度的增加,注意力操作的计算成本、内存访问成本和内存使用量迅速增加。
- 解码方法:自回归解码方法逐个生成token。在每个解码步骤中,所有模型权重都从芯片外的HBM加载到GPU芯片上,导致大量的内存访问成本。此外,KV缓存的大小随着输入长度的增加而增加,可能导致内存碎片化和不规则的内存访问模式。
分类法
在前面的讨论中,本文确定了在LLM推理过程中显著影响效率的关键因素(即计算成本、内存访问成本和内存使用),并进一步分析了三个根本原因(即模型大小、注意力操作和解码方法)。许多工作已经从不同的角度对推理效率进行了优化。通过仔细审查和总结这些研究,本文将它们分类为三个层面,即数据级优化、模型级优化和系统级优化(如下图4所示):
- 数据级优化是指通过优化输入prompt(即输入压缩)或更好地组织输出内容(即输出组织)来提高效率。这种优化通常不会改变原始模型,因此不需要进行昂贵的模型训练(请注意,可能需要对辅助模型进行少量训练,但与原始LLM的训练成本相比,这个成本可以忽略不计)。
- 模型级优化是指在推理过程中设计高效的模型结构(即高效结构设计)或对预训练模型进行压缩(即模型压缩),以提高其效率。这种优化通常需要昂贵的预训练或较少量的微调成本来保留或恢复模型的能力,并且通常会损失模型的性能。
- 系统级优化是指优化推理引擎或服务系统。这种优化不涉及昂贵的模型训练,并且通常不会损失模型性能。此外,本文在后面的部分简要介绍了硬件加速器设计。
数据级优化
在数据级别,先前的研究可以分为两类,即输入压缩和输出组织。输入压缩技术直接缩短模型输入以减少推理成本。而输出组织技术通过组织输出内容的结构实现批量(并行)推理,这可以提高硬件利用率并减少生成延迟。
输入压缩
在LLM的实际应用中,prompt至关重要。许多研究提出了有效设计prompt的新方法,并在实践中表明,精心设计的prompt可以释放LLM的能力。例如,In-Context Learning (ICL) 建议在prompt中包含多个相关示例。这种方法鼓励 LLM 通过类比进行学习。Chain-of-Thought (CoT) 提议在上下文示例中包含一系列中间推理步骤,这有助于LLM进行复杂的推理。然而,这些prompt技术不可避免地导致了更长的prompt,这带来了挑战,因为在预填充阶段计算成本和内存使用量呈二次增加。 为了解决这一挑战,已经提出了输入prompt压缩以缩短prompt,而不显著影响LLM的答案质量。在这个领域内,相关研究被分类为四组,如下图5所示:prompt微调,prompt摘要,基于软prompt的压缩,以及检索增强生成。
prompt微调
prompt微调的核心思想是基于预定义或可学习的重要性指标,从每个输入prompt中在线删除不重要的token、句子或文档。DYNAICL 提出了一种通过训练良好的基于LLM的元控制器动态决定给定输入的上下文示例的最佳数量的方法,该方法是根据计算预算决定的。
Selective Context 提出将token合并为单元,然后根据自信息指标(即负对数似然)进行单元级prompt修剪。STDC 基于解析树对prompt进行修剪,它迭代地删除造成修剪后性能下降最小的短语节点。PCRL 引入了基于强化学习的token级修剪方案。PCRL背后的主要思想是通过将忠实度和压缩比率合并到奖励函数中来训练一个策略LLM。忠实度是指压缩prompt和原始prompt之间的输出相似度。RECOMP 实现了一种基于句子级的修剪策略,用于压缩检索增强语言模型(RALM)的prompt。该方法涉及使用预训练编码器将输入问题和文档编码成潜在embedding。然后,它根据文档embedding与问题embedding的相似度决定要删除哪些文档。
LLMLingua 引入了一个用于prompt压缩的由粗到细的修剪方案。最初,它进行演示级修剪,然后根据困惑度进行token级修剪。为了提高性能,LLMLingua提出了一个动态分配修剪预算到prompt不同部分的预算控制器。此外,它利用一个迭代的token级压缩算法来解决条件独立性假设引入的不准确性。此外,LLMLingua还采用了一个分布对齐策略,将目标LLM的输出分布与用于困惑度计算的较小LLM进行对齐。LongLLMLingua在LLMLingua的基础上进行了几项增强:
(1)它利用输入问题条件的困惑度作为prompt修剪的指标。
(2)它为不同的演示分配不同的修剪比率,并根据其指标值重新排列最终prompt内的演示。
(3)它根据响应恢复原始内容。CoT-Influx 引入了一种用于通过强化学习进行粗到细的修剪的方法,该方法用于Chain-of-Thought (CoT)prompt。具体而言,它首先修剪不重要的示例,然后在剩余示例中修剪不重要的token。
prompt摘要
prompt摘要的核心思想是将原始prompt压缩成更短的摘要,同时保留相似的语义信息。这些技术也可以作为prompt的在线压缩方法。与前述的prompt修剪技术相比,后者保持未修剪的token不变,而这一方法将整个prompt转换为其摘要。RECOMP 引入了一种抽象压缩器,它将输入问题和检索到的文档作为输入,并生成简洁的摘要。具体而言,它从极端规模的LLM中提取轻量级压缩器来执行摘要。SemanticCompression 提出了一种语义压缩方法。它首先将文本分解为句子。然后,它按主题将句子分组,并在每个组内对句子进行摘要。
基于软prompt的压缩
这类压缩技术的核心思想是为LLMs设计一个软prompt,其长度明显比原始prompt短,以用作LLMs的输入。软prompt被定义为一系列可学习的连续token。一些技术采用离线压缩来处理固定前缀prompt(例如,系统prompt、任务特定prompt)。例如,PromptCompression训练了一个软prompt来模拟一个预先确定的系统prompt。该方法涉及在输入token之前添加几个软token,并在反向传播期间使这些软token能够进行调整。
在prompt数据集上进行微调后,软token序列用作软prompt。Gisting 提出了一种将任务特定prompt压缩成简洁的要点token集的方法,该方法使用前缀调优 。鉴于任务特定prompt在不同任务之间存在差异,前缀调优针对每个任务单独应用。为了增强效率,Gisting 进一步引入了一种元学习方法,该方法根据以前任务的要点token来预测新任务的要点token。 其他技术采用在线压缩来处理每个新的输入prompt。例如,AutoCompressors 训练一个预训练的语言模型,通过无监督学习将prompt压缩成摘要向量。ICAE 训练一个自动编码器将原始上下文压缩成短记忆槽。具体来说,ICAE 使用一个经过 LoRA 改编的语言模型作为编码器,并使用目标语言模型作为解码器。一组记忆token被添加到输入token之前,并被编码成记忆槽。
检索增强生成(RAG)
检索增强生成(RAG)旨在通过整合外部知识源来提高LLM响应的质量。RAG也可以被视为一种处理大量数据时提高推理效率的技术。与将所有信息合并到过长的prompt中不同,RAG只将相关的检索到的信息添加到原始prompt中,确保模型接收到必要的信息同时显著减少prompt长度。FLARE 使用即将到来的句子的预测来主动决定何时以及获取什么信息。REPLUG 将LLM视为黑盒子,并使用可调整的检索模型增强它。它将检索到的文档添加到冻结的黑盒LLM的输入之前,并进一步利用LLM监督检索模型。自我RAG 通过检索和自我反思来增强LLM的质量和事实性。它引入了反思token,在推理阶段使LLM可控。
输出组织
传统的LLMs生成过程完全是顺序的,导致时间消耗显著。输出组织技术旨在通过组织输出内容的结构来(部分)并行生成。
骨架思维(SoT)在这个方向上是开创性的。SoT背后的核心思想是利用LLMs规划输出内容结构的新兴能力。具体而言,SoT包括两个主要阶段。
在第一阶段(即骨架阶段)中,SoT指导LLM使用预定义的“骨架prompt”生成答案的简洁骨架。例如,对于问题 “中国菜的典型类型是什么?”,在这个阶段的输出将是一个菜品列表(例如,面条、火锅、米饭),而没有详细的描述。
然后,在第二阶段(即点展开阶段),SoT指导LLM同时扩展骨架中的每个点,使用“点扩展prompt”,然后将这些扩展连接起来形成最终答案。当应用于开源模型时,点扩展可以通过批量推理来执行,这优化了硬件利用率,并使用相同的计算资源减少了总体生成延迟。为了减轻额外的计算开销(即,骨架prompt和点扩展prompt带来的额外开销),SoT讨论了跨多个点的点展开阶段的共同prompt前缀的KV缓存共享的可能性。
此外,SoT使用路由模型来决定是否针对特定问题应用SoT,旨在将其使用限制在适当的情况下。因此,SoT在最近发布的12个LLMs上实现了高达2.39倍的加速,并通过提高答案的多样性和相关性改善了许多问题的答案质量。
SGD 进一步扩展了SoT的思想,通过将子问题点组织成有向无环图(DAG),并在一个回合中并行回答逻辑无关的子问题。与SoT类似,SGD还利用了LLMs生成输出结构的新兴能力,通过提供手工制作的prompt以及几个示例来实现。SGD放宽了不同点之间的严格独立假设,以提高答案的质量,特别是对于数学和编程问题。与SoT相比,SGD更注重答案质量而不是速度。此外,SGD引入了一种自适应模型选择方法,根据估计的复杂性为每个子问题分配一个最佳模型大小,从而进一步提高了效率。
APAR 采用了与SoT类似的思想,利用LLMs输出特殊的控制token来自动和动态地触发并行解码。为了有效利用输出内容中的固有可并行化结构并准确生成控制token,APAR在特定树结构中精心设计的数据上对LLMs进行了微调。结果,APAR在基准测试和案例中实现了平均1.4∼2.0倍的加速,并对答案质量产生了可忽略的影响。此外,APAR将其解码方法与推测解码技术(即 Medusa)和服务系统(即 vLLM )相结合,以进一步提高推理延迟和系统吞吐量。
SGLang 引入了一种特定领域的Python领域特定语言(DSL),其特点是具有灵活的原语,可促进LLM编程。SGLang背后的核心思想是自动分析各种生成调用之间的依赖关系,并根据这种分析进行批量推理和KV缓存共享。借助这种语言,用户可以轻松实现各种prompt策略,并从SGLang的自动效率优化(例如,SoT,ToT )中受益。此外,SGLang引入并结合了几种系统级编译技术,例如代码移动和预取注释。
知识、建议和未来方向
对于越来越多需要处理长输入和生成长输出的LLM的需求,突显了数据级优化技术的重要性。在这些技术中,输入压缩方法主要旨在通过减少与注意力操作相关的计算和内存成本,从而增强预填充阶段。此外,对于基于API的LLM,这些方法可以降低与输入token相关的API成本。相比之下,输出组织方法侧重于通过减轻与自回归解码方法相关的巨大内存访问成本,优化解码阶段。
随着LLM的能力越来越强大,有潜力利用它们来压缩输入prompt或组织输出内容。最近在输出组织方法方面的进展展示了利用LLM将输出内容组织成独立点或依赖图的有效性,有助于通过批量推理改善生成延迟。这些方法利用了输出内容内在的可并行化结构,使LLM能够进行并行解码,提高硬件利用率,从而降低端到端的生成延迟。
最近,出现了各种各样的promptpipeline 和agent框架。尽管这些创新提升了LLM的能力,但也扩展了输入的长度,导致了增加的计算成本。为了解决这一挑战,采用输入压缩技术来减少输入长度显示出了解决方案的潜力。
与此同时,这些pipeline 和框架自然地将更多并行性引入输出结构中,为跨不同解码线程的并行解码和键值(KV)缓存共享提供了增加的潜力。SGLang 支持灵活的LLM编程,并为前端和后端的协同优化提供了机会,为该领域的进一步扩展和改进奠定了基础。总之,数据级优化,包括输入压缩和输出组织技术,在可预见的未来将变得越来越重要以提高效率。除了优化现有框架的效率外,某些研究还专注于直接设计更高效的agent框架。例如,FrugalGPT 提出了一个由不同大小的LLM组成的模型级联,如果模型对答案达到了足够的确定性,推理过程将提前停止。该方法旨在通过利用分层模型架构和基于模型置信度估计的智能推理终止来实现效率。与模型级动态推理技术相比,FrugalGPT在pipeline级别上执行动态推理。
模型级优化
LLM高效推理的模型级优化主要集中在优化模型结构或数据表示上。模型结构优化涉及直接设计高效的模型结构,修改原始模型并调整推理时的架构。在数据表示优化方面,通常采用模型量化技术。
在本节中,本文根据它们需要的额外训练成本将模型级优化技术分为不同类别。第一类涉及设计更高效的模型结构(称为高效结构设计)。使用此方法开发的模型通常需要从头开始训练。第二类着重于压缩预训练模型(称为模型压缩)。此类压缩模型通常只需要进行最少量的微调以恢复其性能。
高效结构设计
目前,最先进的LLM通常采用Transformer架构,正如在前面讨论的那样。然而,基于Transformer的LLM的关键组件,包括前馈网络(FFN)和注意力机制,在推理过程中存在效率挑战。本文将原因归结如下:
- FFN在Transformer-based LLMs中占据了相当大的模型参数比例,导致在解码阶段特别是在内存访问成本和内存使用方面存在显著的挑战。例如,在LLaMA-7B模型中,FFN模块占参数的63.01%,而在LLaMA-70B模型中占71.69%。
- 注意力机制在输入长度方面表现出二次复杂度,导致处理更长的输入内容时存在显著的计算成本和内存使用。
为了解决这些效率挑战,一些研究集中于开发更高效的模型结构。本文将这些研究分为三组(如下图7所示):高效的FFN设计、高效的注意力设计和Transformer替代方案。
高效的FFN设计
在这个领域,许多研究集中于将MoE技术集成到LLM中,以增强它们的性能同时保持计算成本。MoE的核心思想是动态分配不同的计算预算给不同的输入token。在基于MoE的Transformer中,多个并行的前馈网络(FFN),即专家,与可训练的路由模块一起使用。在推理过程中,模型通过路由模块选择性地激活特定的专家来处理每个token。
一些研究集中在构建FFN专家上,主要集中在优化获取专家权重的过程或使这些专家更轻量化以提高效率。例如,MoEfication 设计了一种方法,将非MoE LLM转换为MoE版本,使用其预训练的权重。这种方法消除了对MoE模型昂贵的预训练的需求。
为了实现这一点,MoEfication首先将预先训练的LLM的FFN神经元划分为多个组。在每个组内,神经元通常由激活函数同时激活。然后,它将每组神经元重组为一个专家。Sparse Upcycling 提出了一种直接从密集模型的检查点初始化基于MoE的LLM权重的方法。在这种方法中,MoE-based LLM中的专家是来自密集模型的FFN的精确副本。通过采用这种直接初始化,Sparse Upcycling可以有效地训练MoE模型以实现高性能。MPOE提出通过矩阵乘积运算符(MPO)分解来减少基于MoE的LLM的参数。这种方法涉及将FFN的每个权重矩阵分解为包含通用信息的全局共享张量和一组捕获专门特征的局部辅助张量。
另一条研究线集中在改进MoE模型内部的路由模块(或策略)的设计。在先前的MoE模型中,路由模块常常引起负载不平衡问题,这意味着一些专家被分配了大量的token,而其他专家只处理了少量token。这种不平衡不仅浪费了未充分利用的专家的能力,降低了模型的性能,而且降低了推理效率。
当前的MoE实现通常使用批量矩阵乘法同时计算所有FFN专家。这要求每个专家的输入矩阵必须具有相同的形状。然而,由于存在负载不平衡问题,需要将这些未充分利用的专家的输入token集进行填充以满足形状约束,导致计算的浪费。因此,路由模块设计的主要目标是实现MoE专家之间的token分配的更好平衡。
Switch Transformers 在最终损失函数中引入了额外的损失,即负载平衡损失,以惩罚路由模块的不平衡分配。这个损失被公式化为token分配分数向量和均匀分布向量之间的缩放点积。因此,只有当token分配在所有专家之间平衡时,损失才最小化。这种方法鼓励路由模块将token均匀分配给各个专家,促进负载平衡,最终提高模型的性能和效率。BASE 以端到端的方式为每个专家学习一个embedding,然后根据它们的embedding相似性将专家分配给token。为了确保负载平衡,BASE制定了一个线性分配问题,并利用拍卖算法高效地解决这个问题。
Expert Choice 引入了一种简单而有效的策略,以确保MoE-based模型内的完美负载平衡。与之前将专家分配给token的方法不同,Expert Choice允许每个专家基于它们的embedding相似性独立选择前k个token。这种方法确保每个专家处理固定数量的token,即使每个token可能分配给不同数量的专家。
除了上述集中在模型体系结构本身的研究之外,还有一些研究致力于改进基于MoE的模型的训练方法。SE-MoE 引入了一种称为路由z损失的新辅助损失,旨在增强模型的训练稳定性而不影响性能。SE-MoE发现,路由模块中softmax操作引入的指数函数可能加剧舍入误差,导致训练不稳定。
为解决这个问题,路由z损失惩罚输入到指数函数中的大logits,从而在训练过程中最小化舍入误差。StableMoE 指出了MoE-based LLMs中存在的路由波动问题,即在训练和推理阶段的专家分配的不一致性。对于相同的输入token,在训练过程中,它被分配给不同的专家,但在推理时只激活一个专家。
为解决这个问题,StableMoE提出了一种更一致的训练方法。它首先学习一个路由策略,然后在模型主干训练和推理阶段保持不变。SMoE-Dropout 为基于MoE的LLMs设计了一种新颖的训练方法,该方法提议在训练过程中逐渐增加激活的专家数量。这种方法增强了MoE-based模型在推理和下游微调中的可扩展性。GLaM 对一系列具有不同参数大小的模型进行了预训练和发布,展示了它们在少样本任务上与密集LLMs相当的性能。这个家族中最大的模型参数大小高达1.2万亿。Mixtral 8x7B 是一个引人注目的最近发布的开源模型。在推理过程中,它仅利用了130亿个活跃参数,并且在不同的基准测试中相比LLaMA-2-70B模型取得了优越的性能。Mixtral 8x7B在每个层中都包含8个Feed-Forward Network (FFN)专家,每个token在推理过程中分配给两个专家。
高效的注意力设计
Attention操作是Transformer架构中的一个关键组件。然而,它与输入长度的二次复杂度导致了大量的计算成本、内存访问成本和内存使用量,特别是在处理长上下文时。为了解决这个问题,研究人员正在探索更有效的方法来近似原始Attention操作的功能。这些研究可以大致分为两个主要分支:多查询注意力和低复杂度注意力。
多查询注意力(MQA) 通过在不同注意力头之间共享键(K)和值(V)缓存来优化注意力操作。这种策略有效地减少了推理过程中的内存访问成本和内存使用量,有助于提高Transformer模型的效率。
正如前面介绍的,Transformer风格的LLMs通常采用多头注意力(MHA)操作。该操作在解码阶段需要为每个注意力头存储和检索K和V对,导致内存访问成本和内存使用量显著增加。MQA通过在不同头之间使用相同的K和V对,同时保持不同的查询(Q)值来解决了这一挑战。通过广泛的测试,已经证明MQA显著减少了内存需求,对模型性能的影响很小,使其成为提高推理效率的关键策略。
MQA的概念进一步扩展为分组查询注意力(GQA),可以看作是MHA和MQA的结合体。具体而言,GQA将注意力头分组,为每个组存储一组K和V值。这种方法不仅维持了MQA减少内存开销的好处,还提供了更好的推理速度和输出质量之间的平衡。
- 低秩注意力技术对 K 和 V 矩阵的 token 维度(即 n)进行压缩,将其压缩到较小的固定长度(即 k)后再进行注意力计算。这种方法的基本思路是,n × n 的注意力矩阵通常具有低秩特性,因此在 token 维度上对其进行压缩是可行的。这一系列研究的主要重点是设计有效的压缩方法,其中 X 可以是上下文矩阵或 K 和 V 矩阵。
LRT 建议同时对注意力块和 FFN 进行低秩变换,以进一步提高计算效率。FLuRKA 将低秩变换和注意力矩阵的核化结合起来,进一步提高了效率。具体来说,它首先减小了 K 和 V 矩阵的 token 维度,然后将核函数应用于 Q 和低秩 K 矩阵。
随后,常规注意力,称为解包注意力,将注意力应用于原始 Q 矩阵和压缩的 K 和 V 矩阵。额外的查询矩阵可以是可学习参数或从前几层获取的。Set Transformer 通过引入一个固定长度的诱导点向量设计了类似的技术。与之前压缩 K 和 V 的工作不同,Funnel-Transformer 使用池化操作逐渐压缩 Q 矩阵的序列长度。
Transformer替代方案
除了应用高效的技术来处理注意力操作之外,最近的研究还创新设计了高效而有效的序列建模架构。下表2比较了一些代表性的非Transformer模型的效率。这些架构在训练和推理期间都表现出与序列长度相关的次二次计算复杂度,使得LLMs能够显著增加其上下文长度。
在这个研究领域中,有两条显著的研究路线受到了广泛关注。一条研究路线集中在状态空间模型(SSM)上,该模型将序列建模形式化为基于HiPPO理论的递归变换。另外,其他研究主要集中在使用长卷积或设计类似注意力的公式来建模序列。
状态空间模型。状态空间模型(SSM)已经在某些自然语言处理(NLP)和计算机视觉(CV)任务中展现出了竞争性的建模能力。与基于注意力的Transformer相比,SSM对于输入序列长度表现出线性的计算和内存复杂度,这提高了它处理长上下文序列的效率。在本调研中,SSM指的是一系列满足以下两个属性的模型架构:
(1)它们基于HiPPO 和LSSL 提出的以下公式来对序列进行建模:
另一方面的研究旨在基于 SSM 设计更好的模型架构。GSS 和 BiGS 将门控注意单元(GAU)与 SSM 结合。具体地,它们将 GAU 中的注意力操作替换为 SSM 操作。BST 将 SSM 模型与引入了强烈的局部归纳偏差的 Block Transformer 结合起来。H3 发现 SSM 在回忆早期token和跨序列比较token方面较弱。
为此,它提出在标准 SSM 操作之前添加一个 shift SSM 操作,该操作用于将输入token直接转移到状态中。MambaFormer 将标准 Transformer 和 SSM 模型结合起来,通过用 SSM 层替换 Transformer 中的 FFN 层实现。Jamba 提出了另一种结合 Transformer 和 SSM 模型的方法,将四个 Transformer 层添加到一个 SSM 模型中。DenseMamba 探索了传统 SSM 中隐藏状态退化的问题,并在 SSM 架构中引入了密集连接,以保留模型深层中的细粒度信息。BlackMamba 和 MoE-Mamba 提出了使用专家混合技术来增强 SSM 模型,以优化训练和推理效率,同时保持模型性能。
其他替代方案。除了 SSMs 外,还有一些其他高效替代方案也受到了广泛关注,包括长卷积和类似注意力的循环操作。长卷积已经在一些研究中用于长序列建模。这些努力主要集中在卷积参数的参数化上。例如,Hyena 通过浅的前馈神经网络 (FFN) 对长卷积进行隐式参数化。此外,它还引入了逐元素的乘法门控制参数化的输入数据。
近期的一些研究在建模长序列时应用了长卷积。这些研究主要集中在优化卷积核的参数化。例如,Hyena 使用浅层前馈神经网络 (FFN) 对长卷积进行了数据相关的参数化方法。其他研究旨在设计具有与注意力操作相似形式的操作,但可以以循环方式进行,从而实现高效的训练和推理。例如,RWKV 建立在 AFT 的基础上,后者提出用以下方程替换 Transformer 模型中的注意力操作:
效率分析。 本文在表2中对几种创新且代表性的非Transformer架构的计算和内存复杂性进行了分析和比较。就训练时间而言,许多研究(例如S4、Hyena、RetNet)旨在通过采用卷积或注意力等训练形式来保留训练并行性。值得注意的是,Mamba利用并行扫描技术处理输入序列,从而也利用了训练并行性。
另一方面,在推理阶段,大多数研究选择循环架构,以保持预填充阶段的线性计算复杂性,并在解码阶段保持对上下文长度的不可知性。此外,在解码阶段,这些新颖的架构消除了缓存和加载先前token特征的需求(类似于基于Transformer的语言模型中的键-值缓存),从而节省了大量的内存访问成本。
模型压缩
模型压缩涵盖了一系列旨在通过修改其数据表示(例如量化)或更改其架构(例如稀疏化、结构优化和动态推理)来增强预训练模型的推理效率的技术,如下图8所示。
量化
量化是一种广泛采用的技术,通过将模型的权重和激活从高位宽表示转换为低位宽表示,来降低LLMs的计算和内存成本。具体来说,许多方法涉及将FP16张量量化为低位整数张量,可以表示为如下形式:
在接下来的内容中,本文首先进行效率分析,以说明量化技术如何降低LLM的端到端推理延迟。随后,本文分别对两种不同的量化工作流程进行详细介绍:后训练量化(PTQ)和量化感知训练(QAT)。
效率分析。如前文所讨论的,LLM的推理过程涉及两个阶段:预填充阶段和解码阶段。在预填充阶段,LLMs通常处理长的token序列,主要操作是一般矩阵乘法(GEMM)。预填充阶段的延迟主要受限于由高精度CUDA核心执行的计算。为了解决这个挑战,现有方法将权重和激活量化,以使用低精度Tensor核心加速计算。如下图9(b)所示,激活量化在每次GEMM操作之前在线执行,允许使用低精度Tensor核心(例如,INT8)进行计算。这种量化方法称为权重-激活量化。
相比之下,在解码阶段,LLMs每次生成步骤只处理一个token,核心操作为一般矩阵-向量乘法(GEMV)。解码阶段的延迟主要受到大型权重张量的加载的影响。为了解决这个挑战,现有方法专注于仅对权重进行量化,以加速内存访问。这种方法称为仅权重量化,它涉及对权重进行离线量化,然后将低精度权重解量化为FP16格式进行计算,如上图9(a)所示。
后量化训练。后量化训练(PTQ)涉及对预先训练的模型进行量化,无需重新训练,这可能是一个昂贵的过程。虽然PTQ方法在较小的模型上已经得到了很好的研究,但直接将现有的量化技术应用于LLMs存在挑战。这主要是因为与较小的模型相比,LLMs的权重和激活通常表现出更多的异常值,并且具有更广泛的分布范围,这使得它们的量化更具挑战性。
总之,LLMs的复杂性,其特征是尺寸和复杂性,需要专门的方法来有效处理量化过程。LLMs中异常值和更广泛的分布范围的存在需要开发量身定制的量化技术,可以考虑这些独特的特征,而不影响模型的性能或效率。
众多研究集中于开发有效的量化算法来压缩LLM(大型语言模型)。本文在下表3中对代表性算法进行了综合,按照四个维度进行了分类。关于量化张量的类型,某些研究集中在仅对权重进行量化,而许多其他研究则侧重于对权重和激活进行量化。
值得注意的是,在LLM中,KV缓存代表了影响内存和内存访问的独特组件。因此,一些研究提出了KV缓存量化。关于量化格式,大多数算法采用统一格式,以便进行简单的硬件实现。关于确定量化参数(例如,尺度、零点),大多数研究依赖于从权重或激活值派生的统计数据。然而,一些研究主张基于重构损失搜索最佳参数。此外,某些研究建议在量化过程之前或期间更新未量化的权重(称为量化值更新)以提高性能。
在仅对权重进行量化方面,GPTQ 代表了LLM量化的早期进展,它基于传统算法OBQ 。OBQ利用每行权重矩阵的重建误差相对于未量化权重的Hessian矩阵的优化量化顺序。在每个量化步骤之后,OBQ通过迭代调整未量化权重来减少重建误差。然而,量化过程中频繁更新Hessian矩阵会增加计算复杂度。
GPTQ通过采用统一的从左到右顺序来量化每一行,从而避免了对Hessian矩阵进行广泛更新的需求,从而简化了这个过程。这种策略通过仅在量化一行时计算Hessian矩阵,然后利用计算结果来加速整个量化过程,显著减少了计算需求。
LUT-GEMM 提出了一种利用查找表(LUT)的新型去量化方法,旨在通过减少去量化开销来加速量化LLM的推理过程。此外,它采用了一种非均匀量化方法,称为二进制编码量化(BCQ),其中包含可学习的量化间隔。
AWQ 观察到权重通道在性能方面的重要性不同,特别强调与激活中的异常值对齐的输入通道。为了增强关键权重通道的保留,AWQ采用了一种重新参数化方法。这种技术通过网格搜索选择重新参数化系数,以有效地减少重建误差。
OWQ 观察到与激活异常值相关的权重量化的困难。为了解决这一挑战,OWQ采用了混合精度量化策略。该方法确定权重矩阵中的弱列,并将更高精度分配给这些特定权重,而将其余权重量化为较低精度级别。
SpQR 介绍了一种方法,其中通过量化识别权重异常值,并为其分配更高的精度,而其余权重量化为3位。
SqueezeLLM 提出将异常值存储在全精度稀疏矩阵中,并对剩余权重进行非均匀量化。非均匀量化的值是基于量化敏感度确定的,这有助于改善量化模型的性能。
QuIP 引入了LDLQ,一种用于二次agent目标的最优自适应方法。研究表明,确保权重和Hessian矩阵之间的非相关性可以增强LDLQ的有效性。QuIP利用LDLQ,并通过使用随机正交矩阵乘法实现非相关性。
FineQuant 利用启发式方法确定每列量化的粒度,结合实验获得的经验性见解设计了一种量化方案。
QuantEase 建立在GPTQ的基础上。在量化每一层时,它提出了一种基于坐标下降的方法,以更精确地补偿未量化的权重。此外,QuantEase可以利用GPTQ的量化权重作为初始化,并进一步改进补偿过程。
LLM-MQ 以FP16格式保护权重异常值,并将它们存储在压缩稀疏行(CSR)格式中以进行高效计算。此外,LLM-MQ将每个层的比特宽度分配建模为一个整数规划问题,并使用高效的求解器在几秒钟内解决它。此外,LLM-MQ设计了一个高效的CUDA内核来集成去量化运算符,从而在计算过程中减少内存访问成本。
对于权重-激活量化,ZeroQuant 采用更精细的粒度对权重和激活进行量化,利用核融合来最小化量化过程中的内存访问成本,并进行逐层知识蒸馏来恢复性能。
FlexGen 直接将权重和KV缓存量化为INT4,以减少推理时大批量大小的内存占用。
LLM.int8() 发现激活中的异常值集中在一小部分通道中。利用这一洞察力,LLM.int8()将激活和权重分为两个不同的部分,基于输入通道中的异常值分布来最小化激活中的量化误差。同时含有异常值的通道,无论在激活还是权重中,都以FP16格式存储,而其他通道则以INT8格式存储。
SmoothQuant 采用重新参数化技术来解决激活值量化的挑战。该方法引入了一个缩放因子,扩大了权重通道的数据范围,同时缩小了相应激活通道的数据范围。
ZeroQuant 为权重引入了一种分组量化策略,为激活引入了一种基于token的量化方法。在此方法基础上,ZeroQuantV2 提出了LoRC(低秩补偿)技术,采用低秩矩阵来减少量化不准确性。RPTQ 发现不同激活通道的分布存在较大变化,这给量化带来了挑战。为了缓解这个问题,RPTQ将具有相似激活分布的通道重新组织成簇,并在每个簇内独立地应用量化。
OliVe 观察到与异常值相邻的正常值不太重要。因此,它将每个异常值与一个正常值配对,以牺牲后者来实现对异常值更广泛的表示范围。OS+ 观察到异常值的分布集中且不对称,给LLM量化带来了挑战。为了解决这个问题,OS+引入了一种基于通道的移位和缩放技术,旨在缓解这些挑战。移位和缩放参数通过搜索过程确定,以有效处理集中和不对称的异常值分布。
ZeroQuant-FP 研究了将权重和激活值量化为FP4和FP8格式的可行性。研究表明,将激活值量化为浮点类型(FP4和FP8)相对于整数类型产生了更好的结果。Omniquant 与依赖于量化参数经验设计的先前方法不同。相反,它优化了权重裁剪的边界和等效变换的缩放因子,以最小化量化误差。QLLM 通过实施通道重组来解决异常值对量化的影响。此外,它引入了可学习的低秩参数,以减少量化后模型中的量化误差。
Atom 采用了混合精度和动态量化的策略来处理激活。值得注意的是,它将这种方法扩展到将KV缓存量化为INT4,以提高吞吐性能。LLM-FP4 致力于将整个模型量化为FP4格式,并引入了一种预偏移指数偏差技术。这种方法将激活值的缩放因子与权重结合起来,以解决异常值带来的量化挑战。BiLLM 是迄今为止最低比特PTQ的努力之一。
BiLLM确定了权重的钟形分布和权重Hessian矩阵的异常长尾分布。基于此,它提出根据Hessian矩阵将权重分为显著值和非显著值,并将它们分别进行二值化。因此,BiLLM可以将LLM广泛量化为1.08位,而不会显著降低困惑度。
KVQuant 提出了一种用于KV缓存量化的非均匀量化方案,通过在校准集上离线推导出最优数据类型。
KIVI 提出了一种免调优的2位KV缓存量化算法,它采用了基于组的按通道量化用于键缓存,以及按token量化用于值缓存的方法。Li等人进行了彻底的评估,以评估量化对不同张量类型(包括KV缓存)、不同任务、11个LLM系列和SOTA量化方法的影响。
量化感知训练。量化感知训练(QAT)将量化的影响纳入模型训练过程中。通过集成模拟量化效果的层,这种方法促进了权重对量化引起的误差的调整,从而提高了任务性能。然而,训练LLM通常需要大量的训练数据和相当的计算资源,这可能成为QAT实施的潜在瓶颈。因此,当前的研究努力集中在降低训练数据需求或减轻与QAT实施相关的计算负担的策略上。
为了减少数据需求,LLM-QAT引入了一种无需数据的方法,通过使用原始的FP16 LLM来生成训练数据。具体来说,LLM-QAT使用词汇表中的每个token作为起始token来生成句子。基于生成的训练数据,LLM-QAT应用了一种基于蒸馏的工作流程,将量化的LLM训练成与原始的FP16 LLM的输出分布相匹配。Norm Tweaking将起始token的选择限制为仅限于在具有最高比例的前几种语言类别中列出的语言类别。这种策略可以有效地提高量化模型在不同任务上的泛化能力。
为了降低计算成本,许多方法采用参数高效调整(PEFT)策略来加速量化感知训练(QAT)。QLoRA将LLM的权重量化为4位,随后使用LoRA在BF16中对每个4位权重矩阵进行微调。QLoRA能够在仅有30GB内存的一个GPU上高效微调一个包含65B参数的LLM。QA-LoRA提议将分组量化整合到QLoRA中。作者观察到,QLoRA中的量化参数数量显著小于LoRA参数的数量,导致量化和低秩适应之间存在不平衡。他们建议通过增加专门用于量化的参数数量来解决这个问题。
此外,QA-LoRA可以将LoRA项合并到相应的量化权重矩阵中。LoftQ认为,在QLoRA中用零初始化LoRA矩阵对下游任务效率低下。作为替代方案,LoftQ建议使用原始FP16权重与量化权重之间差异的奇异值分解(SVD)来初始化LoRA矩阵。LoftQ迭代地应用量化和SVD来实现对原始权重更准确的近似。Norm Tweaking建议在量化后训练LayerNorm层,并使用知识蒸馏来匹配量化模型的输出分布与FP16模型的输出分布,从而实现类似LLM-QAT的效果,同时避免高昂的训练成本。
对比实验和分析。这一部分进行实验评估,以评估在不同场景下使用仅权重量化技术所实现的加速效果。具体而言,本文专注于两个广泛使用的大型语言模型(LLMs),LLaMA-2-7B 和 LLaMA-2-13B,并使用 AWQ 算法将它们的权重量化为 4 位。随后,将这些量化模型部署到单个 NVIDIA A100 GPU 上,使用两种不同的推理框架:TensorRT-LLM 和 LMDeploy。然后,评估这些框架在不同输入序列(具有不同的批处理大小和上下文长度)下所实现的加速效果。
本文将预填充延迟、解码延迟和端到端延迟的加速效果总结如下表4 所示。从结果可以得出几个关键观察:
(1) 仅权重量化可以显著加速解码阶段,从而提高端到端延迟。这种改进主要来自于从高带宽内存 (HBM) 更快加载具有低精度权重张量的量化模型的能力,正如前面的"效率分析"部分所述。因此,这种方法显著降低了内存访问开销。
(2) 就预填充阶段而言,仅权重量化可能实际上会增加延迟。这是因为预填充阶段的瓶颈是计算成本而不是内存访问成本。因此,仅量化权重而不涉及激活函数对延迟的影响很小。此外,正如图9 所示,仅权重量化需要将低精度权重解量化为 FP16,从而导致额外的计算开销,因此减慢了预填充阶段的速度。
(3) 随着批处理大小和输入长度的增加,仅权重量化所实现的加速效果逐渐减弱。这主要是因为,随着批处理大小和输入长度的增加,计算成本所占的比例变得更大。虽然仅权重量化主要减少了内存访问成本,但随着更大的批处理大小和输入长度,其对延迟的影响变得不那么显著,因为计算需求变得更加突出。
(4) 仅权重量化对更大的模型提供了更大的好处,因为与更大模型大小相关的内存访问开销更大。随着模型的复杂性和大小增长,存储和访问权重所需的内存量成比例增加。通过量化模型权重,仅权重量化有效地减少了这种内存占用和内存访问开销。
稀疏化
稀疏化是一种压缩技术,它增加了数据结构中诸如模型参数或激活的零值元素的比例。这种方法旨在通过在计算过程中高效地忽略零元素来降低计算复杂度和内存使用量。在LLM的背景下,稀疏化通常应用于权重参数和注意力激活。这导致了权重修剪策略和稀疏注意力机制的发展。
权重微调系统地删除模型中不太关键的权重和结构,旨在在填充阶段和解码阶段降低计算和内存成本,而不显著影响性能。这种稀疏化方法分为两种主要类型:非结构化修剪和结构化修剪。这种分类是基于修剪过程的粒度,如下图10所示。
非结构化修剪以细粒度修剪单个权重值。与结构化修剪相比,它通常在对模型预测影响最小的情况下实现更高级别的稀疏性。然而,通过非结构化修剪实现的稀疏模式缺乏高级别的规则性,导致内存访问和计算模式不规则。这种不规则性可能会显著阻碍硬件加速的潜力,因为现代计算架构是针对密集、规则的数据模式进行优化的。因此,尽管非结构化修剪实现了更高水平的稀疏性,但在硬件效率和计算加速方面的实际益处可能有限。
这一研究方向的共同关注点是微调标准,包括权重重要性和修剪比例。考虑到LLMs的庞大参数规模,提高微调效率也至关重要。一种微调标准是最小化模型的重构损失。
SparseGPT 是这一领域的代表性方法。它遵循了OBS 的思想,考虑了去除每个权重对网络重构损失的影响。OBS迭代地决定一个微调mask来修剪权重,并对未微调的权重进行重构以补偿微调损失。SparseGPT通过最优部分更新技术克服了OBS的效率瓶颈,并设计了一种基于OBS重构误差的自适应mask选择技术。
Prune and Tune 通过在微调过程中进行最小训练步骤的微调,改进了SparseGPT。ISC 通过结合OBS 和OBD 中的显著性标准设计了一种新颖的微调标准。它根据Hessian信息为每个层分配非均匀的修剪比例。BESA 通过梯度下降学习可微的二进制mask,通过最小化重构误差顺序地决定每个层的修剪比例。另一种流行的微调标准是基于大小的。Wanda 建议使用权重大小和输入激活的范数之间的元素乘积作为微调标准。
RIA 通过使用相对重要性和激活的度量来联合考虑权重和激活,评估每个权重元素的重要性。此外,RIA将非结构化的稀疏模式转换为结构化的N:M稀疏模式,可以在NVIDIA GPU上实现实际加速。此外,OWL 专注于决定每个层的微调比例。它根据每个层的激活异常值比例分配微调比例。
结构化微调剔除模型的较大结构单元,如整个通道或层,与非结构化修剪相比,操作粒度更粗。由于这些方法与传统硬件平台优化处理的密集、规则数据模式一致,它们直接促进了推理速度的提升。然而,结构化微调的粗粒度通常会对模型性能产生更显著的影响。这一研究方向的微调标准还会强制执行结构化微调模式。
LLM-Pruner 提出了一种与任务无关的结构化微调算法。具体来说,它首先根据神经元之间的连接依赖性识别LLM中的耦合结构。然后,它根据设计良好的基于组的微调度量决定要移除哪些结构组。微调后,它进一步提出通过参数高效的训练技术(即 LoRA )恢复模型性能。
Sheared LLaMA 提出将原始LLM修剪到现有预训练LLM的特定目标架构。此外,它设计了动态批量加载技术以提高后续训练的性能。ZipLM 迭代地识别并修剪了在损失和运行时间之间取得最差折衷的结构组件。
LoRAPrune 提出了一个针对预训练LLMs的带有LoRA模块的结构化修剪框架,以实现基于LoRA的模型的快速推理。它设计了一个LoRA引导的修剪标准,使用LoRA的权重和梯度,以及一个基于该标准的迭代修剪方案,以移除不重要的权重。
LoRAShear 还为基于LoRA的LLMs设计了修剪方法,其中包括(1)用于识别最小移除结构的图形算法,(2)渐进式结构化修剪算法LHSPG,以及(3)用于恢复模型性能的动态知识恢复机制。
SliceGPT 基于RMSNorm运算的计算不变性思想。它提出了在每个权重矩阵中结构化排列稀疏性,并切除整行或整列的方法。
PLATON 提出通过考虑权重的重要性和不确定性来修剪权重。它使用重要性分数的指数移动平均值(EMA)来估计重要性,并采用上限置信度(UCB)来估计不确定性。
SIMPLE 提出通过学习相应的稀疏mask来修剪注意力头、FFN神经元和隐藏维度。修剪后,它进一步采用知识蒸馏来微调修剪后的模型以恢复性能。
稀疏注意力技术在Transformer模型的多头自注意力(MHSA)组件中有所体现,其策略性地省略了某些注意力计算,主要是为了增强注意力操作在预填充阶段的计算效率。这些机制根据它们对特定输入数据的依赖程度可以分为静态和动态两类。
静态稀疏注意力独立于特定输入移除激活值。这些方法预先确定稀疏注意力mask,并在推理期间对注意力矩阵施加它。以前的研究结合不同的稀疏模式来保留每个注意力矩阵中最重要的元素。如下图11(a)所示,最常见的稀疏注意力模式是局部和全局注意力模式。
局部注意力模式利用固定大小的窗口注意力捕获每个token的局部上下文。全局注意力模式通过计算和关注整个序列中的所有token来捕获特定token之间的相关性。需要注意的是,利用全局模式可以消除存储未使用token的键值(KV)对的需要,从而减少解码阶段的内存访问成本和内存使用量。稀疏Transformer将这些模式结合起来,使用局部模式捕获局部上下文,然后使用全局模式聚合每几个单词的信息。
StreamingLLM只在前几个token中应用局部模式,以及全局模式。它表明这样的全局模式作为关注点,保持了对初始token的强关注得分。这有助于LLMs推广到无限输入序列长度。Bigbird还使用了随机模式,其中所有token都关注一组随机token。局部、全局和随机模式的组合被证明可以封装所有连续序列到序列函数,证明了它的图灵完备性。如下图11(b)所示,Longformer还引入了扩张的滑动窗口模式。这类似于扩张的CNNs,并使滑动窗口“扩张”以增加感受野。为了使模型适应稀疏设置,结构化稀疏注意力提倡一种熵感知的训练方法,将高概率的注意力值聚集到更密集的区域。
与以前手动设计稀疏模式的研究不同,SemSA使用基于梯度的分析来识别重要的注意力模式,并自动优化注意力密度分布以进一步提高模型效率。
相比之下,动态稀疏注意力根据不同的输入自适应地消除激活值,利用实时监控神经元激活值,跳过对影响微小的神经元的计算,从而实现修剪。大多数动态稀疏注意力方法采用动态token修剪方法,如下图11(c)所示。
Spatten、SeqBoat和Adaptively Sparse Attention利用语言结构中的固有冗余性提出了动态token级修剪策略。Spatten通过聚合注意力矩阵的列来评估每个单词的累积重要性,随后在后续层中修剪对输入影响微小的单词。SeqBoat通过训练具有稀疏Sigmoid函数的线性状态空间模型(SSM)来确定每个注意力头部要修剪的token。Spatten和SeqBoat都对整个输入中的无信息token进行修剪。Adaptively Sparse Attention在生成过程中逐渐修剪token。它丢弃了对未来生成不再需要的上下文部分。
除了动态token修剪外,还采用了动态注意力修剪策略。如上图11(d)所示,这些方法不是对某些token的所有注意力值进行修剪,而是根据输入动态修剪注意力的选择部分。在这个领域中,一个突出的方法是动态将输入token分组成称为“桶”的组,并有策略地省略驻留在不同桶中的token的注意力计算。
这些方法的挑战和重点在于如何将相关token聚合在一起,从而仅在它们之间进行注意力计算以增强效率。Reformer利用局部敏感哈希将具有相同哈希代码的键和查询聚类到同一个桶中。随后,Sparse Flash Attention引入了专门针对基于哈希的稀疏注意力机制优化的GPU内核,进一步提高了计算效率。与此同时,Routing Transformer采用球形k均值聚类算法将token聚合到桶中,优化了注意力计算的选择过程。Sparse Sinkhorn Attention采用了一个学习到的排序网络,将键与其相关的查询桶对齐,确保只在相应的查询-键对之间计算注意力。
与桶级操作不同,H2O引入了token级动态注意力修剪机制。它将静态局部注意力与当前查询和一组动态识别的关键token之间的动态计算相结合,称为重要项(H2)。这些重要项根据一种驱逐策略动态调整,以在每个生成步骤中移除最不重要的键,有效管理重要项集的大小和相关性。
此外,将每个token视为图节点,token之间的注意力视为边,为静态稀疏注意力提供了更广阔的视角。原始的完全注意力机制等同于一个具有均匀最短路径距离为1的完全图。稀疏注意力通过其随机mask引入了随机边,有效地将任意两个节点之间的最短路径距离降低到O(log n),从而保持了类似于完全注意力的高效信息流。Diffuser利用图论的视角扩展了稀疏注意力的感受野,引入了多跳token相关性。它还从扩展图的属性中汲取灵感,设计了更好的稀疏模式,以近似完全注意力的信息流。
除了注意力级别和token级别的稀疏性之外,注意力修剪的范围还延伸到各种粒度。Spatten还将修剪扩展到了注意力头的粒度,消除了不必要的注意力头的计算,进一步降低了计算和内存需求。
5.2.3 结构优化
结构优化的目标是通过改进模型架构或结构来增强模型效率和性能之间的平衡。在这个研究领域中,有两种突出的技术:神经架构搜索(NAS)和低秩分解(LRF)。
神经架构搜索。 神经架构搜索(NAS)旨在自动搜索在效率和性能之间达到优化平衡的最佳神经网络架构。AutoTinyBERT利用一次性神经架构搜索(NAS)来发现Transformer架构的超参数。值得注意的是,它引入了一种引人注目的基于批次的训练方法,用于训练超级预训练语言模型(SuperPLM),随后采用进化算法来识别最佳的子模型。
NAS-BERT在传统的自监督预训练任务上训练了一个大型超网络,使用了几种创新技术,例如块级搜索、搜索空间修剪和性能近似。这种方法使NAS-BERT能够在不需要大量重新训练的情况下有效地应用于各种下游任务。通过NAS进行结构修剪将结构修剪视为多目标NAS问题,并通过一次性NAS方法解决它。
LiteTransformerSearch提出使用一个无需训练的指标,即参数数量,作为指导搜索的agent指标。这种方法在搜索阶段无需实际训练即可有效地探索和选择最佳架构。
AutoDistil提出了一种完全与任务无关的少样本NAS算法,具有三个主要技术:搜索空间划分、与任务无关的SuperLM训练和与任务无关的搜索。这种方法旨在通过最小的任务特定适应促进各种任务中的有效架构发现。通常,NAS算法需要评估每个抽样架构的性能,这可能会带来重大的训练成本。因此,这些技术很难应用于LLMs。
其中,r远小于m和n。通过这种方式,LRF可以减少内存使用量并提高计算效率。此外,在LLM推理的解码阶段,内存访问成本成为解码速度的瓶颈。因此,LRF可以减少需要加载的参数数量,从而加速解码速度。LoRD展示了通过LRF对LLMs进行压缩而不会大幅降低性能的潜力。
具体来说,它采用奇异值分解(SVD)来因式分解权重矩阵,并成功地将具有16B参数的LLM压缩到12.3B,性能下降最小。TensorGPT引入了一种使用张量列分解来压缩embedding层的方法。每个tokenembedding被视为矩阵乘积状态(MPS),并以分布式方式高效计算。LoSparse将LRF和权重修剪的优势结合起来进行LLM压缩。
通过利用低秩逼近,LoSparse减轻了直接模型修剪通常会出现的丢失太多表达神经元的风险。LPLR和ZeroQuant-V2都提出通过同时对权重矩阵应用LRF和量化来压缩权重矩阵。DSFormer提出将权重矩阵分解为半结构化稀疏矩阵和小密集矩阵的乘积。ASVD设计了一种基于激活感知的SVD方法。该方法涉及在应用SVD进行矩阵分解之前,根据激活分布对权重矩阵进行缩放。ASVD还涉及通过搜索过程确定每个层的适当截断秩。
知识蒸馏
Knowledge Distillation (KD) 是一种用于模型压缩的成熟技术,其中大型模型(称为教师模型)的知识被转移到较小的模型(称为学生模型)中。在LLM的背景下,KD涉及使用原始的LLM作为教师模型来提炼较小的LM。许多研究已经专注于有效地将LLM的各种能力转移到较小的模型上。在这个领域,方法可以分为两种主要类型:白盒KD和黑盒KD(如下图12所示)。
白盒KD。 白盒KD指的是利用对教师模型的结构和参数的访问的提炼方法。这种方法使KD能够有效地利用教师模型的中间特征和输出logits来增强学生模型的性能。MiniLLM提出采用标准的白盒KD方法,但用反向Kullback-Leibler散度(KLD)替换前向KLD。
GKD引入了使用基于策略的数据的方法,这些数据包括学生模型自己生成的输出序列,以进一步提炼学生模型。这种方法专注于使用这些基于策略的数据来对齐教师和学生模型之间的输出logits。TED提出了一种任务感知的逐层KD方法。这种方法涉及在教师和学生模型的每一层之后添加过滤器,训练这些任务特定的过滤器,并在训练学生过滤器时冻结教师模型的过滤器,以使它们的输出特征与相应的教师过滤器对齐。
MiniMoE通过将MoE模型作为学生模型来减轻容量差距。对于新出现的实体,预训练语言模型(LLMs)可能缺乏最新信息。为了解决这个问题,一种解决方案是将额外检索到的文本合并到prompt中,尽管会增加推理成本。另一种方法是通过知识蒸馏将实体定义中的知识转移到LLM参数中。这种方法基于实体定义生成一个转移集,并根据这些定义将学生模型提炼以匹配与教师模型的输出分布。
黑盒KD。 黑盒KD是指知识蒸馏方法,其中教师模型的结构和参数不可用。通常情况下,黑盒KD仅使用教师模型获得的最终结果来提炼学生模型。在LLMs领域,黑盒KD主要指导学生模型学习LLMs的泛化能力和新兴能力,包括上下文学习能力、思维链(CoT)推理能力[14]和遵循指令(IF)能力[214]。
关于ICL能力,Multitask-ICT引入了上下文学习提炼,以转移大型语言模型(LLMs)的多任务少样本能力,利用了上下文学习和语言建模的熟练程度。MCKD观察到,从上下文学习的教师模型提炼出的学生模型往往在未见过的输入prompt上表现出优异的性能。基于这一观察结果,MCKD设计了一个多阶段提炼范式,其中前几个阶段的学生模型被用来生成后续阶段的提炼数据,增强了提炼方法的有效性。
为了提炼链式思维(CoT)推理能力,一些技术,如逐步提炼[118]、SCoTD[119]、CoTprompt[120]、MCC-KD[121]和Fine-tune-CoT[122],提出了结合从LLMs中提取的响应和解释的提炼方法来训练学生模型。Socratic CoT[123]也针对推理能力的转移到较小的模型。具体来说,它对一对学生模型进行微调,即一个问题生成(QG)模型和一个问题回答(QA)模型。QG模型被训练为根据输入问题生成中间问题,引导QA模型产生最终的响应。PaD[124]观察到,错误的推理(即正确的最终答案但错误的推理步骤)可能对学生模型产生不利影响。为了解决这个问题,PaD提出为推理问题生成合成程序,然后可以由额外的解释器自动检查。这种方法有助于去除具有错误推理的提炼数据,提高学生模型的训练数据质量。
针对IF能力,已经提出了几种方法来将这种能力转移到较小的模型。DISCO[126]引入了一种技术,使用LLM生成短语扰动。然后,这些扰动由一个特定于任务的教师模型过滤,以提炼高质量的反事实数据。LaMini-LM[127]旨在通过为提炼学生模型设计多样化的指令集来转移指令遵循能力。Lion[128]利用教师模型识别困难的指令,并生成新的复杂指令来提炼小模型。
动态推理
动态推理涉及在推理过程中根据输入数据对模型子结构进行自适应选择。本节重点介绍早期退出技术,这些技术使LLM能够根据特定样本或token在不同的模型层次上终止推理。值得注意的是,尽管MoE技术(在前文中讨论)也在推理过程中调整模型结构,但它们通常涉及昂贵的预训练成本。相比之下,早期退出技术只需要训练一个小模块来确定何时结束推理。本文将早期退出技术的研究分类为两种主要类型:样本级早期退出和token级早期退出(如下图13所示)。
样本级别。 样本级别的早期退出技术专注于确定每个输入样本的语言模型(LLMs)的最佳大小和结构。一个常见的方法是在每个层之后增加额外的模块,利用这些模块来决定是否在特定层终止推理。FastBERT[110]、DeeBERT[113]、MP[215]和MPEE[111]直接训练这些模块以做出决策(例如,在当前层的特征基础上输出0以继续或输出1以停止)。
全局过去-未来早期退出[112]提出了一种方法,通过从先前和随后的层中获取的语言信息来丰富这些模块的输入。由于未来层特征在推理过程中无法直接访问,因此训练了一个简单的前馈层来估计这些未来特征。PABEE[114]将这些模块训练为输出头,直接进行预测,当预测保持一致时,建议终止推理。HASHEE[115]采用了一种基于假设的非参数化决策方法,即相似的样本应在相同的层退出推理。
token级别。 在LLM推理的解码阶段,其中token是按顺序生成的,token级别的早期退出技术旨在优化每个输出token的LLM的大小和结构。CALM[108]在每个Transformer层之后引入早期退出分类器,训练它们输出置信度分数,以确定是否在特定层停止推理。
值得注意的是,在自注意力块中,计算每个层中当前token的特征依赖于同一层中所有先前token的特征(即KV缓存)。为了解决由于先前token的早期退出导致KV缓存丢失的问题,CALM提出直接将特征从退出层复制到随后的层,实验结果显示仅有轻微的性能下降。SkipDecode[109]解决了先前早期退出方法的局限性,这些局限性阻碍了它们对批量推理和KV缓存的适用性,从而限制了实际的加速效果。对于批量推理,SkipDecode提出了一个统一的退出点,适用于批处理内的所有token。关于KV缓存,SkipDecode确保退出点的单调递减,以防止KV缓存的重新计算,在推理过程中促进效率提升。
知识、建议和未来方向
在高效结构设计领域,寻求替代Transformer的其他架构是一个新兴的研究领域。例如,Mamba[73]、RWKV[60]及其各自的变体[101]、[104]已经在各种任务中展现出竞争性能力,在近期引起了越来越多的关注。然而,仍然有必要调研这些非Transformer模型是否与Transformer模型相比存在某些缺点。同时,探索非Transformer架构与注意力操作的整合[74]、[103]、[216]代表了未来研究的另一个有前途的方向。
在模型压缩领域,量化是大型语言模型(LLM)部署中主要采用的方法,主要由于两个关键因素。首先,量化提供了一种方便的方法来压缩LLM。例如,采用后训练量化(PTQ)方法可以在几分钟内将具有70亿参数的LLM的参数数量减少到压缩形式。其次,量化有望在减少内存消耗和推理速度方面实现实质性的减少,同时仅引入轻微的性能折衷。
这种折衷通常被认为对许多现实世界的应用是可以接受的。然而,值得注意的是,量化仍然可能会损害LLM的某些新兴能力,例如自我校准或多步推理。此外,在处理长上下文等特定场景时,量化可能会导致性能显著下降[204]。因此,需要仔细选择适当的量化方法,以减轻在这些专业情况下发生性能下降的风险。
大量文献已致力于研究稀疏注意力技术,以实现高效的长上下文处理。例如,最近的代表性工作StreamingLLM [148] 可以通过仅恢复几个注意力“汇”token来处理400万个token。然而,这些方法通常会牺牲关键信息,导致性能下降。因此,在有效管理长上下文的同时保留必要信息的挑战仍然是未来探索的重要领域。至于权重修剪技术,LLM-KICK [217] 指出,即使在相对较低的稀疏比率下,当前的最先进方法也会经历相当大的性能下降。因此,开发有效的权重修剪方法以维持LLM性能仍然是一个新兴而关键的研究方向。
模型结构的优化通常涉及使用神经架构搜索(NAS),这通常需要大量的计算资源,可能对其在压缩LLM中的实际应用构成潜在障碍。因此,探索利用自动结构优化来压缩LLM的可行性值得进一步探索。此外,像低秩因式分解(LRF)这样的技术仍然面临着一个挑战,即在压缩比和任务性能之间实现最佳平衡。例如,ASVD [146] 只能实现约10% 到 20% 的压缩比,而不影响LLM的推理能力。
除了采用单独的模型压缩技术外,还有一些研究探索了不同方法的组合,以压缩LLM,并利用它们各自的优势来提高效率。例如,MPOE [88] 将权重矩阵分解应用于基于MoE的LLM中的专家前馈网络(FFN),目的是进一步降低内存需求。LLM-MQ [191] 利用权重稀疏技术在模型量化期间保护权重离群值,从而最小化量化误差。
LPLR [143] 专注于量化低秩因式分解的权重矩阵,以进一步减少LLM推理期间的内存占用和内存访问成本。此外,LoSparse [142] 将低秩因式分解与权重剪枝相结合,利用剪枝来增强低秩逼近的多样性,同时利用低秩因式分解来保留重要权重,防止关键信息的丢失。这些方法突显了整合多种压缩技术以更好地优化LLM的潜力。
系统级优化
LLM推理的系统级优化主要涉及增强模型的前向传递过程。考虑到LLM的计算图,存在多个运算符,其中注意力和线性运算符占据大部分运行时间。如前文所述,系统级优化主要考虑LLM内注意力运算符和解码方法的独特特性。特别是,为了解决与LLM解码方法相关的特定问题,线性运算符需要特殊的平铺设计,并提出了推测性解码方法来提高利用率。此外,在在线服务的情境下,请求来自多个用户。因此,除了前面讨论的优化之外,在线服务还面临与异步请求相关的内存、批处理和调度方面的挑战。
推理机
推理引擎的优化旨在加速模型的前向传播过程。LLM推理中的主要运算符和计算图已经高度优化。此外,提出了推测性解码技术,以在不降低性能的情况下加快推理速度。
图和算子优化
运行时分析。 运行时性能分析使用HuggingFace实现揭示了注意力和线性操作符是运行时的主要贡献者,通常占总持续时间的75%以上。这突显了优化这些操作符以提高整体性能的重要性。此外,有多个运行时比例较小的操作符,导致执行时间线的碎片化和增加的CPU内核启动成本。为了缓解这个问题,当前优化的推理引擎在计算图层面实现了高度融合的操作符。
注意力操作符优化。 标准的注意力计算(例如使用Pytorch)涉及查询矩阵(Q)与键矩阵(K)的乘法,导致与输入序列长度成二次时间和空间复杂度。如下图15所示,随着上下文长度的增加,注意力操作符的时间比例也增加。这意味着对内存大小和计算能力的高需求,特别是在处理长序列时。为了解决标准注意力计算在GPU上的计算和内存开销,定制的注意力操作符至关重要。
FlashAttention将整个注意力操作融合为一个单一的、内存高效的操作符,以减轻内存访问开销。输入矩阵(Q、K、V)和注意力矩阵被划分为多个块,这消除了完整数据加载的需求。基于Flash Attention,FlashDecoding旨在最大化解码的计算并行性。由于解码方法的应用,在解码过程中,Q矩阵在解码时会退化为一批向量,这使得如果并行性仅限于批量大小维度,则填充计算单元变得具有挑战性。
FlashDecoding通过引入沿序列维度的并行计算来解决这个问题。虽然这会引入一些softmax计算的同步开销,但对于小批量大小和长序列,这会导致并行性明显提高。随后的作品FlashDecoding++注意到,在先前的作品中,softmax中的最大值只作为一个缩放因子,以防止数据溢出。然而,动态最大值会带来显著的同步开销。此外,广泛的实验表明,在典型的LLM(例如Llama2、ChatGLM)中,超过99.99%的softmax输入都在某个范围内。因此,FlashDecoding++提议提前根据统计数据确定缩放因子。这消除了softmax计算中的同步开销,使得可以在softmax计算的同时并行执行后续操作。
线性操作符优化。 线性操作符在LLM推理中发挥着至关重要的作用,执行特征投影和前馈神经网络(FFNs)。在传统神经网络中,线性操作符可以抽象为常规的矩阵-矩阵乘法(GEMM)操作。然而,在LLM的情况下,解码方法的应用导致维度显著降低,与传统的GEMM工作负载不同。传统GEMM的低级实现已经高度优化,主流的LLM框架(例如DeepSpeed、vLLM、OpenPPL等)主要调用由cuBLAS提供的GEMM API进行线性操作符。
没有针对具有降低维度的GEMM的明确定制实现,解码期间的线性操作符会遭受效率低下的问题。解决此问题的一个显着趋势在最新发布的TensorRT-LLM中观察到。它引入了一个专用的广义矩阵-向量乘法(GEMV)实现,可能提高了解码步骤的效率。最近的研究FlashDecoding++迈出了进一步的一步,解决了在解码步骤中处理小批量大小时cuBLAS和CUTLASS库的效率低下问题。作者首先引入了FlatGEMM操作的概念,以表示具有高度降低维度的GEMM的工作负载(在FlashDecoding++中维度大小<8)。
由于FlatGEMM具有新的计算特性,传统GEMM的平铺策略需要修改才能应用。作者观察到随着工作负载的变化存在两个挑战:低并行性和内存访问瓶颈。为了解决这些挑战,FlashDecoding++采用了细粒度的平铺策略来提高并行性,并利用双缓冲技术来隐藏内存访问延迟。此外,认识到典型LLM中的线性操作(例如Llama2、ChatGLM)通常具有固定的形状,FlashDecoding++建立了一个启发式选择机制。该机制根据输入大小动态选择不同的线性操作符。选项包括FastGEMV、FlatGEMM以及cuBLAS库提供的GEMM。这种方法确保选择最有效的操作符用于给定的线性工作负载,可能导致更好的端到端性能。
近期,将MoE FFN应用于增强模型能力已成为LLM领域的趋势。这种模型结构也提出了对运算优化的新要求。如上图15所示,在具有MoE FFN的Mixtral模型中,由于HuggingFace实现中FFN计算未经优化,线性操作符主导了运行时。
此外,Mixtral采用了GQA注意力结构,降低了注意力操作符的运行时比例,进一步指出了对FFN层进行优化的迫切需要。MegaBlocks是首个针对MoE FFN层进行计算优化的工作。该工作将MoE FFN计算形式化为块稀疏操作,并提出了专门的GPU内核以加速计算。然而,MegaBlocks专注于MoE模型的高效训练,因此忽略了推理的特性(例如解码方法)。现有框架正在努力优化MoE FFN推理阶段的计算。vLLM的官方仓库集成了Triton中的MoE FFN融合内核,从而无缝地消除了索引开销。
图级优化。 图级优化中,内核融合因其能够减少运行时而脱颖而出。应用内核融合有三个主要优点:(1)减少内存访问。融合内核本身消除了中间结果的内存访问,从而减轻了操作符的内存瓶颈。(2)减少内核启动开销。对于一些轻量级操作符(例如残差相加),内核启动时间占据了大部分延迟时间,内核融合减少了单个内核的启动次数。(3)增强并行性。对于那些没有数据依赖关系的操作符,当逐个内核执行无法填满硬件容量时,通过融合来并行内核是有益的。
内核融合技术在LLM推理中表现出了高效性,并带来了上述所有好处。FlashAttention [233]将注意力操作符制定为一个单一内核,消除了访问注意力结果的开销。基于注意力操作符受内存限制的事实,减少内存访问有效地转化为运行时加速。ByteTransformer [235]和DeepSpeed [236]提出将轻量级操作符(包括残差相加、层归一化和激活函数)与以前的线性操作符融合,以减少内核启动开销。因此,这些轻量级操作符在时间轴上消失,几乎没有额外的延迟。此外,内核融合还被采用来增强LLM推理的利用率。Query、Key和Value矩阵的投影最初是三个单独的线性操作,现在被融合成一个线性操作符,以在现代GPU上部署。目前,内核融合技术已经在LLM推理实践中得到了利用,并且高度优化的推理引擎在运行时仅使用了少量融合内核。例如,在FlashDecoding++ [231]的实现中,一个Transformer块仅集成了七个融合内核。利用上述操作符和内核融合优化,FlashDecoding++实现了比HuggingFace实现高达4.86倍的速度提升。
推测性解码
Speculative decoding [218](即推测采样[219])是一种创新的解码技术,用于自回归LLM,旨在提高解码效率而不影响输出的准确性。这种方法的核心思想是利用一个较小的模型,称为草稿模型,来高效地预测几个后续的token,然后使用目标LLM并行验证这些预测。这种方法旨在使LLM能够在通常需要单个推理的时间范围内生成多个token。下图16显示了传统的自回归解码方法和推测解码方法的比较。形式上,推测解码方法包括两个步骤:
- Draft Construction: 该方法利用草稿模型并行或自回归地生成多个后续token,即草稿token。
- Draft Verification: 该方法利用目标模型在单个LLM推理步骤中计算所有草稿token的条件概率,随后逐个确定每个草稿token的接受情况。接受率,表示每个推理步骤中接受的草稿token的平均数量,是评估推测解码算法性能的关键指标。
推测性解码确保与标准自回归解码方法输出等价。传统解码技术通常采用两种主要的抽样策略:贪婪抽样和核心抽样。贪婪抽样涉及在每个解码步骤中选择具有最高概率的token,以生成特定的输出序列。最初的推测性解码尝试,称为块状并行解码,旨在确保草稿token与通过贪婪抽样采样的token完全匹配,从而保持输出token的等价性。
相比之下,核心抽样涉及从概率分布中抽样token,导致每次运行产生不同的token序列。这种多样性使核心抽样受欢迎。为了在推测性解码框架中容纳核心抽样,已经提出了推测性抽样技术。推测性抽样保持输出分布的等价性,与核心抽样的概率性质相一致,以生成不同的token序列。形式上,给定一系列token 和一系列草稿token ,推测性抽样策略接受第 i 个草稿token的概率如下:
这里的 p(·|·) 和 q(·|·) 分别表示目标语言模型和草稿模型的条件概率。如果第 i 个草稿token被接受,那么设置 。否则,它退出对以下草稿token的验证,并从以下分布重新抽样 :
借鉴推测性抽样,出现了几种变体,旨在验证多个草稿token序列。值得注意的是,token树验证器已经成为这一背景下广泛采用的验证策略。该方法利用了草稿token集的树结构表示,并采用树注意机制来高效执行验证过程。
在推测性解码方法中,草稿token的接受率受到草稿模型的输出分布与原始语言模型输出分布一致程度的显著影响。因此,大量的研究工作致力于改进草稿模型的设计。DistillSpec直接从目标语言模型中提炼出一个较小的草稿模型。
SSD涉及自动识别目标语言模型中的一个子模型(模型层的子集)作为草稿模型,消除了对草稿模型的单独训练的需求。OSD动态调整草稿模型的输出分布,以匹配在线语言模型服务中的用户查询分布。它通过监视语言模型中被拒绝的草稿token,并利用这些数据通过提炼来完善草稿模型。
PaSS建议将目标语言模型本身作为草稿模型,并将可训练token(前瞻token)合并到输入序列中,以便同时生成后续token。REST引入了一种基于检索的推测性解码方法,将非参数化的检索数据存储作为草稿模型。
SpecInfer引入了一种集体增强调整技术,将一组草稿模型的输出分布与目标语言模型的输出分布一致。Lookahead解码涉及并行生成目标语言模型的 n-gram,以帮助生成草稿token。Medusa专门对语言模型的几个头进行微调,以生成后续草稿token。Eagle采用了一种轻量级的Transformer层,称为自回归头,以自回归方式生成草稿token,并将目标语言模型的丰富上下文特征整合到草稿模型的输入中。
另一方面的研究着眼于设计更有效的草稿构建策略。传统方法通常产生单个草稿token序列,这给通过验证带来了挑战。为此,Spectr提倡生成多个草稿token序列,并采用k-顺序草稿选择技术同时验证k个序列。这种方法利用了推测性抽样,确保了输出分布的等价性。
类似地,SpecInfer采用了类似的方法。然而,与Spectr不同,SpecInfer将草稿token序列合并成一个“token树”,并引入了树注意机制进行验证。这种策略被称为“token树验证器”。由于其高效性,token树验证器已经被广泛应用于许多推测性解码算法中。除了这些努力外,阶段推测性解码和级联推测性草稿(CS草稿)提出通过将推测性解码直接整合到token生成过程中来加速草稿构建。
比较实验与分析。 本文进行了一项实验,以评估推测性解码方法的加速性能。具体来说,本文彻底审查了这一领域的研究,并选择了其中六个已开源其代码的研究,即推测性解码(SpD)、前瞻性解码(LADE)、REST、自我推测解码(SSD)、Medusa 和 Eagle。至于评估数据集,本文使用 Vicuna-80 来评估上述方法,该数据集包含了80个问题,分为10个类别。
本文报告了这80个问题的平均结果。至于目标语言模型,本文采用了五个时尚开源语言模型,即 Vicuna-7B-V1.3、Vicuna-13B-V1.3、Vicuna-33B-V1.3、LLaMA-2-7B 和 LLaMA-2-13B。本文报告了这5个语言模型的评估指标范围。至于草稿模型,本文采用了两个训练良好的草稿模型,即 LLaMA-68M 和 LLaMA-160M,用于 SpD。对于其他推测性解码方法,本文遵循它们提出的草稿构建方法,并使用它们提供的检查点。至于评估指标,本文采用了接受率,表示接受的token数量与生成步骤数量的比率,以及加速比,表示在输出总长度固定的情况下,原始自回归解码的延迟与推测性解码的延迟之比。
下表5 提供了各种推测性解码方法的比较,突出显示了几个关键观察结果:
- Eagle 展现出了出色的性能,在多个语言模型上实现了显著的3.47∼3.72×的端到端加速。为了理解其成功之处,对 Eagle 进行了更深入的分析,揭示了两个关键因素。首先,Eagle 采用自回归方法解码草稿token,直接利用先前生成的token的信息。其次,Eagle 整合了来自原始语言模型和草稿模型的先前token的丰富特征,以增强下一个草稿token生成的准确性。
- token树验证器证明是提升推测性解码方法性能的有效技术。
- 这些方法实现的端到端加速通常低于接受率。这种差异是由于实际考虑到与草稿模型相关的生成成本不能忽视的原因造成的。
服务系统
针对服务系统的优化旨在提高处理异步请求的效率。内存管理被优化以容纳更多请求,并且集成了高效的批处理和调度策略以提高系统吞吐量。此外,还提出了针对分布式系统的优化,以利用分布式计算资源。
内存管理
KV 缓存的存储在语言模型服务中主导了内存使用,特别是当上下文长度较长时(见前文)。由于生成长度是不确定的,因此预先为 KV 缓存存储分配空间是具有挑战性的。早期的实现通常根据每个请求的预设最大长度预先分配存储空间。
然而,在请求生成提前终止的情况下,这种方法会造成存储资源的显著浪费。为了解决这个问题,S3提议为每个请求预测生成长度的上限,以减少预先分配空间的浪费。然而,当不存在这样的大的连续空间时,KV 缓存内存分配的静态方式仍然失败。为了处理碎片化的存储,vLLM提出按照操作系统的方式以分页的方式存储 KV 缓存。vLLM首先尽可能地分配一个尽可能大的内存空间,并将其均等地分成多个物理块。
当请求到来时,vLLM以不连续的方式动态地将生成的 KV 缓存映射到预先分配的物理块中。通过这种方式,vLLM显著减少了存储碎片化,并在语言模型服务中实现了更高的吞吐量。基于vLLM,LightLLM使用更精细的 KV 缓存存储来减少出现不规则边界时的浪费。LightLLM将每个token的 KV 缓存视为一个单位,而不是一个块,因此生成的 KV 缓存总是填满预先分配的空间。
当前优化的服务系统通常采用这种分页方法来管理 KV 缓存存储,从而减少冗余的 KV 缓存内存浪费。然而,分页存储导致注意力操作符中的内存访问不规则。对于使用分页 KV 缓存的注意力操作符,这需要考虑 KV 缓存的虚拟地址空间与其相应的物理地址空间之间的映射关系。为了增强注意力操作符的效率,KV 缓存的加载模式必须经过定制,以便进行连续的内存访问。
例如,在 vLLM 的 PagedAttention 中,头部尺寸维度的存储被构造为 K 缓存的一个16字节的连续向量,而 FlashInfer 则为 KV 缓存编排了多样化的数据布局,并配以一个设计合理的内存访问方案。注意力操作符与分页 KV 缓存存储的优化仍然是服务系统发展中的前沿挑战。
连续 Batching
批处理中的请求长度可能不同,导致较短的请求完成而较长的请求仍在运行时利用率较低。由于在服务场景中请求的异步性质,存在这样的机会,即可以减轻这些低利用率期间的情况。连续批处理技术被提出利用这一机会,在一些旧请求完成后批处理新请求。
ORCA 是第一个在语言模型服务中利用连续批处理技术的工作。每个请求的计算包含多个迭代,每个迭代代表填充步骤或解码步骤。作者建议可以在迭代级别对不同的请求进行批处理。该工作在线性操作符中实现了迭代级别的批处理,将不同的请求在序列维度上连接在一起。因此,与已完成的请求对应的空闲存储和计算资源会被立即释放。
在ORCA之后,vLLM将该技术扩展到了注意力计算中,使具有不同 KV 缓存长度的请求可以一起进行批处理。Sarathi、DeepSpeed-FastGen 和 SarathiServe 进一步引入了一种分割和融合方法,将填充请求和解码请求一起进行批处理。具体来说,这种方法首先在序列维度上分割长的填充请求,然后将其与多个短的解码请求一起进行批处理。分割和融合方法在不同迭代之间平衡工作负载,并通过消除新请求的停滞显著减少了尾延迟。
LightLLM 也采用了分割和融合方法。
分割和融合技术的基本假设是,在填充阶段的请求可以被划分为离散的块。分块填充方法涉及沿着序列维度分割填充请求,从而避免了对其他请求造成潜在瓶颈的可能性。这种策略利用了语言模型中固有的自回归特性,其中注意力计算仅依赖于先前的token。因此,分块填充技术的数学等价性得到了保证,使其成为减少语言模型服务中请求延迟的领先方法。
调度策略
在语言模型服务中,每个请求的作业长度存在变异性,因此执行请求的顺序对服务系统的吞吐量有重大影响。当长请求被优先处理时,会发生先头阻塞。具体来说,当系统耗尽内存容量时,对长请求的响应会导致内存使用快速增长,从而阻碍后续请求。开创性的工作 ORCA 和开源系统,包括 vLLM 和 LightLLM,采用了简单的先来先服务(FCFS)原则来调度请求。DeepSpeed-FastGen 给解码请求优先级,以增强性能。
FastServe 提出了一种抢占式调度策略来优化先头阻塞问题,在语言模型服务中实现低作业完成时间(JCT)。FastServe 利用多级反馈队列(MLFQ)来优先处理剩余时间最短的请求。由于自回归解码方法导致请求长度未知,FastServe 首先预测长度,然后利用跳过连接的方式找到每个请求的适当优先级。与之前的工作不同,VTC 讨论了语言模型服务中的公平性。VTC 引入了基于token数量的成本函数来衡量客户端之间的公平性,并进一步提出了一个公平调度程序来确保公平性。
分布式系统
为了实现高吞吐量,语言模型服务通常部署在分布式平台上。最近的工作还专注于通过利用分布式特性来优化这些推理服务的性能。值得注意的是,观察到预填充是计算密集型的,而解码是内存密集型的,Splitwise、TetriInfer 和 DistServe 展示了将请求的预填充和解码步骤分解的效率。
通过这种方式,这两个独立的阶段根据其特性进行独立处理。SpotServe 设计用于在具有可抢占 GPU 实例的云上提供语言模型服务。SpotServe 高效处理了包括动态并行控制和实例迁移在内的挑战,还利用了语言模型的自回归特性来实现token级状态恢复。此外,Infinite-LLM 将 vLLM 中的分页 KV 缓存方法扩展到了分布式云环境中。
硬件加速器设计
之前的研究工作主要集中在优化Transformer架构上,特别是增强注意力操作符,通常采用稀疏方法来促进FPGA部署。FACT加速器通过线性运算符的混合精度量化和算法硬件协同设计,实现了比NVIDIA V100 GPU更优越的能效,但这些方法并不针对生成式语言模型进行定制。
最近的工作,如ALLO,突出了FPGA在管理内存密集型解码阶段方面的优势,并强调了模型压缩技术对于语言模型的有效FPGA部署的重要性。相反,DFX专注于解码阶段的优化,但缺乏模型压缩方法,限制了对更大模型和更长输入(高达15亿模型和256个token)的可扩展性。ALLO基于这些见解,进一步提供了一组高级综合(HLS)核心库,这些核心库是可组合和可重用的。ALLO的实现在预填充阶段表现出比DFX更优越的生成加速度,与NVIDIA A100 GPU相比在解码期间实现了增强的能效和加速。
FlightLLM也利用了这些见解,引入了一个可配置的稀疏数字信号处理器(DSP)链,用于各种高计算效率的稀疏模式。它提出了一种始终在线芯片上的解码方案,并支持混合精度,以增强内存带宽利用率。对于Llama2-7B模型,FlightLLM的能效比NVIDIA V100S GPU高出6.0倍,成本效率提高了1.8倍,在解码过程中的吞吐量比NVIDIA A100 GPU高出1.2倍。
LLM框架比较
本文在下表6中比较了多个LLM框架的性能。推理吞吐量是使用Llama2-7B(批处理大小=1,输入长度=1k,输出长度=128)测量的。服务性能是在ShareGPT数据集上测得的最大吞吐量。这两个指标都是在单个NVIDIA A100 80GB GPU上获得的。在提到的框架中,DeepSpeed、vLLM、LightLLM和TensorRT-LLM集成了服务功能,以处理来自多个用户的异步请求。本文还在表格中列出了每个框架的优化。除了HuggingFace外,所有框架都实现了操作符级或图级的优化来提高性能,其中一些还支持推测性解码技术。请注意,在本文测量所有框架的推理性能时,推测性解码技术是关闭的。推理吞吐量的结果显示,FlashDecoding++和TensorRT-LLM在覆盖主要操作符和计算图的优化方面表现优于其他框架。从服务的角度来看,所有框架都使用了细粒度和不连续的存储来存储KV缓存,并采用了连续批处理技术来提高系统利用率。与vLLM和LightLLM不同,DeepSpeed在调度中优先处理解码请求,这意味着如果批处理中已有足够的现有解码请求,则不会合并新的请求。
知识、建议和未来方向
系统级优化在不降低准确性的情况下提高了效率,因此在LLM推理实践中变得普遍。推理的优化也适用于服务。最近,操作符优化已经与实际的服务场景密切结合,例如,RadixAttention专门设计用于前缀缓存,而tree attention用于加速推测性解码验证。应用程序和场景的不断迭代将继续提出操作符发展的新要求。
关键应用场景讨论
当前的研究工作已经在探索各种优化层面上实现高效的LLM推理方面取得了重大进展。然而,有必要进一步研究,以增强LLM在实际场景中的效率。本文已经在数据级、模型级和系统级提供了优化技术的有前途的未来方向。在本节中,本文总结了四个关键场景:agent和多模型框架、长文本LLM、边缘场景部署和安全效率协同,并对它们进行了更广泛的讨论。
Agent和多模型框架。 正如在前文中讨论的那样,最近在agent和多模型框架方面的进展显著提高了agent处理复杂任务和人类请求的能力,通过利用LLM的强大能力。这些框架在增加LLM的计算需求的同时,将更多的并行性引入到LLM输出内容的结构中,从而为数据级和系统级优化提供了机会,例如输出组织技术。此外,这些框架自然引入了一个新的优化层次,即管道级,这在该级别上具有提高效率的潜力。
此外,还有一个不断增长的研究趋势,专注于将AIagent扩展到多模态领域,这通常利用大型多模态模型(LMMs)作为这些agent系统的核心。为了提高这些新兴基于LMM的agent的效率,设计LMM的优化技术是一个有前途的研究方向。长上下文LLMs。目前,LLMs面临着处理越来越长的输入上下文的挑战。然而,自注意力操作是Transformer风格LLMs的基本组件,在上下文长度方面呈二次复杂度,限制了在训练和推理阶段的最大上下文长度。已经探索了各种策略来解决这个限制,包括输入压缩、稀疏注意力、设计低复杂度结构和优化注意力操作符。值得注意的是,最近,具有次二次或线性复杂度的非Transformer架构引起了研究人员的极大兴趣。
尽管这些新型架构在效率上具有竞争力,但与Transformer架构在各种能力方面的竞争力,如上下文学习能力和长距离建模能力,仍受到审视。因此,从多个角度探索这些新架构的能力并解决它们的局限性仍然是一个有价值的追求。此外,确定各种场景和任务所需的上下文长度以及确定未来将作为LLMs基础骨架的下一代架构是至关重要的。
边缘场景部署。 虽然已经投入了大量的工作来提高LLM推理的效率,但将LLMs部署到资源极度受限的边缘设备,如手机,仍然面临着持续的挑战。最近,许多研究者表现出了对预训练较小语言模型(1B至3B参数)的兴趣。这种规模的模型在推理过程中提供了降低的资源成本,并具有与更大模型相比的泛化能力和竞争性能的潜力。然而,开发这种高效而强大的较小语言模型的方法仍然没有得到充分的探索。
几项研究已经开始了这个有前途的方向。例如,MiniCPM进行了沙盒实验以确定最佳的预训练超参数。PanGu-π-Pro建议使用模型剪枝的指标和技术,从预训练的LLMs初始化模型权重。MobileLLM采用了“深而薄”的架构用于小型模型设计,并提出跨不同层次共享权重以增加层数而不增加额外的内存成本。然而,小型模型与大型模型之间仍然存在性能差距,需要未来的研究来缩小这种差距。未来,有必要进行针对边缘场景中模型规模的研究,并探索各种优化方法在设计更小型模型时的边界。
除了设计更小的模型,系统级优化为LLM部署提供了一个有前景的方向。一个值得注意的最近的项目,MLC-LLM,成功地将LLaMA-7B模型部署到了手机上。MLC-LLM主要采用编译技术,如融合、内存规划和循环优化,在推理过程中提高延迟和降低内存成本。此外,采用云边协作技术,或设计更复杂的硬件加速器也可以帮助将LLMs部署到边缘设备上。
结论
高效的LLM推理侧重于减少LLM推理过程中的计算、内存访问和内存成本,旨在优化效率指标,如延迟、吞吐量、存储、功耗和能耗。本调查提供了对高效LLM推理研究的全面审查,提供了对关键技术的见解、建议和未来方向。首先,本文介绍了一个包括数据级、模型级和系统级优化的层次化分类体系。随后,在这个分类体系的指导下,本文仔细审查和总结了每个级别和子领域的研究。对于像模型量化和高效服务系统这样的成熟技术,本文进行实验以评估和分析它们的性能。基于这些分析,本文提出了实用建议,并确定了对从业者和研究人员在该领域的有前景的研究方向。
本文转自 Zixuan Zhou等 ,作者:AI生成未来