大模型如何落地?
在快速发展的人工智能(AI)领域中,生成型大型语言模型(LLMs)站在前沿,彻底改变了我们与数据的互动方式。然而,部署这些模型的计算强度和内存消耗在提供效率方面提出了重大挑战,特别是在需要低延迟和高吞吐量的场景中。这篇综述从机器学习系统(MLSys)研究的角度出发,应对高效LLM服务方法论的紧迫需求,站在先进AI创新和实际系统优化的交汇点上。我们提供了深入的分析,涵盖了从尖端算法修改到系统设计的根本性变革的一系列解决方案。这篇综述旨在提供对高效LLM服务当前状态和未来方向的全面理解,为研究人员和实践者提供宝贵的见解,帮助他们克服有效LLM部署的障碍,从而重塑AI的未来。 https://www.zhuanzhi.ai/paper/c3dbc58e4807518391a872141c664117
生成型大型语言模型(LLMs)已成为推动人工智能(AI)重大进展的驱动力,并在广泛的语言相关任务中展现出卓越的性能。从机器翻译到情感分析、问答和文本生成,这些模型在理解、生成和操纵人类语言方面显示出了它们的能力。基于Transformer的架构,如GPT系列(Generative Pre-trained Transformer)[195]、LLaMA系列[247]以及其他最新的公开LLMs(例如,OPT [300]、BLOOM [260]、Mistral [129]、DeciLM [241]、Baichuan [277]、GLM [290])在这种范式转变中发挥了关键作用,彻底改变了自然语言处理(NLP)任务的处理方式。除了NLP,这些模型还在更广泛的应用领域中实现了转型,包括自动编程[54]、科学发现[135]、个性化数字助理[75]、创意艺术[208]以及下一代计算架构[197],展现了它们的多功能性和在各个行业的深远影响。
然而,LLMs的空前成功也带来了几个挑战,最值得注意的是,在服务过程中它们庞大的计算需求。巨大的模型规模和复杂性,加上对广泛计算资源的需求,已经阻碍了它们在实际应用中的广泛部署。这些模型对资源的密集型需求引发了关于能源消耗、可扩展性和可访问性的担忧,阻碍了它们在没有像大公司那样丰富计算资源的更广泛社区中的采用。
这篇综述旨在解决高效LLM服务的关键需求,并对研究界提出的应对这一挑战的多方面策略进行了全面探讨。我们深入考察了从算法创新到新型系统架构的整个解决方案范围,所有这些都旨在优化大型语言模型的推理过程。
目标 这项综述的主要目标是提供一个全面的概述,关于最新的LLM服务和推理方面的进展。我们将系统地回顾和分类现有技术,基于它们的底层方法,突出它们的优势和局限性。该综述将涵盖广泛的方法论,包括解码算法、架构设计、模型压缩、低比特量化、并行计算、内存管理、请求调度和内核优化。
** 结构 本文的结构如下**:第2节介绍LLM服务的背景信息。第3节包括我们对高效LLM服务现有方法的分类,从两个方面重新审视这些相关工作:算法创新(§ 3.1)和系统优化(§ 3.2)。之后,我们在第4节列出了一些代表性的LLM服务框架,并提供了分析。第5节讨论LLM服务系统的基准测试。第6节阐明了这项综述与其他相关文献之间的联系。最后,在第7节我们提出了一些提高生成型LLM服务效率的有前景的探索方向,以激发未来的研究。
分类法
目前提高LLM服务效率的努力大致可分为两类,包括算法创新和系统优化,这两类将分别进行讨论。 算法创新本节提供了对各种算法和技术的全面分析,这些算法和技术旨在优化语言模型推理效率。这些工作旨在通过算法进步解决大规模Transformer模型的固有性能缺陷。
** 解码算法**。在这一部分中,我们回顾了在图2中展示的优化LLMs推理过程的新颖解码算法。这些算法旨在减少计算复杂度,并提高语言模型推理在生成任务中的总体效率。
非自回归解码。现有LLMs的一个主要限制是默认的自回归解码机制,它逐个顺序生成输出标记。为解决这一问题,一种代表性的工作方向是放弃自回归生成范式,并并行解码输出标记。非自回归解码[97, 104, 108]首先为机器翻译加速提出,通过在解码过程中打破单词依赖并假设一定程度的条件独立性。为了减轻翻译质量的降低,一些后续研究如半自回归解码[98],通过模拟输出依赖[105, 294]或迭代细化输出标记[152],进一步扩展了这些非自回归方法。块状并行解码[230]在基础LLM中插入一个单一前馈层,以并行预测多个未来位置,然后退回到基模型验证的最长前缀。然而,这些方法需要昂贵地重建一个新的LLM以及新的依赖,或调整原始LLM的部分层,这并不总是可行的。最近的一些努力致力于在一个解码步骤中生成多个标记,无需对模型进行任何训练或修改。并行解码[217]将贪婪的自回归解码重构为可并行求解的非线性方程系统,利用雅可比和高斯-塞德尔固定点迭代方法进行快速推理。关于非自回归翻译的详尽综述[271]已经提出,以总结这一方向的最新进展。到目前为止,由于不了解输出标记之间的条件依赖性,尽管解码速度有所提高,但大多数非自回归方法的输出质量仍不如自回归方法可靠。
投机解码。另一项工作通过利用投机执行[47]并提高解码并行性,解决了顺序执行的限制。自回归LLM推理过程中的每个解码步骤都可以视为带有条件分支的程序执行,例如决定接下来生成哪个标记。已提出投机解码[51, 155],首先以高效的方式(例如,使用较小的草稿模型,模型参数较少)进行多步解码预测,并与LLM同时验证这些预测。然而,将投机解码应用于LLMs时仍然存在一些实际挑战,例如,如何使解码预测足够轻量且准确,以及如何使用LLMs实现高效的并行验证。SpecInfer [177]首次通过引入多个小型草稿模型以及一种新型基于树的投机推理和标记验证机制(被[48, 118, 168, 185, 229, 236, 274, 310]直接采用),提出了一个低延迟LLM服务系统实现(§ 4)。投机解码的主要优势是它在不改变输出的情况下增加了并行性。这种保证来自于预测输出总是由原始LLM验证,并且当预测出错时,回退机制[145]生效。
提前退出。其他一些研究试图利用现有LLMs的深层多层架构,并利用提前退出机制[243]加速解码过程。直觉是,早期模型层的输出有潜力自信地推断目标分布。它们可以基于内部分类器发出预测,而不是运行整个LLM,并且已经探索了各种退出条件[117, 147, 163, 167, 234, 272, 282, 291, 308]。它们也被称为自适应计算[68, 219],因为它们调整每个请求的计算量以摊销总推理成本,即对更容易的推理请求采取较少的计算。广泛来说,这些方法大多受限于内部表示携带的信息不足,可能无法忠实地进行准确预测。
级联推理。由于推理请求的复杂性不同,级联推理采用不同规模的LLM套件来最小化响应时间。CascadeBERT[157]涉及一系列与不同模型深度相对应的内部分类器,以级联方式组织它们,并根据实例难度适应性地选择合适的模型。Tabi[257]针对服务鉴别模型(即非生成型LLMs)进行了优化,但采取了类似的方法,结合小型模型和LLMs处理不同置信度的查询。FrugalGPT[53]利用基于学习的方法来自适应地将查询分配给不同的LLM API,优化成本和性能。一项同时进行的工作[312]联合优化了模型复用和查询缓存,并分析了最小化推理成本的最优性。Mixture-of-thought[288]将级联思想扩展到LLM推理任务以节省成本,它从Chain-of-Thought[258]和Program-of-Thought[57]提示中抽样答案。总体来说,级联推理是提高推理效率的有希望的方向,但设计准确的调度机制以避免损害模型质量仍然是一个挑战。
架构设计。这一小节探讨了针对大型语言模型的创新架构设计。研究人员已经提出了新颖的模型架构[115],超越了原始的Transformer,实现了模型规模、性能和效率之间的平衡,为更快和资源高效的推理开辟了新途径。
配置缩小:为了减少LLM推理的计算成本,一种直接的方法是缩小模型配置,例如使用浅层编码器[101, 183]或解码器[137],权重共享和词汇表缩减[225]。然而,减少模型参数的数量也会影响下游任务的性能。
注意力简化:与自注意力计算相关的一个突出挑战是计算复杂度O(𝐿^2),它与输入序列长度𝐿呈二次方增长。许多Transformer变体[240]被提出来将标准注意力简化为更高效的替代方案,用于非常长的序列任务,例如稀疏化[289]、核化[139]和分解[254]。最近,有一种趋势从之前的注意力简化方法中借鉴思想,将它们概括和结合起来,以缩短上下文,减少KV缓存的大小,以及注意力复杂度,同时略微降低解码质量(例如,滑动窗口注意力[129, 299]、基于哈希的注意力[198]、扩张注意力[74])。这些方法中的一个类别是通过压缩上下文到更少的软标记(例如,替换为摘要标记[58]或地标标记[184],利用额外的自编码器方案[95, 169])或直接根据不同的重要性指导[85, 130, 159, 186](或称为语义压缩)删除或改写不重要的上下文标记来进行上下文压缩。例如,自适应稀疏注意力[36]采用基于学习的方法来消除不必要的注意力。
提前退出。一些其他研究尝试利用现有LLMs的深层多层架构,并利用提前退出[243]机制来加速解码过程。其直觉是,早期模型层的输出有潜力自信地推断目标分布。它们可以基于内部分类器发出预测,而不是运行整个LLM,并且已经探索了各种退出条件[117, 147, 163, 167, 234, 272, 282, 291, 308]。这些方法也被称为自适应计算[68, 219],因为它们调整每个请求的计算量,以摊销总推理成本,即对更容易的推理请求采取较少的计算。然而,由于这些方法大多受限于内部表示携带的信息不足,可能无法忠实地进行准确预测。
级联推理。鉴于推理请求的复杂性不同,级联推理采用不同规模的LLM套件来最小化响应时间。而不是直接使用庞大的模型来处理每个查询,CascadeBERT[157]涉及一系列与不同模型深度相对应的内部分类器,以级联方式组织它们,并根据实例难度适应性选择合适的模型。Tabi[257]专为服务鉴别模型(即非生成型LLMs)进行了优化,但采用了类似的方法,将小型模型和LLMs结合起来处理不同置信度的查询。FrugalGPT[53]利用基于学习的方法自适应地将查询分配给不同的LLM API,优化成本和性能。一项同时进行的工作[312]联合优化了模型复用和查询缓存,并分析了最小化推理成本的最优性。Mixture-of-thought[288]将级联思想扩展到LLM推理任务,以节省成本,它从Chain-of-Thought[258]和Program-of-Thought[57]提示中抽样答案。总体而言,级联推理是提高推理效率的一个有前景的方向,但设计准确的调度机制以避免损害模型质量仍然是一个挑战。
架构设计。这一小节探讨了针对大型语言模型的创新架构设计。研究人员已经提出了新颖的模型架构[115],超越了原始的Transformer,实现了模型规模、性能和效率之间的平衡,为更快和资源高效的推理开辟了新途径。 * 注意力简化:自注意力计算的一个突出挑战是计算复杂度O(𝐿^2),随输入序列长度𝐿呈二次方增长。许多Transformer变体[240]被提出来将标准注意力简化为非常长的序列任务的更高效替代方案,例如稀疏化[289]、核化[139]和分解[254]。最近,有一种趋势从之前的注意力简化方法中借鉴思想,将它们概括和结合起来,以缩短上下文,减少KV缓存的大小,以及注意力复杂度,同时略微降低解码质量(例如,滑动窗口注意力[129, 299]、基于哈希的注意力[198]、扩张注意力[74])。这些方法中的一个类别是通过压缩上下文到更少的软标记(例如,替换为摘要标记[58]或地标标记[184],利用额外的自编码器方案[95, 169])或直接根据不同的重要性指导[85, 130, 159, 186](或称为语义压缩)删除或改写不重要的上下文标记来进行上下文压缩。例如,自适应稀疏注意力[36]采用基于学习的方法来消除非信息性上下文标记的动态化。
模型压缩。在这里,我们深入探讨了模型压缩技术,旨在通过创建更高效、更紧凑的模型,减少LLMs的内存占用和计算需求,同时不会对性能造成显著损失。
知识蒸馏:一种方法是知识蒸馏,它训练一个小型的学生模型,以大型的教师模型为监督。大多数之前的方法都在探索白盒蒸馏[106, 133, 214, 233, 255],需要访问整个教师模型的参数。由于基于API的LLM服务(例如,ChatGPT)的出现,一些黑盒蒸馏模型吸引了很多关注,例如Alpaca[238]、Vicuna[59]、WizardLM[273]等[201, 313]。这些模型通常具有更少的模型参数,但与原始LLMs(例如,GPT-4[195])相比,在各种下游任务上表现出了有前景的性能。
网络剪枝:过去几年中,网络剪枝方法[180, 215, 215]已被广泛研究,但并非所有方法都可以直接应用于LLMs。在考虑重新训练可能带来的过高计算成本以及评估剪枝是否基于底层系统的实现提高了推理效率方面,这是必不可少的。一些最近的方法[80, 149, 174, 216]将结构化剪枝方法应用于LLMs,删除整个结构化LLM组件,促进GPU加速。例如,Deja Vu[172]在不修改预训练模型的情况下,根据上下文稀疏性假设剪切特定的注意力头和MLP参数。还有一些最新的非结构化方法[40, 87, 232, 251, 276],通常实现LLM压缩的50-60%稀疏性。值得注意的是,它们可以进一步概括为半结构化N:M稀疏性(即2:4和4:8)[182],通过NVIDIA稀疏张量核心的加速实现显著的推理加速。LoSparse[161]和DSFormer[49]使用低秩分解将模型权重近似为一个小的密集矩阵和一个稀疏的半结构化矩阵。Flash-LLM[267]通过提供一种适用于非结构化剪枝的内存高效SpMM实现放宽了这一要求。PowerInfer[228]假设这些稀疏激活神经元的偏向访问,并提出了一个GPU-CPU混合推理引擎,让GPU和CPU处理不同的神经元。
系统优化本节研究LLM推理系统优化技术,以加速LLM推理,而无需修改LLM计算语义。这一系列工作的目标是通过改进用于大型语言模型推理的底层系统和框架,提高系统效率。 低比特量化。本节探讨了最先进的低比特量化技术,这些技术能够高效地表示模型权重和激活。通过使用更少的比特(即少于32比特)来表示数值,这些方法显著减少了内存消耗,并加速了硬件平台上的推理。一种方法是量化LLM,这些量化方法大致可以分为两个方向:量化感知训练(QAT)和训练后量化(PTQ)[280]。PTQ将模型权重[69, 71, 88, 89, 125, 164]甚至激活[268, 281, 287]的计算精度降低到INT8或INT4,通过使用自定义CUDA内核[158, 199]或编译[302]来提高效率,例如W8A16(即INT8仅权重量化和FP16或BF16激活),GPTQ中的W4A16[88],SmoothQuant中的W8A8[268]和W4A4[266]。硬件的发展也满足了这些要求。一个支持的证据是,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推理的内存消耗降低。
并行计算。本节检查了针对大型语言模型的并行计算策略。利用现代硬件架构的并行处理能力,这些方法将计算分布在多个核心或设备上,从而在推理期间显著加速。
内存管理。高效的内存管理仍然是LLM服务面临的主要挑战之一,特别是考虑到Transformer架构固有的内存密集型特性。随着对长序列推理需求的增长,与模型权重和其他激活所需工作空间相比,KV缓存的内存占用成为了优化的主要目标。由于KV缓存内存在增量解码过程中动态且不可预测地增长和缩小,简单的方法(例如,FasterTransformer)是预先分配一块连续的内存,假设最大序列长度。这对于1)请求长度不同的输入批次和2)并行生成多个输出序列的复杂解码场景(例如,波束搜索、并行解码)来说,严重浪费了内存。vLLM[150]提出了分页注意力,将KV缓存划分为非连续的内存块,显著提高了批量大小和吞吐量。SpecInfer[177]提出树状注意力和深度优先树遍历,以消除共享相同前缀的多个输出序列的冗余KV缓存分配。LightLLM[21]采用更精细的标记级内存管理机制,进一步减少了内存使用。然而,这种碎片化内存管理机制的开销带来了新的挑战。特别是在其他优化用于提高批量大小的情况下,这些细粒度内存管理方法可能只提供边际吞吐量收益,同时大幅增加了推理延迟。显然,LLM推理中的内存减少与其他算法创新和系统级优化密切相关。虽然有些方法可能对特定工作负载效果很好,但它们可能相互抵消,导致整体性能下降。在内存效率和LLM推理系统的计算性能之间找到正确的平衡仍然是该领域的一个开放而迫切的挑战。
请求调度。高效地调度传入的推理请求对于优化LLM服务至关重要。本节回顾了最大化资源利用、保证在延迟服务水平目标(SLO)内的响应时间,并有效处理不同请求负载的请求调度算法。LLM服务的请求调度与一般的ML服务技术有共同之处,因为两者都旨在高效管理传入的请求并优化资源利用。这些共同方面包括动态批处理[33]、抢占[114]、优先级[191]、交换[39]、模型选择[107]、成本效率[295]、负载平衡和资源分配[259]。然而,由于其独特的特性,如庞大的模型规模、迭代式自回归解码机制、未知的可变输出长度和上下文信息的状态管理,LLM服务也带来了独特的挑战。
早期的LLM服务系统(例如,NVIDIA Triton上的FasterTransformer)仅支持与之前方法类似的请求级调度。Orca[285]首先注意到了生成型LLMs与之前ML推理系统的请求级调度之间的差距。考虑到可变的输出序列长度,它在迭代粒度上调度引擎执行,并以先来先服务(FCFS)的顺序,使得选定的操作集批处理,以更好地利用硬件。许多后续方法继承了选择性批处理和迭代级调度策略,例如vLLM和RayLLM[27]中的连续批处理以及TensorRT-LLM[25]中的流程批处理。此外,SpecInfer通过迭代选择一批请求来执行一次推测推理和验证,扩展到了投机解码。FastServe[261]关注作业完成时间(JCT),涉及迭代级抢占,以优先处理输入长度较短的请求,而不是FCFS。SARATHI[31]针对分布式推理中由不同长度输入请求的初始迭代引起的管道泡沫。为了饱和GPU计算,它将输入提示划分为均匀块,并在可能的情况下,将块插槽与其他请求的解码迭代结合起来,这也被DeepSpeed-FastGen称为动态SplitFuse[9]采用。S3[134]涉及输出序列长度预测器,并帮助在GPU内存限制内安排更多并发请求,以实现更大的批量大小和更高的推理吞吐量。
内核优化。在本小节中,我们深入探讨了针对特定操作的内核级优化,这些优化针对语言模型推理管道中的关键计算内核。这些优化利用硬件特定特性和软件技术来加速关键计算内核。
软件框架
生成型LLM服务需要一系列优化,许多最新工作已经开始开发软件框架,以提供高效的LLM推理部署服务。下面,我们将重新审视这些系统,并对几个代表性的开源GPU基础上的LLM服务系统进行全面分析,如表2所示。这些分析不包括一些流行的相关项目,包括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学习,并实现了迭代级调度。第三,我们调查了这些系统的注意力内核,并分别介绍了它们在初始和增量阶段的实现。对于初始阶段,它们通常采用批量通用矩阵乘法(GEMM)方法(例如,cuBLAS、torch、Relay),有些利用在线softmax技巧减少HBM访问(例如,Flash-attention、xFormers)。增量阶段更具挑战性,因为每个标记的生成方案导致较低的计算强度。为了提高GPU利用率,FasterTransformer手动融合了注意力计算(例如,线性投影、位置偏差、点积、softmax等)到一个高性能的内核模板中,并涉及多种内核优化技术,例如使用共享内存的缓存、用于归约的warp-shuffle指令、张量核心的半矩阵乘法和累加(HMMA)以及多精度支持。FlexFlow-Serve启用了投机解码,并提供了一个基于树的并行解码内核,以零内存冗余和最大线程并行性验证来自多个序列(即来自多个小型模型或不同波束或并行采样)的推测标记。vLLM从FasterTransformer扩展了融合的多头注意力(MHA)内核,通过将KV缓存分割成页面来消除冗余内存使用,特别适用于并行采样场景。LightLLM采用后续方法,将KV缓存划分为更细粒度的标记级片段。
值得注意的是,上述讨论并未涵盖其他一些值得注意的方面。例如,即使对于最受欢迎的Flash和Paged注意力内核,它们通常在这些系统中以不同方式实现。TGI直接导入了原始的Flash/Paged注意力库,LightLLM采用了OpenAI Triton实现的内核,MLC-LLM通过TVM生成内核,TensorRT-LLM修改了FasterTransformer的融合注意力内核以支持分页注意力。另一个例子是关于输入感知内核选择。对于初始阶段,TensorRT-LLM根据上下文长度从cuBLAS和Flash注意力中选择。除了注意力计算外,对于线性投影运算符,最近有一种趋势是用通用矩阵-向量乘积(GEMV)替换GEMM,以更有效地处理小批量大小(即1)的情况。这些系统还具有许多其他不同的特性,如编程语言(即C++、Python)、低精度支持(即FP16、INT8)、支持的硬件和模型。总之,这些不同的设计和实现选择主要取决于它们优先考虑的优化目标。例如,vLLM提出分页注意力以提高批量大小,从而实现更高的吞吐量(𝑇𝑝𝑡),而FlexFlow-Serve利用SpecInfer加速解码以降低延迟(𝐿𝑎𝑡)。基本上,低延迟和高吞吐量是LLM服务系统的双重优化目标,代表了互补但往往相互冲突的目标,需要平衡策略来优化个别任务的快速响应和在特定时间框架内处理的任务量最大化之间的权衡。一些最近的研究[66]进一步将响应延迟分解为TTFT+TPOT × 输出序列长度,其中TTFT代表首个标记的时间,TPOT代表每个输出标记的时间。前者由初始阶段处理速度驱动,而后者直接取决于增量解码期间的每次迭代执行时间。区分这两个指标对LLM服务提供商有益,导致不同的系统设计选择和用户体验(例如,更快的应用响应性[169],更长的提示[9])。此外,降低货币成本也是一些LLM服务系统的设计和实现的重要且实际目标[178]。尽管不太可能有一种适用于所有情况的解决方案,但我们相信未来的LLM服务系统将继续整合这些不同的特性,从而不断提高系统效率和硬件利用率。
结论
高效的LLM服务是实现普及先进人工智能技术的基本步骤。本综述旨在为研究人员、实践者和开发者提供对现有方法论的全面理解,使他们在实际环境中部署LLM时能够做出明智的决策。通过汇总算法和系统方面的最新研究成果,本文希望加速进步,并在追求高效LLM服务解决方案的过程中促进创新。