23年12月来自CMU的论文“Towards Efficient Generative Large Language Model Serving: A Survey from Algorithms to Systems“。
在人工智能(AI)快速发展的格局中,生成式大语言模型(LLM)站在最前沿,彻底改变了与数据的交互方式。然而,部署这些模型的计算强度和内存开销在服务效率方面带来了巨大挑战,特别是在要求低延迟和高吞吐量的场景中。该综述从机器学习系统(MLSys)的研究角度解决了对高效LLM服务方法的迫切需求,是人工智能创新和实用系统优化的关键。本文提供深入的分析,涵盖一系列解决方案,从尖端的算法修正到系统设计的突破性变化。
LLM的快速发展在很大程度上归功于GPU架构和其他加速器的发展,对提高模型性能和效率是不可或缺的。GPU已成为该领域的基石,主要是由于其卓越的并行处理能力。与设计用于顺序处理的传统CPU不同,GPU由数千个小型高效内核组成,这些内核设计用于同时处理多个任务。这使得它们非常适合在深度学习计算中普遍存在的矩阵和向量运算,尤其是基于Transformer的模型。
典型的GPU体系结构包括一个流多处理器(Streaming Multiprocessors,SM)阵列,每个处理器包含几个共享公共指令单元但并行执行独立线程的核心。此外,每个SM内的共享存储器(SRAM)允许线程之间有效的数据交换和同步,从而显著优化LLM计算中所需的存储器访问模式。这种设计对于LLM中的计算密集型任务特别有益,例如Transformer中的自注意和前馈网络的计算。GPU还配备了高带宽内存(HBM),允许更快的数据传输速率,显著减少大规模计算过程中内存访问相关的瓶颈。此外,最新的GPU架构,如NVIDIA的Ampere和Hopper架构,继续提供增强功能,并突破LLM计算的界限,如改进的内存带宽和容量、更高的每秒浮点运算(FLOPS)、专门的混合精度计算单元(即Tensor Core)和更高效的资源利用,进一步加速LLM的性能。其中一些支持各种精度格式,包括FP32(32位浮点)、TF32(TensorFloat-32)、FP16(16位浮点),BF16(Brain浮点),甚至INT8/INT4,允许在计算速度和数值精度之间进行灵活的权衡,这对优化LLM性能至关重要。
除了GPU,LLM部署还探索了大量硬件平台,包括CPU[19222]、移动和边缘设备[71]、ASIC[202,307],以及TPU[136]、FPGA[284]等专用加速器,以及来自不同制造商的其他新兴AI芯片(例如,Apple M2 Ultra[151]、AWS Inferentia[6]、SambaNova[28]、Cerebras[73]、Graphcore IPU[16])。这项综述主要强调了基于GPU使用的研究,以及推动这一重点的几个技术动机。由于其架构创新和卓越的计算能力,GPU在过去几年中主导了大规模深度学习的研究领域[42]。此外,GPU的编程语言,如NVIDIA的CUDA和AMD的ROCm,有助于对线程分层结构进行细粒度控制,使研究人员能够利用GPU固有的巨大并行性。它吸引了许多开发人员在GPU之上构建成熟的软件生态系统,促进了大多数开创性的高级LLM研究。虽然其他硬件平台确实为特定环境带来了独特的优势,但以GPU为中心的大量研究、开发和部署,使它们成为深入理解LLM推理方法的不可或缺的参考。考虑到硬件的相似性,其他硬件平台也可以从本综述中讨论的设计理念、见解和方法中受益。
LLM推理,特别是在GPT(Generative Pre-trained Transformer)等模型中,通常采用自回归解码方法。这种方法是这些模型如何生成文本的核心,确保生成的每个新词或token都考虑到迄今为止生成的整个序列。如下面算法1所示自回归解码,给定所有先前的tokens,顺序预测序列下一个token。
在这里𝑃 (𝑦|𝑋𝑡 −1) 表示给定当前序列𝑋𝑡 −1下一个token 𝑦 的概率,而⊕表示串联运算。argmax函数用于在每个步骤中选择最可能的下一个token。
这种自回归方法是LLM推理中生成连贯且符合上下文文本的基础。它确保生成的每个token都以以前生成的所有内容全面理解为条件,使LLM能够生成高度相关和流畅的文本序列。先前的研究已经对基于Transformer的LLM推理的算法强度(例如,计算FLOPS、I/O和内存开销)进行了深入分析,并根据自回归解码算法执行,对成本估计(例如,对推理延迟建模[50])进行了广泛的实证结果。LLM推理的优化是一个复杂的问题,因为不同的算法配置和系统设置可能存在不同的优化策略。
如下是LLM推理方法的分类:
算法创新
1 解码器算法
如图解码器算法的示意图:(a)自回归;(b)非自回归;(c)早期结束;(d)试探;(e)级联推理。
现有LLM的一个主要限制是默认的自回归解码机制,该机制按顺序逐个生成输出token。为了解决这个问题,一个有代表性的工作是放弃自回归生成范式,并行解码输出token。非自回归解码[97,104,108]首先被提出用于机器翻译加速,在解码过程中打破单词相关性并假设一定程度的条件独立性。为了缓解翻译质量的降低,一些后续研究,如半自回归解码[98],对输出依赖性进行建模[105,294]或迭代细化输出token[152],进一步扩展这些非自回归方法,达到自回归模型质量。到目前为止,由于不知道输出tokens之间的条件依赖性,尽管解码速度有所提高,但大多数非自回归方法的输出质量仍然不如自回归方法可靠。
另一项工作是利用试探执行[47]和提高解码并行性来解决顺序执行的限制。自回归LLM推理过程中的每个解码步骤都可以被视为具有条件分支的程序执行,例如决定下一步生成哪个token。已经提出试探解码[51,155]方法,以便以有效的方式(例如,使用有较少模型参数的较小草案模型)首先对多个步骤进行解码预测,并与LLM同时验证这些预测。然而,当将试探解码应用于LLM时,仍然存在一些实际挑战,例如,如何使解码预测足够轻且准确,以及如何使用LLM实现高效的并行验证。试探解码的主要优点是它在不改变输出的情况下增加了并行性。这种保证来自这样一个事实,即预测输出总是由原始LLM验证,并且当预测出错时,备案(fallback)机制[145]会生效。
一些研究试图利用现有LLM的深度多层架构,并利用早期结束[243]机制来加速解码过程。直觉是,早期模型层的输出有可能自信地推断目标分布。它们可以基于内部分类器而不是运行整个LLM来发出预测,并且已经探索了各种结束条件[117,147,163,167,234,272,282,291,308]。它们也被称为自适应计算(adaptive computation)[68,219],因为调整每个请求的计算量摊销总推理成本,即,为更容易的推理请求更少的计算。从广义上讲,这些方法大多局限于内部表示的信息不足,并且可能无法忠实地做出准确的预测。
由于推理请求的复杂性不同,级联推理采用了一套不同规模的LLM来最小化响应时间。CascadeBERT[157]不是直接对每个查询使用大模型,而是涉及一系列对应于不同模型深度的内部分类器,以级联方式组织它们,并根据实例难度自适应地选择合适的分类器。Tabi[257]针对服务判别式模型(非生成式LLM)进行了优化,但它采用了类似的方法来合并小模型和LLM,处理具有不同置信度的查询。Frugal-GPT[53]利用基于学习的方法自适应地将查询分配给不同的LLM API,从而优化成本和性能。总体而言,级联推理是提高推理效率的一个很有前途方向,但设计一个准确的调度机制,避免影响模型质量仍然具有挑战性。
2 架构设计
•配置缩减:为了降低LLM推理的计算成本,一种直接的方法是缩减模型配置,例如使用浅编码器[101183]或解码器[137]、权重共享和词汇收缩[225]。然而,减少模型参数的数量也会影响下游任务的性能。
•注意简化:与自注意计算相关的一个突出挑战是计算复杂性O(𝐿^2) ,与输入序列长度𝐿成二次方比。已经提出了许多Transformer变体[240],将标准注意简化为超长序列任务的更有效替代方案,如稀疏化[289]、核化[139]和分解[254]。最近,有一种趋势是借用先前注意简化方法的思想,将它们进行推广和组合,缩短上下文,降低KV缓存(cache)大小和注意复杂性,同时略微降低解码质量(例如,滑动窗口注意[129,299]、基于哈希的注意[198]、膨胀注意[74])。这些方法中的一类是上下文压缩,将上下文压缩为更少的软token(例如,用摘要tokens[58]或地标tokens[184]代替,利用额外的auto-encoder方案[95,169]),或者基于不同的重要性指导直接丢弃或重新表述不重要的上下文tokens[85,130,159,186](或称为语义压缩)。例如,自适应稀疏注意[36]采用基于学习的方法动态消除每个token信息不足的上下文tokens。Scissorhands[170]和H2O[301]选择一些可能对未来解码过程产生重大影响的重要tokens,并保存它们的KV缓存(cache)。StreamingLLM[269]对初始tokens进行赋值,并用滑动窗口对其进行维护,也似于先前的工作[41]。FastGen[94]允许不同的注意头自适应地使用不同的强调模式。
如表展示了四类具有代表性的方法其稀疏注意模式及其应用。然而,由于上下文不完整,这些方法在注意分布更复杂的真实工作负载中,可能面临不可避免的信息丢失。
•激活共享:另一个方向是共享中间激活,以提高注意计算效率。注意共享方法[160,263,270]观察不同层注意矩阵分布之间的相似性,并重用这些注意矩阵以降低计算成本。多查询注意(MQA)[220]使不同的头共享一组K和V,减少增量推理中的内存带宽要求。组查询注意(GQA)[32]将K和V限制从单个集合放宽到多个集,并且每个集合都与一组查询相耦合。它们已被最近的几个公共LLM成功采用,并显示出其优越的性能,包括基于MQA的模型,如Falcon[315]、PaLM[62]、ChatGLM2-6B[7]和基于GQA的模型,例如LLaMA-2[247]和Mistral-7B[129]。
•条件计算:稀疏激活的专家混合(MoE)[64,221]范式将模型的能力划分为各种“专家”,这些“专家”是较小的神经网络,每个神经网络专门处理不同的数据子集。它允许系统仅基于某些路由机制[83,154,192,212,218,309]为给定输入调用必要的专家,而不是在整个大模型上进行计算,从而产生计算和内存的高效[77]。例如,TaskMoE[148]表明,与token级路由相比,task级路由能够提高模型的容量,同时提高推理吞吐量。随着LLM的不断发展,MoE架构成为确保未来LLM可扩展性和效率的一个很有前途的途径。与此同时,MoE的动态特性也要求分布式通信[116,122,123,156,193,207]和GPU内核实现[93,305]进行特殊的系统优化,提高MoE推理效率。
•递归单元:尽管递归神经网络(RNN)(如LSTM[212])往往难以捕捉序列中的长期依赖性[141],但仍有几种方法使用递归单元来取代Transformer模块,并在推理过程中实现线性计算和内存复杂性,如RWKV[200]和RetNet[235]。具体而言,与先前的方法不同,最近的研究探索大多建立在线性注意表示(即,线性Transformer[139]、无注意Transformer[292])上。改革后,用线性递归单元对tokens之间的交互进行建模(例如,状态空间模型[91,102,103,176],LRU[196]),其更容易维护可并行训练特性,克服了注意的O(𝐿^2) 瓶颈。它们的设计还由各种位置编码模块[231]、指数衰减机制[194]和一堆按token的非线性MLP[245286]或GLU[67]组成,提高模型表示能力。最近,在模型性能和计算效率方面,它们都显示出了有希望的结果。然而,递归单元能否成功取代LLM的Transformer仍然是一个悬而未决的问题(尤其是对于长序列)。
3 模型压缩
模型压缩技术,旨在通过创建更高效、更紧凑的模型来减少 LLM 的内存占用和计算要求,而不会显著降低性能。
系统优化
低比特量化
低比特量化技术,能够有效地表示模型权重和激活。使用更少的比特(即,小于32)来表示数值,显著减少了内存消耗,并加速了硬件平台上的推理。一种方法是量化LLM,这些量化方法可以简单地分为两个方向:量化-觉察训练(QAT)和训练后量化(PTQ)[280]。PTQ使用自定义CUDA内核[158199]或编译[302]以提高效率,如W8A16(即仅INT8权重量化和FP16或BF16激活)、GPTQ[88]中的W4A16、SmoothQuant[268]中的W8A8和W4A4[266],降低了模型权重[69、71、88、89、125、164]甚至激活[268,281,287],变成INT8或INT4的计算精度。硬件的发展也满足了这些要求。一个支持性的证据是,NVIDIA最近的体系结构,如Turing和Ampere,包括INT8和INT4张量核,而最新的Hopper体系结构禁用了INT4支持,但引入了FP8张量核以获得更好的数值精度(例如,H100 GPU可以达到FP8而不是FP32的60×TFLOPS)。现有方法通常采用各种量化函数,包括一致方法(即舍入到最近值)和非一致方法[143]。为了缓解低精度带来的性能损失,QAT在模型训练过程中集成了量化[70,171]。值得注意的是,由于底层系统实现中的挑战,与FP16[69]等传统精度水平相比,低精度量化方法可能导致推理速度较慢。虽然低精度方法显著降低了模型部署的资源需求,但也有研究表明,由于存在规模化定律,量化方法会对模型的推理性能产生显著影响[72]。此外,量化还被应用于上下文压缩(例如,CacheGen[169])和内存高效微调(例如,QLoRA[70]、PEQA[142]),从而降低了LLM推理的内存消耗。
并行计算
•模型并行:大多数模型并行方法首先被提出用于大规模DNN的分布式训练,尤其是基于Transformer的模型。例如,张量模型并行(TP)[227]将模型层(例如,注意、FFN)从内部维度(例如,头、隐藏层)拆分为多个部分,并将每个部分部署在单独的设备(例如,GPU)上。它可以通过并行计算显著降低推理延迟,并行计算广泛用于同一机器内的多个GPU,尤其是具有高速NVLink连接的场景。PaLM的推理[203]通过2D张量并行[252]扩展了大规模Transformer推理上的TP,并声称大集群(超过256个设备)的理论通信复杂度较低。对于只有K和 V一个头的多查询注意,它进一步涉及到混合张量划分策略的数据并行。流水线模型并行(PP)[189]在多个设备上按顺序排列这些模型层。每个设备负责一个流水线阶段,该阶段由多个连续的模型层组成。虽然PP可以显著增加每单位时间处理的输入量(吞吐量),但它并不像TP那样固有地减少从开始到结束(延迟)处理单个输入所需的时间。序列并行(SP)有各种不同的设计和实现,但其LLM推理的关键思想,是通过沿序列长度维度在多个GPU上划分长序列的处理,分配计算和存储负载[165]。不同的并行技术引入了不同程度的通信开销和计算延迟[124]。为了实现最佳性能和资源利用率,分布式训练的现有方法(例如Alpa[303]、FlexFlow[128,250]、Galvatron[179])已经广泛研究了自动并行。替换它们的成本模型来适应像[190]这样的Transformar模型自回归推理中可预测的运行时间,很容易将以前的自动搜索算法(例如,动态规划、整数线性规划)应用于LLM服务(例如,AlpaServe[162]、FlexFlow Serve[12]、SpotServe[178]),并在没有手动干预的情况下确定最有效的并行策略。除了有限的设备存储器(例如GPU DRAM)之外,还有一些方法[34,35,109,177,224]使卸载技术能够使用更大但更慢的存储器(例如CPU DRAM)来保存模型参数和KV缓存(cache)。
•去中心化推理:这一方法涉及模型和数据并行的结合,其中多个分散的自愿节点协作处理数据并推断输出。这种方法在硬件资源地理上分散的情况下尤其有用。受众包计算的启发,Petals[44]通过互联网使用协作的commodity GPU提供BLOOM-176B模型。分散推理为解锁运行LLM在那些被忽略的消费级GPU上开辟了一个新的方向,但也面临着一些实际挑战,如设备异构[132]、有限的计算和内存容量、低带宽网络[45]、容错和隐私保护[237]。
内存管理
高效的内存管理仍然是LLM服务面临的最前沿挑战,特别是考虑到Transformer架构固有的内存密集型特性。随着对长序列推理的需求不断增长,与模型权重和其他激活所需的工作空间相比,KV缓存的内存占用空间是一个主要的优化目标。随着KV高速缓冲存储器在增量解码过程中动态且不可预测地增长和收缩,简单的方法(例如,FasterTransformer)预先分配具有最大序列长度假设的连续存储器。对于1)具有不同请求长度的输入批次,和2)并行生成多个输出序列的复杂解码场景(例如,波束搜索beam search、并行解码),严重浪费了内存。vLLM[150]提出了分页注意,将KV缓存划分为不连续的内存块,并显著提高了批大小和吞吐量。SpecInfer[177]提出了树关注和深度-优先树遍历(depth-first tree traversal),消除共享相同前缀的多个输出序列冗余KV缓存分配。LightLLM[21]采用更细粒度的tokens级内存管理机制来进一步减少内存使用。然而,这种碎片化内存管理机制的开销带来了新的挑战。特别是在使用其他优化来提高批处理大小的情况下,这些细粒度的内存管理方法可能只提供边际吞吐量优势,同时大大放大了推理延迟。很明显,LLM推理中的内存减少与其他算法创新和系统级优化密切相关。虽然有些可能适用于特定的工作负载,但可能会相互抵消,导致整体性能下降。在LLM推理系统的存储效率和计算性能之间取得正确平衡,仍然是该领域的一个开放和紧迫的挑战。
请求调度
有效地调度传入的推理请求,对于优化LLM服务至关重要。请求调度算法,可以最大限度地提高资源利用率,保证响应时间在延迟服务级目标(service level objective,SLO)内,并有效地处理不同的请求负载。LLM服务的请求调度与通用ML服务技术有着共同之处,因为两者都旨在有效管理传入请求并优化资源利用率。这些常见方面包括动态批处理[33]、抢占(preemption)[114]、优先级[191]、交换[39]、模型选择[107]、成本效率[295]、负载平衡和资源分配[259]。然而,LLM服务也因其独特的特性而带来了独特的挑战,如庞大的模型大小、迭代自回归解码机制、未知的可变输出长度和上下文信息的状态管理。
早期的LLM服务系统(例如,NVIDIA Triton上的FasterTransformer)只支持请求级调度,这与以前的方法类似。Orca[285]首先注意到生成LLM与先前ML推理系统请求调度之间的差距。考虑到可变的输出序列长度,它以一个先到先服务(FCFS)顺序以迭代的粒度去调度引擎执行,并允许对选定的一组操作进行批处理,获得更好的硬件利用率。许多方法继承了选择性批处理和迭代级调度策略,如vLLM和RayLLM[27]中的连续批处理以及TensorRT LLM[25]中的飞行中批处理。此外,SpecInfer迭代地选择一批请求来执行一次迭代的试探(speculative)推理和验证,从而扩展到试探(speculative)解码。FastServe[261]专注于作业完成时间(JCT),并涉及迭代级抢占(preemption),优先考虑输入长度较短的请求,而不是FCFS。输入请求可变长度的初始迭代,引起分布式推理流水线气泡,SARATHI[31]专门针对此。为了使GPU计算饱和,它将输入提示拆分为均匀块,并在可能的情况下将块与其他请求的解码迭代相结合。DeepSpeed-FastGen也采用了这种方法,称为Dynamic SplitForce[9]。S3[134]涉及输出序列长度预测器,并有助于在GPU内存约束内调度更多的并发请求,实现更大的批大小和更高的推理吞吐量。
核优化
•核融合:为了减少核启动和内存访问的开销,核融合被以前的DNN框架和编译器广泛采用。由于LLM推理不需要反向计算,因此存在更多的核融合机会。几个临时的Transformer推理引擎(例如,FasterTransformer[2]、TenTrans[262]、TurboTransformer[82]、LightSeq[256]、ByteTransformer[293])和编译器(例如,Welder[226])建议融合,1)具有相同形状的GEMM(例如,查询、K和V的三个线性变换)和 2)与其他非GEMM内核(如残差连接)添加偏差,层归一化和激活函数(例如ReLU)。其中,融合多头注意核的优化已经得到了广泛的探索。
•定制注意:为了使注意操作在GPU上高效运行,定制或定制专门用于注意计算的GPU内核至关重要。例如,cuDNN提供了一个融合的多头注意内核API[23]。同时,一些改进是开源的,获得更多的性能提升。由于特殊的自回归解码机制,这些方法可以大致分为两类。一个是为第一次迭代(即初始/预填充/上下文/提示阶段),它并行处理来自输入提示的所有tokens。例如,xFormers[153]使用CUTRASS[24]将在线softmax技巧[61,181,206]扩展到整个注意计算。另一种是用于随后迭代(即,增量/解码/生成阶段),并且核每次迭代仅生成一个输出token。对于自回归解码,一种常见的做法是保存之前计算的K和V,以便在生成新tokens时只需要计算一个查询,而不是重新运行整个序列。该领域优化的主要方向是最大限度地提高线程占用率,最大限度地减少设备上高带宽内存(HBM)访问(即使用共享内存或寄存器[55])。它们通常在批量大小和头数维度上并行化(例如,FasterTransformer),分配工作负载。一些方法进一步将KV缓存划分为块来实现序列长度维度的并行化,但最终需要减少逐块的结果,如FlashDecoding[249]。随后的工作FlashDecoding++[120]去除部分softmax的这种同步,其引入预知的统一最大值。为了更好地利用线程,有必要根据工作负载选择适当的并行维度。
•采样优化:采样算法的选择会极大地影响LLM的生成质量。默认的贪婪采样总是选择具有最高概率的token。并行采样技术,如波束搜索(beam search),每次迭代保持固定数量(即波束宽度)的最高得分序列,有效地解码近似最优序列。各种随机采样技术(例如,top-𝑘 [81],top-𝑝 [119]、温度控制[140])已经被提出为更多样的输出引入随机性。然而,它们仍然面临着一些实际的系统挑战。一个是冗余KV缓存增加的内存压力,另一个是LLM大量词汇(即数万)导致的采样效率问题。例如,LightSeq[256]提供了一种高效的分层实现,将词汇表划分为𝑘 分组,使用一些GPU指令检索每个的候选者,然后重新排列这些候选,获得 top-𝑘 tokens。
•可变序列长度:LLM推理的另一个独特挑战是,序列的输入长度和输出长度都可能不同,而输出长度事先未知。加快推理的一种方法是一次处理一批中的多个序列。然而,当一批序列的输入长度可变时,通常会使用填充来使它们的长度都相同,进行批处理,会浪费计算和内存资源。为了缓解其中一些低效现象,可以采用各种策略。打包(Packing)技术[1,293]将序列存储到连续的存储器空间中,不进行填充,并且只在注意计算之前进行解包。Ragged tensor[84]进一步支持使用编译器生成的内核进行最小填充的计算。将序列分组为较小的计算粒度(例如,块[76])也是缓解填充tokens内存使用的可能解决方案。由于初始阶段和增量阶段的混合执行,分段输入提示[31]也给内存管理和请求调度带来了新的挑战。
•自动编译:大多数现有的LLM推理系统,都使用特定于供应商的库,作为后端,如cuBLAS、cuDNN和CUTRASS,提供了优化的核实现。为了进一步提高推理效率,其还在NVIDIA GPU上为特定LLM算子(例如注意)优化手动编写的内核。尽管有这些工作,使用自动DNN编译器的趋势仍然存在,如TVM(即Unity[213]、Relax[151]和TensorIR[86,283])、MLIR[138]、JAX[90]、OpenAI Triton[244]、TASO[127]和TorchInductor[264]。编译方法可以帮助发现潜在的更高效的算子实现(例如,表达式推导[304]),更重要的是,有助于适应替代硬件平台,包括移动和边缘设备、CPU、DL加速器和其他类型的GPU(例如,AMD GPU和Apple M2 Ultra)。
研究如表中几个具有代表性的基于GPU开源LLM服务系统的综合分析。该分析不包含一些流行的相关项目,包括1)用于其他硬件的专用解决方案(例如,PopTransformer[17]、CTranslate2[8]、lammap.cpp和ggml[14])和2)建立在其他系统之上的部署解决方案,如OpenLLM[26](vLLM)、xinference[30](ggml+vLLM+xFormers)、LMDeploy[20](FasterTransformer)、gpt-fast[15](PyTorch),DeepSpeed MII和DeepSpeed FastGen[11](DeepSpeed-Inference)以及RayLLM和RayServe[27](vLLM)。
本文比较这些最先进的LLM服务系统,并总结在几个方面的差异。
- 首先,这些系统大多支持张量并行,实现多GPU推理并提高系统性能。其中一些将来支持流水线并行或卸载,单独支持多节点或资源受限环境下的推理。
- 其次,部分系统借鉴Orca(Progressive Learning from Complex Explanation Traces of GPT-4),实现迭代级调度。
- 第三,研究了这些系统的注意核,包括初始阶段和增量阶段的实现。对于初始阶段,通常采用批量的通用矩阵乘法(GEMM,general
matrix multiply)方法(例如,cuBLAS、torch、Relay),有些则利用在线softmax技巧来减少HBM访问(例如,Flash
attention,xFormers)。
增量阶段更具挑战性,因为token生成方案导致较低的计算强度。为了提高GPU的利用率,FasterTransformer手动将注意计算(例如,线性投影、位置偏移、点积和softmax等)融合到单个高性能核模板中,并涉及多种核优化技术,如碎片内存缓存、用于降低的warp-shuffle指令,具有张量核和多精度支持的半矩阵乘法和累加(HMMA,half matrix multiplication and accumulation)。
FlexFlow Serve支持试探(speculative)解码,并提供一个基于树的并行解码核去验证这个试探tokens,其来自带零-内存冗余(Zero-memory Redundancy)和最大线程并行的多个序列(即来自多个小模型或不同波束或并行采样)。vLLM将KV缓存划分为页面来消除冗余内存使用,特别是在并行采样场景中,扩展了来自FasterTransformer的融合多头注意(MHA)核。LightLLM采取了一种后续方法,将KV缓存划分为更细粒度的逐token块。
请注意,仍有一些值得注意的方面没有讨论。例如,即使是最流行的Flash注意和Paged注意核,它们通常也会以不同的方式实现。TGI直接导入原始的Flash/Paged注意库,LightLLM采用OpenAI Triton实现的核,MLC-LLM通过TVM生成核,TensorRT LLM从FasterTransformer的融合注意核进行修改以支持分页注意。
另一个例子是关于输入-觉察核选择。对于初始阶段,TensorRT LLM根据上下文长度从cuBLAS和Flash注意中进行选择。除了注意计算之外,对于线性投影算子,最近还出现了用通用矩阵向量积(GEMV,general matrix-vector product)代替GEMM的趋势,更有效地处理小批量(即大小为1)的情况。这些系统还具有许多其他不同的功能,如编程语言(即C++、Python)、低精度支持(即FP16、INT8)、支持的硬件和模型。
总之,这些不同的设计和实现选择在很大程度上取决于它们的优先优化目标。例如,vLLM建议分页注意以提高批大小,从而获得更高的吞吐量(𝑇𝑝𝑡 ), 而FlexFlow Serve利用SpecInfer加速解码以降低延迟(𝐿𝑎𝑡 )。基本上,低延迟和高吞吐量是LLM服务系统中的双重优化目标,代表了互补但往往相互冲突的目标,需要一种平衡的策略来优化单个任务的快速响应和指定时间内最大化处理任务量之间的权衡。
最近的一些研究[66]进一步通过TTFT+TPT×输出序列长度来分解响应延迟,其中TTFT表示Time To First Token,TPOT表示Time Per Output Token。前者由初始相位处理速度驱动,而后者直接取决于增量解码中的每次迭代执行时间。区分这两个指标有利于LLM的服务提供商,从而产生不同的系统设计选择和用户体验(例如,更快的应用程序响应[169]、更长的提示[9])。
此外,降低财务成本也是一些LLM服务系统设计和实施的一个重要而实用的目标[178]。尽管不太可能有一个一刀切(one-size-fits-all)的解决方案,但未来的LLM服务系统将不断集成这些差异化的功能,从而不断提高系统效率和硬件利用率。
未来方向
• 硬件加速器的开发和增强。未来在提高生成 LLM 服务效率方面的进展可能会受到专用硬件加速器的开发和改进的显著推动,并辅以协调硬件和软件优化的共同设计方法。例如,将内存集成到更靠近处理单元的位置或优化芯片架构以更好地与 LLM 算法的数据流保持一致,可以大幅减少延迟和能耗。这种方法在最近的 GPU 进步中得到了体现,例如 NVIDIA 的 Hopper 架构 [4],它展示了 HBM 和 SRAM 容量、内存带宽、计算单元和对分带宽的改进,直接有利于 LLM 的处理。该领域的持续创新,可能涉及设计本质上适应生成式 LLM 的计算模式硬件,例如针对这些模型中普遍存在的注意机制和张量运算特定需求进行优化,最终影响 LLM 服务系统的设计和实现。
• 高效且有效的解码算法。开发更高效的解码算法可以大大提高服务效率。受高效利用 LLM 中大量知识的需求推动,未来的工作可以探索传统自回归方法的替代方法,并在保持解码质量的同时为实时应用解锁生成速度。一个有希望的方向是广义推测推理,因为它能够保持相同的生成质量。具体而言,小型推测模型可以推广到任何其他形式的方法,这些方法可以比 LLM 更有效地生成草稿tokens,例如知识检索器和用户定义函数 [177, 278]。例如,最近出现了一些后续工作,用早期退出 [37, 121, 279, 296] 或非自回归解码 [92, 96] 取代了草稿模型。总之,像推测解码这样的高效解码算法的开发与底层系统优化相结合,为提高生成 LLM 的服务效率提供了重要的机会。
• 长上下文/序列场景优化。随着 LLM 的应用不断扩展到更复杂的场景,处理更长的上下文或序列的需求也在稳步增长。为具有长序列工作负载的 LLM 提供服务需要解决算法和系统两方面的挑战。就 LLM 而言,当序列比训练期间观察到的序列更长时,即使启用相对位置编码 [56] 或在更长的语料库上进行微调 [38],它们也常常会出现长度泛化失败的情况。即使对于一些声称支持超长上下文的模型,研究也发现它们会遇到“中途丢失”的情况 [166]。当前的方法试图通过在保留相关信息的同时减少计算序列长度来缓解这种限制,例如检索增强 [275]、序列压缩 [131] 和缓存 [100]。对于 LLM 服务系统,更长的序列带来了关键的挑战,包括更多的内存消耗和 KV 缓存的访问,以及自注意的计算复杂度的二次增加。
• 研究替代架构。尽管 Transformer 模型和自注意机制目前主导 LLM 域,但探索替代架构是未来研究的一个有希望的方向。从历史上看,DL 领域一直见证着主导架构的不断更替,每次新的范式转变都会带来重大进步。鉴于这种趋势,重要的是要考虑其他可以提供独特优势的架构方法,尤其是对于提高计算效率而言。例如,一些最近的研究探索无注意方法 [46],使用纯 MLP(多层感知器)架构来取代注意机制。DNN 模型架构的演变不仅是一个自然的进步,也是发现更高效、更有效的构建 LLM 方法的必要探索。
• 复杂环境中部署的探索。随着 LLM 应用的扩展,未来的一个重要方向是探索和优化它们在各种复杂环境中的部署。这项探索超越了传统的基于云的部署,包括边缘计算、混合计算(结合云计算和边缘计算)、去中心化计算以及使用更实惠的资源(如现场实例)等场景。这些环境中的每一个都为 LLM 服务带来了独特的挑战和机遇。例如,边缘计算通过在更靠近源的地方处理数据来实现更快的响应时间和减少带宽使用,但它也带来了计算资源和存储容量有限的挑战。混合计算 [205] 提供了一种平衡的方法,但需要高级管理以有效地分配计算任务。去中心式计算为众包计算资源提供了一种有希望的途径,但它也带来了有关数据隐私和安全的额外考虑 [173, 298]。通过抢占资源 [178] 提供 LLM 服务可以显著降低资金成本,但需要容错机制来处理其固有的不可预测性和多变性,确保一致的性能和系统可靠性。成功应对这些复杂环境中的挑战对于实现更稳健、可扩展和高效的 LLM 应用至关重要。
• 自动适应特定需求。多样化的应用特定需求创造了广泛的创新 LLM 服务优化机会,例如参数高效的微调 [52、223、311]、从外部向量存储检索 [43]、在线学习和知识更新、多模态工作负载以及将不同的 LLM 功能链接在一起 [265]。这些独特的挑战还要求通过将优化空间扩展到整个 LLM 生命周期,包括数据采集和处理、AutoML [246] 和模型管理 [188]、资源分配和性能监控,将 LLM 服务技术自动、平稳地集成到现有的 IT 基础设施中。