大模型由于其在各种任务中的出色表现而引起了广泛的关注。然而,大模型推理的大量计算和内存需求对其在资源受限场景的部署提出了挑战。业内一直在努力开发旨在提高大模型推理效率的技术。本文对现有的关于高效大模型推理的文献进行了全面的综述总结。首先分析了大模型推理效率低下的主要原因,即大模型参数规模、注意力计算操的二次复杂度作和自回归解码方法。然后,引入了一个全面的分类法,将现有优化工作划分为数据级别、模型级别和系统级别的优化。此外,本文还对关键子领域的代表性方法进行了对比实验,以及分析并给出一定的见解。最后,对相关工作进行总结,并对未来的研究方向进行了讨论。
论文
:A Survey on Efficient Inference for Large Language Models
地址
:
https://arxiv.org/abs/2404.14294
1 Introduction
近年来,大模型受到了学术界和工业界的广泛关注。
LLM领域经历了显著的增长和显著的成就。许多开源llm已经出现,包括gpt-系列(GPT-1, GPT-2和GPT-3), OPT, lama系列(LLaMA , LLaMA 2,BaiChuan 2 ,Vicuna, LongChat), BLOOM, FALCON, GLM和Mtaistral[12],他们用于学术研究和商业落地。大模型的成功源于其处理各种任务的强大能力,如神经语言理解(NLU)、神经语言生成(NLG)、推理和代码生成[15],从而实现了ChatGPT、Copilot和Bing等有影响力的应用程序。越来越多的人认为[16]LMM士的崛起和取得的成就标志着人类向通用人工智能(AGI)迈进了一大步。
图1:大模型部署挑战
然而,LLM的部署并不总是很顺利。如图1所示,在推理过程中,使用LLM通常需要更高的计算成本,内存访问成本和内存占用。(根本原因分析见Sec. 2.3)在资源受限的场景中,推理效率也会降低(如,延迟,吞吐量,功耗和存储)。这对LLM在终端以及云场景这两方面的应用带来了挑战。例如,巨大的存储需求使得在个人笔记本电脑上部署70B参数量的模型来用于辅助开发是不切实际的。此外,如果将LLM用于每一个搜索引擎请求,那么低吞吐量将带来巨大的成本,从而导致搜索引擎利润的大幅减少。
幸运的是,大量的技术已经被提出来,以实现LLM的有效推理。为了获得对现有研究的全面了解,并激发进一步的研究,文章对当前现有的LLM高效推理工作采用了分级分类和系统总结。具体来说,将现有工作划分组织为数据级别、模型级别和系统级别的优化。此外,文章对关键子领域内的代表性方法进行了实验分析,以巩固知识,提供实际性建议并为未来的研究努力提供指导。
表1:综述对比
目前,综述[17],[18],[19],[20],[21],[22]均涉及LLM领域。这些综述主要集中在LLM效率的不同方面,但提供了进一步改进的机会。Zhu等[17],Park等[18]和Wang等。[19]将综述的重心放在,模型压缩技术上,是模型级别的优化。Ding等[20]将数据和模型架构作为研究重心。Miao等[21]从机器学习系统(MLSys)研究的角度研究LLM的有效推理。相比之下,本文提供了一个更全面的研究范围,在三个层次上解决优化:数据级别、模型级别和系统级别,同时也囊括了最近的研究工作。而Wan等[22]和Xu等[23]也对高效LLM研究进行了全面综述。基于在几个关键的子领域如模型量化和模型server端中进行的实验分析,本文通过整合对比实验,提供实际的见解和建议。如表1所示,展示了各种综述之间的比较。
本文行文结构划分如下:第二章介绍了LLMs的基本概念和知识,并对LLMs推理过程中效率瓶颈进行了详细的分析。第三章展示了本文提出的分类法。第四章到第六章从三个不同优化级别分别对相关工作进行展示讨论。第七章针对几个关键的应用场景进行更广泛的讨论。第八章总结本综述的关键贡献。
2 Preliminaries
2.1 transformer架构的LLM
语言建模作为语言模型的基本功能,包括对单词序列概率进行建模并预测后续单词的概率分布。近年来研究人员发现增加语言模型规模不仅提高了语言建模能力,除了传统的NLP任务之外,还产生了处理更复杂任务的能力[24],这些规模更大的语言模型是被称为大模型(LLMs)。
主流大模型是基于Transformer架构[25]设计的。典型的transformer架构的模型由数个堆叠的transformer block组成。通常,一个transformer block由一个多头自注意力(MHSA)模块,一个前馈神经网络(FFN)和一个LayerNorm(LN)层组成。每个transformer block接收前一个transformer block的输出特征,并将其作为输入,并将特征串行送进每个子模块中,最后输出。特别的是,在第一个transformer block前,需要用一个tokenizer将传统的输入语句转化为token序列,并紧接着使用一个embedding层将token序列转化为输入特征。且一个额外的位置embedding被加入到输入特征中,来对输入token序列的token顺序进行编码。
Transformer架构的核心是自注意力机制,其在多头自注意力(MHSA)模块被使用。MHSA模块对输入进行线性变换,得到了Q,K,V向量,如公式(1)所示:
其中
为输入特征,
为第 个注意力头的变换矩阵。接着自注意力操作被应用于每个
元组并得到第个注意力头的特征
, 如公式 (2)所示:
其中
是query(key)的维度。自注意力计算包含矩阵乘法,其计算复杂度是输入长度的二次方。最后,MHSA模块将所有注意力头的特征进行拼接,并对他们做映射矩阵变换,如公式(3)所示:
其中
是映射矩阵。自注意力机制可以让模型识别不同输入部分的重要性,而不用去考虑距离,也已就此可以获得输入语句的长距离依赖以及复杂的关系。FFN作为transformer block的另一个重要模块,被设置在多头自注意力(MHSA)模块之后,且包含两个使用非线性激活函数的。其接收MHSA模块的输出特征如公式(4)所示,进行计算:
其中,
和
为两个线性层的权重矩阵,
为激活函数。
2.2 大模型推理过程
最受欢迎的大模型,如,decoder-only架构的大模型通常采用自回归的方式生成输出语句,自回归的方式是逐token的进行输出。在每一次生成步中,大模型将过去的全部token序列作为输入,包括输入token以及刚刚生成的token,并生成下一个token。随着序列长度的增加,生过文本这一过程的时间成本也显著藏家。为了解决这个问题,一个关键技术,key-value(KV)缓存被提出来,用于加速文本生成。
KV缓存技术,包括在多头自注意(MHSA)块内,存储和复用前面的token对应的key 向量(K)和value向量(V)。此项技术在大模型推理以中得到了广泛的应用,因为其对文本生成延迟实现了巨大的优化。基于此项技术,大模型的推理过程可以划分为两个阶段:
①prefilling阶段:大模型计算并存储原始输入token的KV缓存,并生成第一个输出token,如图2(a)所示
②decoding阶段:大模型利用KV 缓存逐个输出token,并用新生成的token的K,V(键-值)对进行KV缓存更新。
图2:KV缓存技术在大模型推理中应用原理示意图
如图3所示,展示了提升推理效率的关键指标。对于横轴Latency(延迟,在预填充(prefilling)阶段,将first token latency记作生成第一个token的时间;在decoding阶段,将per-output token latency记作生成一个token的平均时间。此外,generation latency表示输出整个token序列的时间。对于纵轴Memory(内存),model size被用来表示存储模型权重所需要的内存大小以及KV cache size代表存储存储KV缓存的内存大小。此外,peak memory代表在生成工程中需要占用的最大内存。其大约为model size与KV cache size之和。对模型权重和KV缓存的内存和。除去延迟和内存中,吞吐量(throughput)也是大模型推理服务系统中的一个广泛使用的指标。token throughput表示每秒生成的token数量,request throughput表示每秒完成的请求数。
2.3 推理效率分析
在资源受限的场景中,部署大模型并保持其推理效率以及性能对于工业界和科研及都是巨大的挑战。例如,对有700亿参数量的LLaMA-2-70B进行部署,以FP16数据格式对其权重进行加载需要140GB显存(VRAM),进行推理需要至少6张 RTX 3090Ti GPU(单卡显存24GB)或者2张NVIDIA的A100 GPU(单卡显存80GB)。在推理延迟方面,2张NVIDIA的A100 GPU上生成一个token需要100毫秒。因此,生成一个具有数百个token的序列需要超过10秒。除去内存占用和推理延迟,吞吐量以及能源电量的消耗都需要被考虑。大模型推理过程中,三个重要因素将很大程度上影响上述指标。计算成本(computational cost),内存访问成本(memory access cost)和内存使用(memory usage)。大模型推理低效率的根本原因需要关注三个关键因素:
①Model Size:主流大模型通常包含数十亿甚至万亿的参数。例如,LLaMA-70B模型包括700亿参数,而GPT-3为1750亿参数。在推理过程中,模型大小对计算成本、内存访问成本和内存使用产生了显著影响。
②Attention Operation:如2.1和2.2中所述,prefilling阶段中,自注意操作的计算复杂度为输入长度的2次方,因此输入长度的增加,计算成本、内存访问成本和内存使用都会显著增加。
③Decoding Approach:自回归解码是逐token的进行生成。在每个decoding step,所有模型权重都来自于GPU芯片的片下HBM,导致内存访问成本巨大。此外,KV缓存随着输入长度的增长而增长,可能导致内存分散和不规则内存访问。
3 TAXONOMY
上述部分讲述了影响大模型推理性能的关键因素,如计算成本、内存访问成本和内存使用,并进一步分析了根本原因:Model Size、Attention Operation和Decoding Approach。许多研究从不同的角度对优化推理效率进行了努力。通过回顾和总结这些研究,文章将它们分为三个级别的优化,即:数据级别优化、模型级别优化和系统级别优化(如图4所示):
图4:大模型推理性能优化分类
数据级别优化:即通过优化输入prompt(例如,输入压缩)或者更好的组织输出内容(例如,输出组织)。这类优化通常不会改变原来的模型,因此没有高昂的模型训练成本(其中,可能需要对少量的辅助模型进行训练,但与训练大模型的成本相比,这个成本可以被忽略)。
模型级别优化:即在模型推理时,通过设计一个有效的模型结构(如有效的结构设计)或者压缩预训练模型(如模型压缩)来优化推理效率。优化第一种优化通常需要昂贵的预训练或少量的微调来保留或者恢复模型能力的成本,而第二种典型的会给模型性能带来损失。
系统级别优化:即优化推理引擎或者服务系统。推理引擎的优化不需要进行模型训练,服务系统的优化对于模型性能而言更是无损的。此外,文章还在章节6.3中队硬件加速设计进行了简单的介绍。
4.数据级别优化
数据级别的优化今年来的工作可以划分为两类,如优输入压缩或者输出组织。输入压缩技术直接缩短了模型的输入长度来减少推理损失。同时输出组织技术通过组织输出内容的结构来实现批量(并行)推理,此方法可以提升硬件利用率和降低模型的生成延迟。
4.1输入压缩
在大模型的实际应用中,提示词prompt至关重要,许多工作都提出了设计提示词的新方法,它们在实践中均展示出精心设计的提示可以释放大模型的性能。例如,上下文学习(In-Context Learning)建议在prompt中包含多个相关示例,这种方法能够鼓励大模型去进行类比学习。思维链(Chain-of-Thought, COT)技术则是在上下文的示例中加入一系列中间的推理步骤,用于帮助大模型进行复杂的推理。然而,这些提示词上的相关技巧不可避免地会导致提示词更长,这是一个挑战,因为计算成本和内存使用在prefilling期间会二次增长(如2.3节所示)。
为了解决这个问腿输入prompt压缩技术被提出来用于缩短提示词长度且不对大模型的回答质量构成显著性影响。在这一技术方面,相关研究可分为四个方面,如图5所示:提示词裁剪(prompt pruning),提示词总结(prompt summary),基于提示词的软压缩(soft prompt-based compression)和检索增强生成(retrieval augmented generation, RAG)。
图5:大模型输入压缩方法分类
4.1.1 提示词裁剪(prompt pruning)
提示词裁剪的核心思想是从输入prompt中基于预定义或者学习到的关键性指标中去在线去除不重要的token,语句或者文档。DYNAICL提出对给定输入,动态地确定上下文示例的最优数量,通过一个训练好的基于大模型的controller。Selective Context这篇论文提出将token合并为数个单元,接着使用一个基于self-information指标(如,negative log likelihood)的单元级别地prompt裁剪。STDC论文基于解析树进行提示词裁剪,其迭代地删除在裁剪后导致最小性能下降的短语node。PCRL论文引入了一种基于强化学习的token级别的裁剪方案。PCRL背后的核心思想是通过将忠实度和压缩比组合到奖励函数中来训练一个策略大模型。忠实度是通过计算经过裁剪后的输出提示符和原始提示词之间的相似度来衡量的。RECOMP方法实现了一种句子级别裁剪策略来压缩用于检索增强语言模型(Retrieval-Augmented Language Models, RALMs)的提示。该方法包括使用预训练的encoder将输入问题和文档编码为latent embedding。然后,它根据文档embedding与问题embedding的相似度决定要去除哪些文档。LLMLingua引入了一种粗到细的剪枝方案,用于prompt压缩。最初,它执行示范级别的裁剪,然后根据困惑度执行token级别的裁剪。为了提高性能,LLMLingua提出了一个预算控制器,在提示词的不同部分之间动态分配裁剪预算。此外,它利用迭代式的token级的压缩算法来解决由条件独立性假设引入的不准确性。LLMLingua还采用了一种分布对齐策略,将目标大模型的输出分布与用于困惑度计算的较小大模型进行对齐。LongLLMLingua[41]在LLMLingua的基础上进行了一些加强:(1)它利用以输入问题为条件的困惑度作为提示词裁剪的指标。(2)它为不同的演示分配不同的修剪比例,并根据其指标值在最终提示词内重新排序。(3)基于响应恢复原始内容。CoT-Influx引入了一种使用强化学习对思维链(CoT)提示词进行粗到细粒度裁剪的方法。具体来说,它会先裁剪去除不重要的示例,然后在剩下的示例中继续删除不重要的token。
4.1.2 提示词总结(prompt summary)
提示词总结的核心思想是在保持相似的语义信息的前提下,将原有提示词浓缩为更短的总结。这些技术还可以作为提示词的在线压缩方法。与前面提到的保留未裁剪标记的提示词裁剪技术不同,这一行方法将整个提示符转换为总结。RECOMP[34]引入了一个抽象压缩器(Abstractive Compressor),其将输入问题和检索到的文档作为输入,生成一个简洁的摘要。具体来说,它从大规模的大模型中提取轻量级压缩器来进行总结工作。SemanticCompression提出了一种语义压缩方法。它首先将文本分解成句子。然后,它根据主题将句子分组,然后总结每组中的句子。
4.1.3 基于提示词的软压缩(Soft Prompt-based Compression)
这种压缩技术的核心思想是设计一个比原始提示词短得多的软提示词,作为大模型的输入。软提示词被定义为一系列可学习的连续token。有些技术对固定前缀的提示词(如系统提示词、特定任务提示词)采用脱机压缩。例如,PromptCompression训练软提示来模拟预定的系统提示词。该方法包括在输入token之前添加几个软token,并允许在反向传播期间对这些软token进行调整。在对提示数据集进行微调之后,软token序列充当软提示词。Gisting引入了一种方法,使用前缀词调优将特定任务的提示词压缩为一组简洁的gist token。鉴于特定任务的提示会因任务而异,前缀词调优将针对每个任务单独使用。为了提高效率,Gisting进一步引入了一种元学习方法,用于预测新的未见过的gist token基于先前任务中的的gist token。
其他技术对每个新的输入提示词进行在线压缩。例如,AutoCompressors训练一个预训练的语言模型,通过无监督学习将提示词压缩成总结向量。ICAE训练了一个自动编码器将原始上下文压缩到短记忆槽中。具体来说,ICAE采用适应LoRA的大模型作为编码器,并使用目标大模型作为解码器。在输入token之前添加一组记忆token并将其编码到记忆槽中。
4.1.4 检索增强生成(retrieval augmented generation, RAG)
检索增强生成(Retrieval-Augmented Generation, RAG)旨在通过整合外部知识来源来提高大模型回答的质量。RAG也可以看作是在处理大量数据时提高推理效率的一种技术。RAG没有将所有信息合并到一个过长的prompt中,而是将检索到的相关信息添加到原始提示符中,从而确保模型在显著减少提示词长度的同时接收到必要的信息。FLARE使用对即将到来的句子的预测来主动决定何时以及检索什么信息。REPLUG将大模型视为一个黑盒,并使用可调检索模型对其进行扩充。它将检索到的文档添加到冻结的黑盒大模型的输入中,并进一步利用大模型来监督检索模型。Self-RAG通过检索和自我反思来提高大模型的质量和真实性。它引入了反馈token,使大模型在推理阶段可控。
4.2 输出组织(Output Organization)
传统的大模型的推理过程是完全顺序生成的,这会导致大量的时间消耗。输出组织技术旨在通过组织输出内容的结构来(部分地)实现并行化生成。
思维骨架(Skeleton-of-Thought, SoT)是这个方向的先驱。SoT背后的核心思想是利用大模型的新兴能力来对输出内容的结构进行规划。具体来说,SoT包括两个主要阶段。在第一阶段(即框架阶段),SoT指导大模型使用预定义的“框架提示词”生成答案的简明框架。例如,给定一个问题,如“中国菜的典型类型是什么?”,这个阶段的输出将是一个菜的列表(例如,面条,火锅,米饭),没有详细的描述。然后,在第二阶段(即点扩展阶段),SoT指导大模型使用“点扩展提示符”来同时扩展骨架中的每个点,然后将这些拓展连接起来最终形成最后答案。当应用于开源模型时,可以通过批推理执行点扩展,这可以提升硬件利用率,并在使用相同的计算资源的前提下减少总体生成延迟,以减少额外的计算。SoT的推理流程展示如图6所示:
由于额外的提示词(如骨架提示词和点扩展提示词)带来的开销,SoT讨论了在点扩展阶段跨多个点来共享公共提示词前缀的KV缓存的可能性。此外,SoT使用路由模型来决定SoT是否适合应用于特定的问题,目的是将其限制在合适的情况下使用。结果,SoT在最近发布的12个大模型上 实现了高达2.39倍的推理加速,并通过提高答案的多样性和相关性来提高答案质量。
SGD进一步扩展了SoT的思想,其将子问题点组织成一个有向无环图(DAG),并在一个回合内并行地回答逻辑独立的子问题。与SoT类似,SGD还利用大模型的新兴能力,通过提供自己制作的提示词和几个示例来生成输出结构。SGD放宽了不同点之间严格的独立性假设,以提高答案的质量,特别是对于数学和编码问题。与SoT相比,SGD优先考虑答案质量而不是速度。此外,SGD引入了一个自适应的模型选择方法,来根据其估计的复杂性为每个子问题分配最优模型大小,从而进一步提高效率。
APAR采用了与SoT类似的思想,利用大模型输出特殊的控制token(如 ,[fork])来自动动态的触发并行解码。为了有效地利用输出内容中固有的可并行化结构并准确地生成控制token,APAR对大模型进行了微调,这些大模型是精心设计的数据上进行的,这些数据是在特定树结构中形成的。因此,APAR在基准测试中实现1.4到2.0倍的平均加速,且对答案质量的影响可以忽略不计。此外,APAR将他们的解码方法与推测解码技术(如Medusa)和推理框架(如vLLM)结合,来进一步改进推理延迟和系统吞吐量。
SGLang在Python 特征原语中引入了一种领域特定语言(DSL),其能够灵活地促进大模型编程。SGLang的核心思想是自动分析各种生成调用之间的依赖关系,并在此基础上进行批量推理和KV缓存共享。使用该语言,用户可以轻松实现各种提示词策略,并从SGLang的自动效率优化(如SoT,ToT)中收益。此外,SGLang 还介绍并结合了几种系统级别的编译技术,如代码移动和预取注释。
4.3 认识,建议和未来方向
大模型处理更长的输入、生成更长的输出的需求日益增长,这凸显了数据级别的优化技术的重要性。在这些技术中,输入压缩方法的主要目标是通过减少由attention操作引起的计算和内存成本来提升prefilling阶段的效率。此外,对于基于API的大模型,这些方法可以减少与输入token相关的API成本。相比之下,输出组织方法侧重于通过降低与自回归解码方法相关的大量内存访问成本来优化解码阶段。
随着大模型的功能越来越强大,是有可能能利用它们来压缩输入提示词或构建输出内容的。输出组织方法的最新进展也证明了利用大模型将输出内容组织成独立点或依赖图的有效性,从而便于批量推理以改善生成延迟。这些方法利用了输出内容中固有的可并行结构,使大模型能够执行并行解码,从而提高硬件利用率,从而减少端到端的生成延迟。
最近,各种提示词pipeline(如,ToT ,GoT)和Agent框架正在出现。虽然这些创新提高了大模型的能力,但它们也增加了输入prompt的长度,导致计算成本增加。为了解决这个问题,采用输入压缩技术来减少输入长度是一种很有希望的解决方案。同时,这些pipeline和框架自然地为输出结构引入了更多的并行性,增加了并行解码和跨不同解码线程来共享KV cache的可能性。SGLang支持灵活的大模型编程,并为前端和后端协同优化提供了机会,为该领域的进一步扩展和改进奠定了基础。总之,数据级别优化,包括输入压缩和输出组织技术,在可预见的将来,为了提高大模型推理效率,将变得越来越必要。
除了优化现有框架的推理效率外,一些研究还侧重于直接设计更高效的智能体框架。例如,FrugalGPT提出了一个由不同大小的大模型组成的模型级联,如果模型对答案达到足够的确定性水平,那么推理过程就会提前停止。该方法通过利用分层的模型体系结构和基于模型置信度估计的智能推理终止来提高效率。与模型级别的动态推理技术(第5.2.5节)相比,FrugalGPT在pipeline级别执行动态推理。
5 模型级别优化
大模型高效推理的模型级别优化主要集中在模型结构或数据表示的优化上。模型结构优化包括直接设计有效的模型结构、修改原模型和调整推理时间结构。在数据表示优化方面,通常采用模型量化技术。
在本节中,文章将根据所需的额外训练开销对模型级别的优化技术进行分类。第一类包含设计更有效的模型结构(又叫有效结构设计)。使用这种方法开发的模型通常需要从头开始训练。第二类侧重于压缩预训练模型(称为模型压缩)。此类别中的压缩模型通常只需要最小的微调即可恢复其性能。
5.1 有效结构设计
目前,SOTA大模型通常使用Transformer架构,如2.1节所述。然而,基于transformer的大模型的关键组件,包括前馈网络(FFN)和attention操作,在推理过程中存在效率问题。文章认为原因如下:
FFN在基于transformer的大模型中贡献了很大一部分模型参数,这导致显著的内存访问成本和内存使用,特别是在解码阶段。例如,FFN模块在LLaMA-7B模型中占63.01%,在LLaMA-70B模型中占71.69%。
attention操作在的复杂度是输入长度的二次方,这导致大量的计算成本和内存使用,特别是在处理较长的输入上下文时。
为了解决这些计算效率问题,一些研究集中在开发更有效的模型结构上。文章将相关研究分为三组(如图7所示):高效FFN设计、高效注意力设计和Transformer替代。
图7:大模型有效结构设计分类
5.1.1 高效FFN设计
在这一方面,许多研究都集中在将混合专家(mixture-of-experts, MoE)技术集成到大模型中,以提高大模型的性能,同时保持计算成本。MoE的核心思想是动态地分配各种预算,在面对不同的输入token时。在基于MoE的Transformers中,多个并行的前馈审计网络(FFN),即专家,与可训练的路由模块一起使用。在推理过程中,模型选择性地为路由模块控制的每个token激活特定的专家。
一些研究集中研究FFN专家的工作,主要是在优化专家权值的获取过程或使专家更轻量化以提高效率。例如,MoEfication设计了一种方法,使用预训练的权重将非MoE大模型转换为MoE版本。这种方法免去了对MoE模型进行昂贵的预训练的需要。为了实现这个技术,MoEfication首先将预训练大模型的FFN神经元分成多组。在每一组中,神经元通常同时被激活函数激活。然后,它以专家的身份重组每组神经元。Sparse Upcycling引入了一种方法,直接从密集模型的checkpoint中初始化基于MoE的LLM的权重。在这种方法中,基于MoE的LLM中的专家是密集模型中FFN的精确复制品。通过使用这种简单的初始化,Sparse Upcycling可以有效地训练MoE模型以达到高性能。MPOE提出通过矩阵乘积算子(Matrix Product Operators, MPO)分解来减少基于MoE的大模型的参数。该方法将FFN的每个权重矩阵分解为一个包含公共信息的全局共享张量和一组捕获特定特征的局部辅助张量。
另一项研究侧重于改进MoE模型中路由模块(或策略)的设计。在以前的MoE模型中,路由模块容易导致负载不平衡问题,这意味着一些专家被分配了大量token,而另一些专家只处理少量token。这种不平衡不仅浪费了未充分利用的专家的能力,降低了模型的性能,还降低了推断推理质量。当前的MoE实现经常使用批矩阵乘法来同时计算所有FFN专家。这就要求每个专家的输入矩阵必须具有相同的形状。然而,由于存在负载不平衡问题,需要向那些未充分利用的专家中填充输入token集以满足形状约束,这会造成计算浪费。因此,路由模块设计的主要目标是在MoE专家的token分配中实现更好的平衡。Switch Transformers在最终loss函数中引入了一个额外的loss,即负载平衡loss,以惩罚路由模块的不平衡分配。这种loss被表述为token分配分数向量和均匀分布向量之间的缩放点积。因此,只有在所有专家之间平衡token分配时,损失才会最小化。这种方法鼓励路由模块在专家之间均匀地分发token,促进负载平衡并最终提高模型性能和效率。BASE用端到端的方式学习了每个专家的embedding,然后根据embedding的相似性将专家分配给令token。为了保证负载均衡,BASE制定了一个线性分配问题,并利用拍卖算法有效地解决了这个问题。Expert Choice引入了一种简单而有效的策略来确保基于MoE的模型的完美负载平衡。与以前将专家分配给token的方法不同,Expert Choice允许每个专家根据embedding的相似度独立选择top-k个token。这种方法确保每个专家处理固定数量的token,即使每个token可能分配给不同数量的专家。
除了上述关注模型架构本身的研究外,也有对基于MoE的模型的训练方法改进的相关工作。SE-MoE引入了一种新的辅助loss,称为router z-loss,其目的是在不影响性能的情况下提高模型训练的稳定性。SE-MoE发现在路由模块中,softmax操作所引入的指数函数会加剧舍入误差,导致训练不稳定。为了解决这个问题,router z-loss会惩罚输入到指数函数中的大概率,从而最小化训练期间的舍入误差。StableMoE指出基于MoE的大模型存在路由波动问题,即在训练和推理阶段专家分配不一致。对于相同的输入token,在训练时其被分配给了不同的专家,但在推理时却只激活一个专家。为了解决这个问题,StableMoE建议采用更一致的训练方法。它首先学习路由策略,然后在模型主干训练和推理阶段保持固定的路由策略。SMoE-Dropout为基于MoE的大模型设计了一种训练方法,其提出在训练过程中逐步增加激活专家的数量。这种方法提升了基于MoE的模型的推理和下游微调的可扩展性。GLaM预训练并发布了一系列具有不同参数大小的模型,这证明了它们在few-shot任务上与密集大模型的性能相当。这个系列模型中,最大的模型的参数高达1.2万亿。Mixtral 8x7B是最近发布的一个引人注目的开源模型。在推理过程中,它只利用了130亿个活动参数,在不同的基准测试中取得了比LLaMA-2-70B模型更好的性能。Mixtral 8x7B每层由8个前馈网络(FFN)专家组成,每个token在推理过程中分配给两个专家。
5.1.2 高效attention设计
attention操作是Transformer体系结构中的一个关键部分。然而,它的计算复杂度是与输入长度相关的二次方,这导致了大量的计算成本、内存访问成本和内存使用,特别是在处理长上下文时。为了解决这个问题,研究人员正在探索更有效的方法来近似原始attention操作的功能。这些研究大致可以分为两个主要分支:multi-query attention和low complexity attention。
①
Multi-Query Attention
。Multi-Query Attention(MQA)通过共享横跨不同注意力头的KV缓存来优化attention 操作。这项策略有效的减少了推理时的内存访问成本和内存使用,对改善Transformer模型的性能带来了帮助。如第2.2节所述,transformer类型的大模型通常采用多头注意力(MHA)操作。该操作需要在解码阶段为每个注意力头存储和检索KV对,导致内存访问成本和内存使用大幅增加。而MQA通过在不同的头上使用相同的KV对,同时保持不同的Q值来解决这一问题。通过广泛的测试,MQA已经被证明可以显著降低内存需求,且对模型性能的影响很小,这使它成为一个提高推理效率的关键技术。Grouped-query attention(GQA)进一步扩展了MQA的概念,它可以看作是MHA和MQA的混合。具体来说,GQA将注意力头分成不同的组,然后为每个组存储一组KV值。这种方法不仅保持了MQA在减少内存开销方面的优势,还强化了推理速度和输出质量之间的平衡。
②
Low-Complexity Attention
。Low-Complexity Attention方法旨在设计新的机制来降低每个注意力头的计算复杂度。为了简化讨论, 这里假设 Q (查询)、 K (键) 和 V (值)矩阵的维度是相同的, 即
。由于下面的工作不涉及像 MQA 那样改变注意头的数量, 此处的讨论集中在每个头内的注意力机制。如 2.2 节所述, 传统注意力机制的计算复杂度为
, 相当于随着输入长度增长, 呈二次增长。为了解决低效率问题, Kernel-based Attention和 Low-Rank Attention方法被提出, 此方法将复杂度降低到
。
Kernel-based Attention。
基于核的注意力设计了一个核
, 通过变换特征映射之间的线性点积如,
, 来近似 Softmax
的非线性 softmax操作。它通过优先计算
, 然后将其与
相乘, 从而避免了与
相关的传统二次计算。具体来说, 输入 Q 和 K 矩阵首先通过核函数
映射到核空间, 但是保持其原始维度。接着利用矩阵乘法的关联特性, 允许
和
在与
交互之前相乘。因此注意力机制被重新表述为:
其中,
。此方法有效的将计算复杂度降低至
, 使其与输入长度成线性关系。Linear Transformer是第一个提出基于核的注意力的工作。它采用
作为核函数, 其中
)表示指数线性单元激活函数。Performers和 RFA提出使用随机特征映射来更好地近似softmax函数。PolySketchFormer采用多项式函数和素描技术近似softmax函数。
Low-Rank Attention
。Low-Rank Attention技术在执行注意计算之前, 将
和
矩阵的 token维度 (如
)压缩到较小的固定长度(即如
)。该方法基于对
注意力矩阵通常表现出低秩特性的认识, 使得在token维度上压缩它是可行的。这条研究路线的主要重点是设计有效的压缩方法, 其中
可以是上下文矩阵, 也可以是
和
矩阵:
有一种工作是使用线性投影来压缩 token维度。它通过将
和
矩阵与映射矩阵
相乘来完成的。这样, 注意力计算的计算复杂度降至
, 与输入长度成线性关系。Linformer首先观察并分析了注意力的低秩性, 提出了低秩注意力框架。LRT 提出将低秩变换同时应用于attention模块和FFN, 来进一步提高计算效率。FLuRKA将低秩变换和核化结合到注意力矩阵中, 进一步提高了效率。具体的说, 它首先降低
和
矩阵的token的维度, 然后对 Q 和低秩 K 矩阵应用核函数。
除了线性映射外,其他的token维度压缩方法也被提出出来。Luna和Set Transformer利用额外的注意力计算和较小的query来有效地压缩
和
矩阵。Luna则是使用了一个额外的固定长度为
的query矩阵。小的query使用原始的上下文矩阵执行注意力计算, 称为 pack attention, 来将上下文矩阵压缩到大小为
。随后, 常规的注意力计算, 称为 unpack attention, 将注意力计算应用于原始
矩阵和压缩的
和
矩阵。额外的query矩阵可以是可学习的参数或从前一层中获取。Set Transformer通过引入固定长度的 inducing points矢量, 设计了类似的技术。FunnelTransformer不同于以往压缩K和V的工作, 它使用池化操作来逐步压缩 Q 矩阵的序列长度。
5.1.3 Transformer替代
除了聚焦于优化注意力操作之外,最近的研究还创新地设计了高效而有效的序列建模体系结构。表2比较了一些代表性的非transformer架构模型的性能。在训练和推理过程中,这些架构的模型在序列长度方面表现出小于二次方的计算复杂度,使大模型能够显着增加其上下文长度。
典型非Transformer架构模型性能比较
在这些研究中,有两个突出的研究方向引起了极大的关注。其中一条研究集中在状态空间模型(State Space Model, SSM)上,该模型将序列建模视作一种基于HiPPO理论的递归变换。此外,其他研究主要集中在使用长卷积或设计类似注意力的公式来建模序列。
State Space Model
:状态空间模型(SSM)在某些NLP和CV任务中的建模能力极具竞争力。与基于注意力的Transformer相比,SSM在输入序列长度方面表现出线性的计算和存储复杂度,这提高了其处理长上下文序列的能力。本篇综述中,SSM是指一系列满足以下两个属性的模型架构:
(1)它们基于HiPPO和LSSL提出的以下公式对序列进行建模:
其中,
表示转移矩阵。
为中间状态,
为输入序列。
(2)他们基于HiPPO理论设计了转移矩阵A。具体来说,HiPPO提出通过将输入序列映射到一组多项式基上,将其压缩为系数序列(即)。
在上述框架的基础上, 一些研究主要集中在改进转移矩阵A的参数化或初始化。这包括在SSM 中重新定义矩阵的公式或初始化方式, 以增强其在序列建模任务中的有效性和性能。LSSL首先提出用HiPPO设计的最优转移矩阵 HiPPO-Legs初始化A。此外, LSSL还通过展开公式 (7), 以卷积的方式训练 SSM。具体地说, 通过定义一个卷积核为
, 可以将公式 (7) 改写为
也可以通过快速傅里叶变换(FFT) 高效地计算。然而, 计算这个卷积核的代价是昂贵的, 因为它需要多次乘以
。为此, S4、DSS和 S4D提出对矩阵A进行对角化, 从而加快计算速度。这可以看作是转换矩阵A的参数化技术。过去的SSM独立处理每个输入维度, 从而会产生大量可训练的参数。为了提高效率, S5 提出使用一组参数同时处理所有输入维度。在此结构的基础上, S5介绍了基于标准HiPPO矩阵的A的参数化和初始化方法。Liquid S4 和Mamba以输入依赖的方式对转移矩阵进行参数化, 这进一步增强了SSM的建模能力。此外, S5 和Mamba 均采用并行扫描技术, 无需卷积操作即可进行有效的模型训练。这种技术在现代GPU硬件上的实现和部署方面具有优势。
另一类研究方向是基于SSM设计更好的模型架构。GSS和BiGS结合了门控注意力单元(GAU)和SSM。它们将GAU中的注意力操作替换为SSM操作。BST将SSM模型与提出的使用强局部感应偏置的Block Transformer相结合。H3观察到SSM在召回较早的token和跨序列比较token方面很弱。为此,它建议在标准SSM操作之前增加一个移位SSM操作,用于直接将输入令牌移位进入状态。MambaFormer结合了标准Transformer和SSM模型,将Transformer中的FFN层替换为SSM层。Jamba引入了另一种方法,通过在SSM模型中添加四个Transformer层来组合Transformer和SSM模型。DenseMamba探讨了传统SSM中隐藏状态退化的问题,并在SSM体系结构中引入了稠密连接,以在模型的更深层中保存细粒度信息。BlackMamba和MoE- mamba提出用混合专家(Mixture-of-Experts, MoE)技术增强SSM模型,在保持模型性能的同时优化训练和推理效率。
其他代替
:除了SSM之外,还有其他几种高效的替代方案也引起了极大的关注,包括长卷积和类attention的递归运算。一些研究在长序列建模中采用了长卷积。这些工作主要是关于卷积参数的参数化的。例如,Hyena采用了一种数据相关的参数化方法,用于使用浅前馈神经网络(FFN)的长卷积。其他设计类注意力操作,但可以纳入循环方式的研究,从而实现高效的训练和高效的推理。例如,RWKV是在AFT的基础上建立的,AFT提出将Transformer模型中的注意力操作代入如下公式:
其中,
和Transformer一样, 分别为 quey, key, vakue,
为一个可学习的成对位置偏差和
为一个非线性函数。具体来说, 它进一步将位置偏差进行重参数化,
, 因此可以将公式(8)重写为递归形式。这样, RWKV可以将Transformer 的有效并行化训练特性和RNN的高效推理能力结合起来。
效果分析
:文章在表2中分析和比较了几种创新的和具有代表性的非Transformer架构的模型的计算和内存复杂性。在训练时间方面,许多模型(如S4, Hyena, RetNet)这些通过使用卷积或注意力等训练形式来保持训练并行性。值得注意的是,Mamba用并行扫描技术处理输入序列,从而也使用了训练并行性。
另一方面,在推理过程中,大多数研究选择循环架构来保持prefilling阶段的线性计算复杂度并在decoding阶段保持上下文长度不可知。而且,在decoding阶段,这些新颖的体系结构消除了缓存和加载历史token的特性的需要(类似于基于Transformer的语言模型中的KV缓存),从而显著节省了内存访问成本。
5.2 模型压缩
模型压缩包括一系列旨在通过修改预训练模型的数据表示(例如,量化)或改变其模型架构(例如,稀疏化、结构优化和动态推理)来提高其推理效率的技术,如图8所示。
图8:大模型的模型压缩方法分类
5.2.1 量化
量化是一种广泛使用的技术,通过将模型的权重和激活从高位宽表示转换为低位宽表示来减少大模型的计算和内存成本。具体来说,许多方法都涉及到将FP16张量量化为低位整型张量,可以表示为如下公式:
其中
表示16位浮点(FP16)值,
表示低精度整数值,
表示位数,
和
表示缩放因子和零点。
在下面,本文从效率分析开始,说明量化技术如何减少大模型的端到端推理延迟。随后,再分别详细介绍两种不同的量化工作流程:Post-Training Quantization (PTQ)和Quantization-Aware Training (QAT)。
效率分析
:如2.2节所述,大模型的推理过程包括两个阶段:prefilling阶段和decoding阶段。在prefilling阶段,大模型通常处理长token序列,主要操作是通用矩阵乘法(GEMM)。Prefilling阶段的延迟主要受到高精度CUDA内核执行的计算操作的限制。为了解决这个问题,现有的研究方法对权重和激活量化,以使用低精度Tensor核来加速计算。如图9 (b)所示,在每次GEMM操作之前会在线执行激活量化,从而允许使用低精度Tensor核(例如INT8)进行计算。这种量化方法被称为权重激活量化
。
相比之下,在解码阶段,大模型在每个生成步中只处理一个token,其使用通用矩阵向量乘法(GEMV)作为核心操作。解码阶段的延迟主要受到加载大权重张量的影响。为了解决这个问题,现有的方法只关注量化权重来加速内存访问。这种方法称为
,首先对权重进行离线量化,然后将低精度权重去量化为FP16格式进行计算,如图9 (a)所示。
图9:(a)纯权重量化推理流程。(b)权重激活量化推理流程。
Post-Training Quantization
:PTQ涉及对预训练模型进行量化,而不需要再训练,这可能是一个昂贵的过程。尽管PTQ方法已经在较小的模型中得到了很好的探索,但是将现有的量化技术直接应用于大模型存在困难。这主要是因为与较小的模型相比,大模型的权重和激活通常表现出更多的异常值,并且具有更宽的分布范围,这使得它们的量化更具挑战性。总之,大模型的复杂特性,以其规模和复杂性为特征,需要用专门的方法来有效地处理量化过程。大模型中异常值和更宽的分布范围的存在需要开发量身定制的量化技术,以便在不影响模型性能或效率的情况下处理这些独特的特征。
大量的研究致力于开发有效的量化算法来压缩大模型。本文在表3中提供了跨四个维度分类的代表性算法的综合。对于量化张量的种类,某些研究专注于weight-only quantization,而其他许多研究则专注于权重和激活的量化。值得注意的是,在大模型中,KV缓存代表了影响内存和内存访问的独特组件。因此,一些研究提出对KV缓存进行量化。在量化格式方面,为了便于硬件实现,大多数算法采用统一的格式。关于量化参数(如缩放因子、零点)的确定,大多数研究依赖于由权重或激活值得出的统计数据。然而,也有一些研究主张基于重构loss来寻找最优参数。此外,一些研究也建议在量化之前或量化过程中更新未量化的权重(称为
)以提高性能。
在weight-only quantization方法中,GPTQ代表了大模型量化的早期较好的工作,它建立在传统算法OBQ的基础上。OBQ通过相对于未量化权重的Hessian矩阵的重建误差的方法,来实现每行权重矩阵的最优量化顺序。在每个量化步骤之后,OBQ迭代调整未量化的权重以减轻重建误差。然而,量化过程中频繁更新Hessian矩阵增加了计算复杂度。GPTQ通过采用统一的从左到右的顺序来量化每一行,从而简化了这个过程,从而避免了大量更新Hessian矩阵的需要。该策略通过在量化一行时仅计算Hessian矩阵,然后将计算结果用于后续行,从而大大减少了计算需求,从而加快了整个量化过程。LUT- GEMM提出了一种新的利用查找表(Look-Up Table, LUT)的去量化方法,旨在通过减少去量化开销来加速量化大模型的推理过程。此外,它采用了一种称为二进制编码量化(BCQ)的非均匀量化方法,该方法包含了可学习的量化区间。AWQ观察到权重通道对性能的重要性各不相同,特别强调那些与激活异常值的输入通道对齐的通道。为了增强关键权重通道的保存,AWQ采用了一种重参数化的方法。该方法通过网格搜索选择重参数化系数,有效地减小了重构误差。OWQ观察到量化与激活异常值相关的权重的困难。为了解决这个问题,OWQ采用了混合精度量化策略。该方法识别权重矩阵中的弱列,并为这些特定权重分配更高的精度,同时以较低的精度级别量化其余权重。SpQR引入了一种方法,在量化过程中识别和分配更高精度的权重异常值,而其余权重被量化为3位。SqueezeLLM提出将离群值存储在全精度稀疏矩阵中,并对剩余权重应用非均匀量化。根据量化灵敏度确定非均匀量化的值,能够提高量化模型的性能。QuIP引入了LDLQ,一种二次代理目标的最优自适应方法。研究表明,保证权值与Hessian矩阵之间的不相干性可以提高LDLQ的有效性。QuIP利用LDLQ,通过随机正交矩阵乘法实现非相干性。FineQuant采用了一种启发式方法。为了确定每列量化的粒度,结合从实验中获得的经验见解来设计量化方案。QuantEase的工作建立在GPTQ之上。在对每一层进行量化时,其提出了一种基于坐标下降的方法来更精确地补偿未量化的权重。此外,QuantEase可以利用来自GPTQ的量化权重作为初始化,并进一步完善补偿过程。LLM-MQ采用FP16格式保护权重异常值,并将其存储在压缩稀疏行(CSR)格式中,以提高计算效率。此外,LLM-MQ将每个层的位宽分配,建模为整数规划问题,并采用高效的求解器在几秒内求解。LLM-MQ还设计了一个高效的CUDA内核来集成去量化运算符,从而降低了计算过程中的内存访问成本。
对于weight-activation quantization,ZeroQuant采用细粒度量化权值和激活,利用核融合来最小化量化过程中的内存访问成本,并逐层进行知识蒸馏以恢复性能。FlexGen将权重和KV缓存直接量化到INT4中,以减少大批量推理期间的内存占用。LLM.int8() 发现激活中的异常值集中在一小部分通道中。基于这一点,LLM.int8() 根据输入通道内的离群值分布将激活和权重分成两个不同的部分,以最小化激活中的量化误差。包含激活值和权重的异常数据的通道以FP16格式存储,其他通道则以INT8格式存储。SmoothQuant采用了一种重新参数化技术来解决量化激活值的挑战。该方法引入比例因子,扩大了权重通道的数据范围,缩小了相应激活通道的数据范围。ZeroQuant引入了权重的组级别的量化策略和激活的token级别的量化方法。在此方法的基础上,ZeroQuantV2提出了LoRC(低秩补偿)技术,采用低秩矩阵来减轻量化不准确性。RPTQ发现不同激活通道的分布,实质上是变化的,这给量化带来了挑战。为了缓解这个问题,RPTQ将具有相似激活分布的通道重新组织到集群中,并在每个集群中独立地应用量化。OliVe观察到离群值附近的正态值不那么关键。因此,它将每个离群值与一个正态值配对,牺牲正态值,以获得更大的离群值表示范围。OS+观察到异常值的分布是集中且不对称的,这对大模型的量化提出了挑战。为了解决这个问题,OS+引入了一种通道级别的移动和缩放技术。在搜索过程去确定移动和缩放参数,能有效地处理集中和不对称的离群值分布。ZeroQuant-FP研究了将权重和激活值量化为FP4和FP8格式的可行性。研究表明,与整数类型相比,将激活量化为浮点类型(FP4和FP8)会产生更好的结果。Omniquant与先前依赖量化参数的经验设计的方法不同。相反,它优化了权值裁剪的边界和等效变换的缩放因子,以最小化量化误差。QLLM通过实现通道重组来解决异常值对量化的影响。此外,QLLM还设计了可学习的低秩参数,来减小post-quantized模型的量化误差。Atom采用了混合精度和动态量化激活的策略。值得注意的是,它扩展了这种方法,将KV缓存量化为INT4,以提高吞吐量性能。LLM-FP4努力将整个模型量化为FP4格式,并引入了预移位指数偏置技术。该方法将激活值的比例因子与权重相结合,以解决异常值带来的量化问题。BiLLM代表了迄今为止最低位PTQ的工作之一。BiLLM识别了权值的钟形分布和权值Hessian矩阵的异常长尾分布。在此基础上,提出了将基于Hessian矩阵的权重结构分类为显著值和非显著值,并分别进行二值化。因此,BiLLM可以将大模型广泛量化到1.08位,且不会显著降低困惑度。KVQuant通过在校准集上离线导出最优数据类型,提出了KV缓存量化的非均匀量化方案。KIVI提出了一种无需调优的2bit KV缓存量化算法,该算法利用单通道量化用于key cache,利用单token量化进行value cache。Li等进行了全面的评估,评估了量化对不同张量类型(包括KV Cache)、各种任务、11种不同的大模型和SOTA量化方法的影响。
Quantization-Aware Training
:QAT在模型训练过程中考虑了量化的影响。通过集成复制量化效果的层,QAT有助于权重适应量化引起的错误,从而提高任务性能。然而,训练大模型通常需要大量的训练数据和计算资源,这对QAT的实施构成了潜在的瓶颈。因此,目前的研究工作集中在减少训练数据需求或减轻与QAT实施相关的计算负担的策略上。为了减少数据需求,LLM-QAT引入了一种无数据的方法,利用原始FP16的大模型生成训练数据。具体来说,LLM-QAT使用词表中的每个token作为生成句子的起始标记。基于生成的训练数据,LLM- QAT应用了基于蒸馏的工作流来训练量化的LLM,以匹配原始FP16大模型的输出分布。Norm Tweaking只针对那些在语言类别中占最高比例的语言,做了起始标记的限制选择。这一策略可以有效地提高量化模型在不同任务上的生成性能。
为了减少计算量,许多方法采用高效参数微调(parameter-efficient tuning,PEFT)策略来加速QAT。QLoRA将大模型的权重量化为4位,随后在BF16中对每个4位权重矩阵使用LoRA来对量化模型进行微调。QLoRA允许在一个只有30GB内存的GPU上对65B参数的大模型进行有效的微调。QALoRA则提出在QLoRA中加入分组量化。作者观察到QLoRA中量化参数的数量明显小于LoRA参数的数量,这会导致量化与低秩自适应之间的不平衡。他们建议,组级别的操作可以通过增加专用于量化的参数数量来解决这个问题。此外,QA-LoRA可以将LoRA项合并到相应的量化权矩阵中。LoftQ指出,在QLoRA中用零初始化LoRA矩阵对于下游任务是低效的。作为一种替代方案,LoftQ建议使用原始FP16权重与量化权重之间差距的奇异值分解(Singular Value Decomposition,SVD)来初始化LoRA矩阵。LoftQ迭代地应用量化和奇异值分解来获得更精确的原始权重近似值。Norm Tweaking提出在量化后训练LayerNorm层,并使用知识蒸馏将量化模型的输出分布与FP16模型的输出分布进行匹配,达到类似LLM-QAT的效果,同时避免了较高的训练成本。
对比实验与分析
:本综述的作者对不同场景下的weight-only quantization技术所产生的加速效果。作者使用了LLaMA-2-7B和LLaMA-2-13B,并使用AWQ将它们的权重量化至4-bit。作者使用NVIDIA A100进行实验,并使用TensorRT-LLM和LMDeploy这两个推理框架部署量化后的大模型。然后,作者评估了这些推理框架在不同的输入序列上实现的加速,这些序列是批大小和上下文长度不同的。prefilling延迟、decoding延迟端到端延迟的加速效果,如表4所示。
表4:大模型加速效果对比
实验结果表明:(1)Weight-only quantization可以在decoding阶段加速,进而实现端到端的加速。这种提升主要源于从高带宽内存( High Bandwidth Memory,HBM)更快地加载具有低精度权重张量的量化模型,这种方法显著减少了内存访问开销。(2)对于prefilling阶段,weight-only quantization可能会增加延迟。这是因为prefilling阶段的瓶颈是计算成本,而不是内存访问开销。因此,只量化没有激活的权重对延迟的影响最小。此外,如图9所示,weight-only quantization需要将低精度权重去量化到FP16,这会导致额外的计算开销,从而减慢prefilling。(3)随着批量大小和输入长度的增加,weight-only quantization的加速程度逐渐减小。这主要是因为,对于更大的批处理大小和输入长度,计算成本构成了更大比例的延迟。虽然weight-only quantization主要降低了内存访问成本,但随着批量大小和输入长度增大,计算需求变得更加突出,它对延迟的影响变得不那么显著。(4)由于内存访问开销与模型的参数量规模相关,weight-only quantization为参数规模较大的模型提供了更大的好处。随着模型的复杂度与尺寸的增长,存储和访问权重所需的内存量也会成比例地增加。通过量化模型权重,weight-only quantization可以有效地减少内存占用和内存访问开销。