Survey on Efficient Inference

题目:A Survey on Efficient Inference for Large Language Models

链接:https://arxiv.org/abs/2404.14294

论文首先介绍了模型制约LLM推理速度的三个要素:

  • 模型大小:主流大型语言模型通常包含数十亿甚至数万亿个参数。例如,LLaMA-70B模型包含700亿个参数,而GPT-3模型则扩展到1750亿个参数。这种相当大的模型尺寸显著增加了在大型语言模型推理过程中的计算成本、内存访问成本和内存使用量。


  • 注意力操作:在预填充阶段,自注意力操作在输入长度上表现出二次方的计算复杂度。因此,随着输入长度的增加,注意力操作的计算成本、内存访问成本和内存使用量迅速增加。


  • 解码方法:自回归解码方法一次生成一个token。在每个解码步骤中,所有模型权重都会从片外高带宽内存(HBM)加载到GPU芯片上,导致巨大的内存访问成本。此外,随着输入长度的增长,KV Cache的大小也会增加,可能会导致内存碎片化和不规则的内存访问模式。

感觉上面的分类不是很底层,比如说第一点,模型大小是由隐藏层维度、Transformer层的数量等方面决定的,它们也决定了访存的快慢,这和第三点讲到的东西有些重合了。

对推理加速方法的分类:

这篇综述对加速的大类划分和上一篇很像,但是在大类下面子类的划分就不太一样了。它同样是将大类划分成了数据级、模型级和系统级。

数据级的推理加速主要是输入压缩和输出组织。输入压缩就是减少prompt的量,从而缩短prefill的时间,有prompt剪枝、prompt摘要等方法;输出组织就是重新组织输出的方式,比如说先让LLM生成问题的关键点,然后再结合各个关键点来进行并行的回复。例如SOT方法在此基础上对关键点进行扩展时共享公共前缀。

感觉数据级的推理加速不太像正儿八经的推理加速,因为它没有改动推理的实际运行过程,只是改了整个系统的输入输出。后面的输出组织可能还有机会和改模型、改硬件逻辑有一些沾边。

模型级优化,本篇论文根据是否需要预训练来划分类别,也就是一类是从训练到推理的优化(设计新的Transformer结构),另一类是只优化推理(模型压缩)。

高效结构

也就是改进模型结构,包括改进FFN、改进self-attention和改用别的架构。整体架构:

Efficient FFN:

许多研究集中在将混合专家(MoE)技术集成到LLM中,以提高它们的性能,同时保持计算成本。MoE的核心思想是动态地为不同的输入token分配不同的计算预算。在基于MoE的Transformer中,使用了多个并行的FFNs,即专家,以及一个可训练的路由模块。在推理过程中,模型通过路由模块控制,为每个令牌选择性地激活特定的专家。
一些研究集中在FFN专家的构建上,主要关注优化获取专家权重的过程或使这些专家更轻量级以提高效率。

有的方法可以直接把非MoE 的LLM直接转成MoE版,它们把FFN划分成多组,每一个组就相当于一个专家。

高效FNN的方法集中在MoE,MoE就是靠不同的FFN来划分不同的专家,在进行推理之前先经过一个路由模块,选择激活哪个或者哪几个专家。所以,为什么没有其他的方式来提高FFN的效率呢,比如加快FFN时的访存?

Efficient Attention:

高效注意力主要分成两类,多查询注意力(MQA)和低复杂度注意力。

MQA已经比较熟悉了,就是多个头共享一组或几组KV,来节省显存占用。

低复杂度注意力的方式一个是kernel-based attention,通过内积或低秩近似等技术,降低了自注意力的计算复杂度;还有一个方式就是low rank,好像就是低秩近似?看起来对矩阵运算的要求比较高

除了高效FFN和高效attention之外,还有就是直接用非Transformer的结构了。论文作者对使用其他结构给予了较多的关注,也提到了将其他架构与注意力操作结合是一个有前景的方向。难道高效FFN和高效attention已经没什么前景了?

推理引擎

推理引擎的优化专门致力于加速模型的前向过程。LLM推理中的主要算子和计算图得到了高度优化。此外,提出了推测解码技术以在不降低性能的情况下加速推理速度,并引入了卸载技术以缓解内存压力。

优化计算图和算子,是由于推理过程中大部分时间都花在了attention和linear这两个部分

attention算子优化:

FlashAttention将整个注意力操作融合为一个单一的、内存效率高的操作,以减轻内存访问开销。输入矩阵(Q, K, V)和注意力矩阵被分割成多个块,这样就不用一次加载全部数据了。在Flash Attention基础上,FlashDecoding旨在最大化解码过程中的计算并行性。由于解码方法的应用,Q矩阵在解码过程中退化为一批向量,这使得如果并行性仅限于批次大小维度,那么填充计算单元变得具有挑战性。FlashDecoding通过引入序列维度的并行计算来解决这个问题。虽然这为softmax计算引入了一些同步开销,但它在并行性方面带来了显著的改进,特别是在小批次大小和长序列方面。随后的工作,FlashDecoding++ ,观察到在之前的工作中,softmax内的最大值仅作为防止数据溢出的缩放因子。然而,动态最大值会带来显著的同步开销。此外,广泛的实验表明,在典型的大型语言模型中,超过99.99%的softmax输入落在某个范围内。因此,FlashDecoding++提出基于统计数据预先确定缩放因子。这消除了softmax计算中的同步开销,使得可以在softmax计算的同时并行执行后续操作。上面翻译的啥也不是,看过FlashAttention,但是没看过FlashDecoding和FlashDecoding++

linear算子优化:

这部分内容直接翻译过来比较难看懂,凑活看一下吧。

线性算子优化 在LLM推理中,线性算子起着关键作用,执行特征投影和前馈神经网络(FFNs)。在传统神经网络中,线性算子可以抽象为通用矩阵-矩阵乘法(GEMM)操作。然而,在LLM的情况下,解码方法的应用导致维度显著降低,与传统的GEMM工作负载不同。传统GEMM的低级实现已经高度优化,主流LLM框架(例如,DeepSpeed [258]、vLLM [51]、OpenPPL [263]等)主要调用cuBLAS [264]提供的GEMM API进行线性算子操作。由于没有为减少维度的GEMM提供明确的定制实现,解码期间的线性算子效率低下。在TensorRT-LLM [222]的最新版本中,观察到一个显著的趋势,它引入了专门的通用矩阵-向量乘法(GEMV)实现,可能提高解码步骤的效率。最近的研究FlashDecoding++ [253]进一步解决了cuBLAS [264]和CUTLASS [265]库在处理解码步骤中小批量大小时的效率问题。作者首先引入了FlatGEMM操作的概念,以表示高度减少维度的GEMM工作负载(在FlashDecoding++中,维度大小< 8)。由于FlatGEMM提出了新的计算特性,传统的GEMM的瓦片策略需要修改才能应用。作者观察到,随着工作负载的变化,存在两个挑战:低并行性和内存访问瓶颈。为了解决这些挑战,FlashDecoding++采用了细粒度的瓦片策略来提高并行性,并利用双缓冲技术来隐藏内存访问延迟。此外,认识到典型LLM(例如,Llama2 [261]、ChatGLM [262])中的线性操作通常具有固定形状,FlashDecoding++建立了一个启发式选择机制。该机制根据输入大小动态选择不同的线性算子。选项包括FastGEMV [266]、FlatGEMM和cuBLAS [264]、[265]库提供的GEMM。这种方法确保了为给定的线性工作负载选择最有效的算子,可能会带来更好的端到端性能。
最近,将MoE FFN应用于增强模型能力已成为LLM的趋势[12]。这种模型结构也对算子优化提出了新的要求。如图15所示,在具有MoE FFN的Mixtral模型中,由于HuggingFace实现中未优化的FFN计算,线性算子主导了运行时间。此外,Mixtral采用的GQA注意力结构减少了注意力算子的运行时间比例,这进一步指出了优化FFN层的迫切需求。MegaBlocks [254]是第一个优化MoE FFN层计算的工作。该工作将MoE FFN计算公式化为块稀疏操作,并提出了定制的GPU内核以加速。然而,MegaBlocks专注于MoE模型的高效训练,因此忽略了推理的特点(例如,解码方法)。
现有的框架正在努力优化MoE FFN推理阶段的计算。vLLM [51]的官方仓库集成了Triton [267]中的融合内核,无缝移除了索引开销。

图级别优化:

图级别优化实际上就是算子融合,也就是将不同的操作融合在一起。

算子融合的好处在于减少访存、减轻内核启动开销、增加并行性,FlashAttention就是一种典型的图级别优化。

ByteTransformer 和 DeepSpeed也是图级别优化,它们提出将包括残差添加、层归一化和激活函数在内的轻量级操作符融合到前面的线性操作符中,以减少内核启动开销。因此,这些轻量级操作符在时间线上几乎不增加额外延迟地消失了。

投机解码:

投机推理核心思想是使用一个较小的模型,称为草稿模型,来高效预测接下来的几个token,然后并行使用目标LLM验证这些预测。这种技术旨在使LLM能够在通常单次推理所需的时间范围内生成多个标记。包括草稿构建和草稿验证两个步骤。

在投机解码方法中,草稿token的接受率显著受到草稿模型输出分布与原始LLM输出分布对齐程度的影响。因此,大量的研究努力被投入到改进草稿模型的设计上:DistillSpec直接从目标LLM中蒸馏出一个更小的草稿模型。SSD 包括自动从目标LLM中识别一个子模型(模型层的一个子集)作为草稿模型,消除了单独训练草稿模型的需要。SpecInfer 引入了一种集体增强调整技术,以使一组草稿模型的输出分布与目标LLM的输出分布对齐。前瞻解码涉及并行生成目标LLM的n-gram,以帮助生成草稿令牌。Medusa 对LLM的几个头进行微调,专门用于生成后续草稿令牌。

设计草稿模型方面的研究给人的感觉是非常灵活,不论是使用什么手段训模型,只要是能更接近原本模型的数据分布就可以。

另一种方向的研究就是设计更有效的草稿构建策略。传统方法通常产生一个草稿token序列,这给通过验证带来了挑战。Spectr 生成多个草稿token序列,并采用 k-顺序草稿选择技术来同时验证 k 个序列。这种方法利用了推测性采样,确保输出分布的等价性。同样,SpecInfer采取了类似的方法。然而,与 Spectr 不同的是,SpecInfer 将草稿令牌序列合并成一个“令牌树”,并引入了一种树形注意力机制进行验证。这种策略被称为“令牌树验证器”。

该论文对6中有代码的投机推理方法做了对比实验,包括Speculative Decoding (SpD)Lookahead Decoding (LADE), REST, Self-speculative Decoding(SSD) , Medusa 和 Eagle,其中效果最好的是Eagle。

个人感觉投机解码是一个可能更容易有成果的方向,因为它对硬件和系统只是要求不太高、实现路径也比较灵活。

Serving System

针对服务系统的优化旨在提高处理异步请求的效率。主要从内存管理、批处理、调度和分布式系统四个方面进行优化。

内存管理:

KV缓存的存储主导了LLM服务中的内存使用,特别是在上下文长度较长时。由于生成长度不确定,预先分配KV缓存存储空间是一个挑战。早期的实现通常基于每个请求预设的最大长度预先分配存储空间。然而,在请求生成提前终止的情况下,这种方法会导致显著的存储资源浪费。

为了解决这个问题,S3提出预测每个请求的生成长度上限,以减少预先分配空间的浪费。为了处理碎片化的存储,vLLM提出按照操作系统的方式以分页方式存储KV缓存。vLLM首先分配尽可能大的内存空间,并将其等分为多个物理块。当有请求到来时,vLLM以不连续的方式动态地将生成的KV缓存映射到预先分配的物理块上。通过这种方式,vLLM显著减少了存储碎片化,并在LLM服务中实现了更高的吞吐量。在vLLM的基础上,LightLLM使用更细粒度的KV缓存存储来减少不规则边界发生的浪费。LightLLM将一个标记的KV缓存视为一个单元,而不是一个块,这样生成的KV缓存总是饱和预分配的空间。

批处理:

批处理中的请求长度可以不同,导致当较短的请求完成而较长的请求仍在运行时,利用率低下。由于服务场景中请求的异步性质,可以缓解利用率低的情况。连续批处理技术通过在一些旧请求完成时批量处理新请求,来提高内存利用率。

ORCA是第一个在LLM服务中使用连续批处理技术的。每个请求的计算包括多个迭代,每个迭代代表一个prefill步骤或一个decode步骤。作者建议可以在迭代级别上对不同的请求进行批处理。该工作在线性运算符中实现了迭代级别的批处理,将不同的请求在序列维度上连接在一起。因此,与已完成请求相对应的空闲存储和计算资源被立即释放。vLLM将该技术扩展到注意力计算,使得具有不同KV缓存长度的请求可以一起批处理。

调度策略:

在LLM服务中,每个请求的工作长度表现出可变性,因此执行请求的顺序显著影响服务系统的吞吐量。当优先处理长时间请求时,会发生队首阻塞现象。具体来说,系统对长时间请求的内存使用会迅速增长,当系统耗尽其内存容量时,会阻碍后续请求。

ORCA、vLLM等采用先来先服务的策略;DeepSpeed-FastGen优先处理解码请求以提高性能;FastServe使用多级反馈队列(MLFQ)来优先处理剩余时间最短的请求;FastServe首先预测长度,并采用跳过连接的方式为每个请求找到适当的优先级。

这些调度策略要实现的目标就是当请求非常多导致资源不足时,要尽可能舍弃影响最小的请求,来满足对系统效率比较关键的请求。

该论文也对多个推理框架做了对比实验,包括vLLM、DeepSpeed、LightLLM和TensorRT-LLM。推理速度最快的是LightLLM。个人认为如果想要对服务系统做出优化,也是要从这几个推理框架的基础上做改进吧。

全文总结:

高效的大型语言模型(LLM)推理专注于减少在LLM推理过程中的计算、内存访问和内存成本,旨在优化效率指标,如延迟、吞吐量、存储、功率和能量。本综述提供了对高效LLM推理研究的全面回顾,提出了关键技术的见解、建议和未来方向。最初,我们介绍了一个包含数据级、模型级和系统级优化的分层分类法。随后,在这个分类法的指导下,我们仔细审查并总结了每个层级和子领域的研究。对于像模型量化和高效服务系统这样的成熟技术,我们进行了实验来评估和分析它们的性能。基于这些分析,我们为该领域的从业者和研究人员提供了实用的建议,并确定了有前景的研究途径。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值