论文解读-面向高效生成大语言模型服务:从算法到系统综述

一、简要介绍

在快速发展的人工智能(AI)领域中,生成式大型语言模型(llm)站在了最前沿,彻底改变了论文与数据交互的方式。然而,部署这些模型的计算强度和内存消耗在服务效率方面带来了重大挑战,特别是在要求低延迟和高吞吐量的场景中。本调查从机器学习系统(MLSys)研究的角度,解决了对高效LLM服务方法的迫切需求,这是先进人工智能创新和实际系统优化的关键。论文提供深入的分析,涵盖了一系列的解决方案,从尖端的算法修改到系统设计的突破性变化。该调查旨在全面了解高效LLM服务的现状和未来发展方向,为研究人员和从业人员克服有效部署LLM的障碍提供有价值的见解,从而重塑人工智能的未来。

二、背景

2.1基于transformer的LLM

其中,dk是键的维度。这种机制允许模型为输出的每个元素关注输入序列的不同部分,捕获复杂的依赖关系,而不管它们在输入序列中的距离如何。 Transformer的另一个重要结构是前馈网络(FFN),它存在于transformer的每一层,对其计算强度有重要贡献。FFN通常由两个线性变换组成,中间有一个非线性激活函数,通常表示为:

这里,W1、W2、b1和b2是FFN的可学习参数,而非线性函数max(0,·)(ReLU,在本例中)在模型中引入了必要的非线性,允许它学习更复杂的模式。FFN负责模型的参数计数的很大一部分,因此,还负责它的内存占用和计算负载。在每个transformer层中,在多头注意(MHA)聚合了来自输入的不同部分的信息后,FFN为每个位置独立地处理这些聚合的信息。这种并行处理能力是transformer的一个关键优势,允许它有效地处理序列。然而,这也意味着计算负载和内存需求随着输入序列的长度和网络的深度而变化。 在基于transformer的LLMs中,自注意和FFN的结合使这些模型能够捕获广泛的语言上下文和细微差别,并在各种NLP任务中设置新的基准。然而,对训练和推理的大量计算需求已经成为一个关键的研究领域,重点是在不显著影响性能的情况下优化这些方面。transformer模型还包括其他关键组件,如位置编码,位置编码添加了关于每个token在序列中的位置的信息,以及多头注意机制,它允许模型在不同的表征空间中关注序列的不同部分。

2.2 GPU和其他加速器

llm的快速发展在很大程度上要归功于GPU架构和其他加速器的发展,这是提高模型性能和效率不可或缺的一部分。GPU(图形处理单元)已经成为这一领域的基石,主要是由于其优越的并行处理能力。与传统的为顺序处理而设计的CPU不同,GPU由数千个小型、高效的核心组成,它们被设计用于同时处理多个任务。这使得它们非常适合于在深度学习计算中无处不在的矩阵和向量操作,特别是对于基于transformer的模型。 一个典型的GPU架构包括一个流式多处理器(SMs)阵列,每个多处理器包含几个核心,它们共享一个共同的指令单元,但可以并行执行独立的线程。此外,每个SM中的共享内存(SRAM)允许线程之间的高效数据交换和同步,显著地优化了LLM计算中所需的内存访问模式。这种设计特别有利于llm中的计算密集型任务,如transformer中的自注意网络和前馈网络的计算。GPU还配备了高带宽内存(HBM),这允许更快的数据传输速率,显著减少了在大规模计算过程中与内存访问相关的瓶颈。此外,最新的GPU架构,如NVIDIA的Ampere和Hopper架构,继续提供增强和推动LLM计算的边界,如改进内存带宽和容量,更高的浮点运算(FLOPS),专门的混合精度计算单元(即张量核心)和更有效的资源利用,进一步加速LLM的性能。其中一些支持各种精度格式,包括FP32(32位浮点)、TF32(TensorFloat-32)、FP16(16位浮点)、BF16(脑浮点),甚至INT8/INT4,允许在计算速度和数值精度之间进行灵活的权衡,这对优化LLM性能至关重要。 除了 GPU, LLM部署已经探索了大量的硬件平台,包括 CPU, mobile and edge devices , ASIC,以及专门的加速器如TPU, FPGA,和来自不同制造商的其他新兴人工智能芯片(比如 Apple M2 Ultra, AWS Inferentia, SambaNova, Cerebras, Graphcore IPU)。这项调查主要强调了基于GPU使用的研究,而一些技术动机推动了这一重点。由于其架构创新和卓越的计算能力,GPU在过去的几年中主导了大规模深度学习的研究领域。此外,GPU的编程语言,如NVIDIA的CUDA和AMD的ROCm,有助于对线程层次结构的细粒度控制,允许研究人员利用GPU中固有的大规模并行性。它吸引了大量开发人员在这些GPU之上构建成熟的软件生态系统,促进了大部分开创性和先进的LLM研究。虽然其他硬件平台确实为特定的上下文带来了独特的优势,但以GPU为中心的大量研究、开发和部署库使其成为深入理解LLM推理方法的不可或缺的参考。考虑到硬件的相似性,其他硬件平台也可以从本调查中讨论的设计哲学、见解和方法中获益。

2.3 LLM推理

LLM推理,特别是在像GPT(Generative Pre-trained Transformer)这样的模型中,通常采用自回归解码方法。这种方法是这些模型如何生成文本的核心,它确保生成的每个新单词或标记都要考虑到迄今为止生成的整个序列。自回归解码的原理是顺序预测一个序列中的下一个token,给定所有之前的标记,如算法1所示。

这种自回归方法是LLM推理的基础,用于生成连贯的和上下文适当的文本。它确保生成的每个token都以对之前生成的所有内容的全面理解为条件,允许llm生成高度相关和流畅的文本序列。先前的研究对基于transformer的LLM推理的算法强度(如计算失败、I/O和内存消耗)进行了深入的分析,并根据自回归解码算法执行的成本估计(如建模推理延迟)进行了广泛的经验分析。LLM推理的优化是一个复杂的问题,因为不同的算法配置和系统设置可能存在不同的优化策略。

2.4挑战

延迟和响应时间。高效的大型语言模型推理需要实现低延迟和快速的响应时间,特别是在诸如聊天机器人、虚拟助手和交互式系统等实时应用程序中。平衡模型的复杂性和推理速度是一个关键的挑战,需要优化算法和系统架构,以在不降低精度的情况下最小化响应时间。

内存足迹和模型大小。由于大型语言模型的大小和包含的大量参数,因此需要大量的内存需求。在内存受限的设备上部署这样的模型是一个挑战,它需要开发有效的模型压缩技术和系统优化,以在不牺牲性能的情况下减少内存占用。 可伸缩性和吞吐量。推理系统在生产环境中经常面临不同级别的请求负载。为了确保可伸缩性和高吞吐量以有效地处理多个同步请求,需要并行计算、请求调度和其他系统级优化,以有效地跨资源分配计算工作负载。

硬件兼容性和加速性。有效地利用硬件资源对于大型语言模型推断至关重要。将LLM模型适应于不同的硬件平台和架构,包括CPU、GPU和专门的加速器,需要对硬件感知的算法设计和优化,以充分利用底层硬件的潜力。

准确性和效率之间的权衡。优化LLM推理的效率有时可能涉及到与模型精度的权衡。在模型大小、计算复杂度和性能之间取得正确的平衡是一项具有挑战性的任务,需要仔细考虑和评估各种算法和系统级技术。

三、分类

现有的提高LLM服务效率的工作可大致分为两类,包括算法创新和系统优化,将单独讨论。

3.1算法创新

本节全面分析了为优化语言模型推理效率所提出的各种算法和技术。这些工作是为了通过算法的改进来解决大规模transformer模型的固有性能缺陷。

3.1.1解码算法。

在本节中,论文将回顾如图2所示的优化llm推理过程的新解码算法。这些算法旨在降低计算复杂度,提高生成任务中语言模型推理的整体效率。

非自回归解码。现有llm的一个主要限制是默认的自回归解码机制,它一个一个地生成输出token。为了解决这个问题,一个具有代表性的工作路线是放弃自回归生成范式,且并行解码输出token。非自回归解码,通过打破解码过程中的单词依赖性,并假设有一定程度的条件独立性来实现机器翻译加速。为了缓解翻译质量的降低,一些后续研究,如半自回归解码,进一步扩展了这些非自回归方法,通过建模输出依赖关系或迭代细化输出token来达到自回归模型质量。顺时针并行解码在基本LLM中插入一个前馈层,以并行地对多个未来位置进行预测,然后返回到由基本模型验证的最长前缀。然而,这些方法需要使用新的依赖项复制新的LLM或调优原始LLM的部分层,但这并不总是可能的。最近的一些努力已经致力于在一个解码步骤中生成多个token,而无需对模型进行任何训练或修改。

推测解码。另一项工作通过利用投机执行和改进解码并行性来解决顺序执行限制。自回归LLM推理过程中的每个解码步骤都可以被视为带有条件分支的程序的执行,例如决定下一个生成哪个token。推测解码提出首先以有效的方式对多个步骤进行解码预测(例如,使用较小的草案模型和较少的模型参数),并与LLM同时验证这些预测。然而,在将推测解码应用于llm时,仍然存在一些实际的挑战,例如,如何使解码预测足够轻和准确,以及如何使用llm实现有效的并行验证。SpecInfer首先通过引入多个小草案模型和基于树的推测推理和token验证机制来解决这些挑战,并提出了一个低延迟的LLM服务系统实现。推测解码的主要优点是,它在不改变任何输出的情况下增加了并行性。这种保证来自于预测的输出总是由原始的LLM来验证,并且当预测出错时,回退机制就会生效。

早期退出。其他一些研究试图利用现有llm的深层多层架构,并利用早期退出的机制来加速解码过程。直觉是,早期模型层的输出有可能自信地推断出目标分布。它们可以基于内部分类器发出预测,而不是运行整个LLM,并且多个工作已经探索了各种退出条件。它们也被自适应计算调用,因为它们调整每个请求的计算量,以分摊总推理成本,即,为更容易的推理请求花费更少的计算。总的来说,这些方法大多局限于内部表征所携带的信息不足,而且可能不能忠实地做出准确的预测。

级联推理。由推理请求的不同复杂性所驱动,级联推理使用了一套不同尺度的llm来最小化响应时间。CascadeBERT不是直接对每个查询使用大模型,而是涉及一系列对应于不同模型深度的内部分类器,以级联的方式组织它们,并根据实例的难度自适应地选择合适的分类器。Tabi优化服务于判别模型(即,不是生成的llm),但它采用了类似的方法来合并小模型和llm,以不同的置信度处理查询。FrugalGPT利用了一种基于学习的方法,自适应地将查询分配给不同的LLMapi,从而优化了成本和性能。一个最新的工作联合优化了模型多路复用和查询缓存,并分析了最小化推理成本的最优性。思想混合将级联思想扩展到LLM推理任务,以节省成本,它从思维链和思维程序提示中抽取答案。总的来说,级联推理是提高推理效率的一个很有前途的方向,但设计一个精确的调度机制以避免影响模型质量仍然具有挑战性。

3.1.2架构设计。 本小节探讨了为大型语言模型量身定制的创新架构设计。研究人员提出了超越原始transformer的新模型架构,它在模型大小、性能和效率之间取得平衡,为更快和资源高效的推理开辟了新的途径。

配置缩减:为了降低LLM推理的计算成本,一个简单的方法是缩小模型配置,例如使用浅层编码器或解码器、权重共享和词汇表缩减。然而,减少模型参数的数量也会影响下游任务的性能。

注意力简化:与自注意计算相关的一个突出挑战是计算复杂度O(L2),它与输入序列长度成二次比例。许多transformer变体已经被提出,以将标准注意力简化为非常长的序列任务的更有效的替代方案,如稀疏化、核化和因子分解。最近,有一种趋势借用的想法从先前的注意力简化方法,概括和结合他们缩短上下文和减少KV缓存的大小,以及注意力的复杂性,稍微解码质量下降(例如,滑动窗口注意,基于哈希的注意力,扩张注意)。这些方法的一类是通过将上下文压缩为更少的软token的上下文压缩(例如,替换摘要标记或标志性token,利用额外的自动编码器方案),或根据不同的重要性指导(或称为语义压缩)直接删除或重新措辞不重要的上下文标记(称为语义压缩)。例如,自适应稀疏注意采用了一种基于学习的方法来动态地消除每个标记的无信息上下文标记。Scissorhands和H2O选择了一些可能对未来的解码过程有重大影响的重要token,并保存了它们的KV缓存。简化LLM的初始token值,并使用滑动窗口来维护它们,这也类似于之前的工作。FastGen允许不同的注意力头自适应地使用不同的强调模式。表1说明了四种具有代表性的方法及其应用的稀疏注意模式。然而,由于上下文的不完整,这些方法在注意力分布更复杂的实际工作负载中可能面临不可避免的信息丢失。

激活共享:另一个方向是共享中间激活,以提高注意力计算效率。注意共享方法观察不同层的注意矩阵分布之间的相似性,并重复使用这些注意矩阵,以降低计算成本。多查询注意(MQA)使不同的头共享一组密钥和值,以减少增量推理中的内存带宽需求。组查询注意(GQA)将单个键和值限制放松到多个集,每个集合都与一组查询耦合。它们已经被最近的几个公共LLM成功采用,并显示出其优越的性能,包括基于MQA的模型如Falcon、PaLM、ChatGLM2- 6B和基于GQA的模型如LLaMA-2和Mistral-7B。

条件计算:稀疏激活的专家混合(MoE)范式将模型的容量划分为不同的"专家",这些"专家"是较小的神经网络,每个专家专门用于数据的不同子集。它允许系统仅为基于某些路由机制的给定输入调用必要的专家,而不是计算整个大型模型,从而产生计算和内存效率。例如,TaskMoE 说明了与token级对应路由相比,任务级路由能够增加模型的容量,同时提高了推理吞吐量。随着llm的不断增长,MoE体系结构是一个很有前途的途径,可以确保未来llm的可扩展性和效率。同时,MoE的动态特性也要求分布式通信和GPU内核实现进行特殊的系统优化,以提高MoE推理效率。

循环单元:虽然循环神经网络(RNN)(如LSTM)倾向于难以捕获序列中的长期依赖关系,但仍有几种方法使用循环单元来取代transformer模块,并在推理过程中实现线性计算和内存复杂性,如RWKV和RetNet。具体来说,与之前的方法不同,这些最近的探索大多建立在线性注意(即线性transformer,无注意transformer)表示之上。改革后,他们通过建模具有线性递归单元(如状态空间模型,LRU )的标记之间的交互,克服了O(L2)的注意瓶颈,这更容易保持并行训练特性。他们的设计还由不同的位置编码模块、指数衰减机制和一堆标记级的非线性MLPs 或GLUs 组成,以提高模型的表示能力。最近,他们在模型性能和计算效率方面都显示出了良好的结果。然而,循环单元能否成功地取代llm中的transformer仍然是一个悬而未决的问题(即,特别是对于长序列)。

3.1.3模型压缩。

在这里,论文深入研究了模型压缩技术,其目的是通过创建更高效、更紧凑的模型而没有显著的性能损失来减少llm的内存占用和计算需求。

知识蒸馏:知识蒸馏是一种工作方式,它在一个大型教师模式的监督下训练一个小学生模式。这个方向的大多数方法都是探索白盒蒸馏,这需要访问整个教师模型参数。由于基于api的LLM服务(如ChatGPT)的出现,一些黑盒蒸馏模型吸引了大量的关注,如 Alpaca、Vicuna 、WizardLM等。这些模型通常具有较少的模型参数,但与原始的llm(如GPT-4)相比,在各种下游任务上显示出了良好的性能。

网络剪枝:网络剪枝方法在过去的几年中得到了广泛的研究,但并不是所有的方法都可以直接应用于llm。必须考虑到与再训练相关的潜在的过高的计算成本,并评估修剪是否基于底层系统的实现在推理效率方面产生可识别的收益。最近的一些方法在LLM上应用了结构剪枝方法,它删除了整个结构化的LLM组件,促进了有效的GPU加速。例如,Deja Vu在不修改预训练模型的情况下,切断了由上下文稀疏性假设引导的特定注意头和MLP参数。非结构化方法方面也有一些最新的进展,它对于LLM压缩通常能达到50-60%的稀疏性。值得注意的是,它们可以进一步推广到半结构化的N:M稀疏性(即2:4和4:8),从而通过NVIDIA稀疏张量核的加速实现显著的推理加速。LoSparse和DSFormer使用小密集和稀疏半结构矩阵的近似模型权值。Flash-LLM通过为使用张量核的非结构化修剪提供了一个内存高效的SpMM实现,从而放松了这一需求。PowerInfer假设这些稀疏激活的神经元的倾斜访问,并提出了一个GPU-CPU混合推理引擎,使GPU和CPU处理不同的神经元。

3.2系统优化

本节研究了LLM推理系统优化技术,以在不修改LLM计算语义的情况下加速LLM推理。这项工作的目标是通过改进用于大型语言模型推理的底层系统和框架来提高系统效率。

3.2.1低位量化

本节探讨了最先进的低位量化技术,使其能够有效地表示模型权重和激活。通过使用更少的位(即小于32)来表示数值,这些方法显著地减少了内存消耗,并加速了硬件平台上的推断。其中一种方法是对LLM进行量化,这些量化方法可以简单地分为两个方向:量化感知训练(QAT)和训练后量化(PTQ)。PTQ降低模型权重的计算精度甚至激活INT8或INT4通过使用定制CUDA内核或编译效率效益,如W8A16(即INT8重量量化和FP16或BF16激活),W4A16 GPTQ,W8A8 SmoothQuant和W4A4。硬件的发展也满足了这些要求。一个支持证据是NVIDIA最近的架构像Turing和Ampere包括INT8和INT4张量核心,和最新的Hopper架构禁用INT4支持但引入FP8张量核更好的数值精度(例如,与FP32相比,FP8的H100 GPU可以达到60×TFLOPS)。现有的方法通常采用各种量化函数,包括均匀方法(即 Round-to-Nearest)和非均匀方法。为了缓解低精度带来的性能损失,QAT在模型训练中集成了量化。值得注意的是,由于底层系统实现中的挑战,与传统的FP16等精度水平相比,低精度的量化方法可能会导致较慢的推理速度。虽然低精度的方法显著降低了模型部署的资源需求,但也有研究表明,由于尺度律的存在,量化方法可以对模型的推理性能产生显著影响。此外,量化还被应用于上下文压缩(例如,CacheGen)和内存高效的微调(例如,QLoRA,PEQA),从而降低了LLM推理的内存消耗。

3.2.2并行计算。

本节将研究为大型语言模型量身定制的并行计算策略。利用现代硬件架构的并行处理能力,这些方法将计算分布到多个核心或设备上,从而在推理过程中大大加速。

模型并行性:大多数模型并行性方法首先是用于大规模dnn的分布式训练的,特别是基于transformer的模型。例如,张量模型并行性(TP)将模型层(如注意力、FFN)从内部维度(如头部、隐藏)分割成多个部分,并将每个部分部署在一个单独的设备(如GPU)上。它可以通过并行计算显著减少推理延迟,并行计算被广泛应用于同一台机器内的多个GPU,特别是对于具有高速NVLink连接的场景。PaLM推理通过涉及二维张量并行性,扩展了大规模transformer推理上的TP,并声称对于大集群(超过256个设备)的理论通信复杂度更低。对于只有一个头表示键和值的多查询注意,它进一步涉及到混合张量划分策略的数据并行性。管道模型并行(PP)跨多个设备按顺序排列模型层。每个设备都负责一个由多个连续的模型层组成的管道阶段。虽然PP可以显著增加单位时间处理的输入数量(吞吐量),但它并不会减少像TP那样减少从开始到结束处理单个输入所花费的时间(延迟)。序列并行性(SP)具有多种不同的设计和实现,但其LLM推理的关键思想是通过沿着序列长度维度分割多个GPU来分配计算和存储负载。不同的并行性技术引入了不同程度的通信开销和计算延迟。为了实现最佳的性能和资源利用率,自动并行性已经被先前的分布式训练方法(如Alpa,FlexFlow,Galvatron)广泛研究。通过替换他们的成本模型的可预测运行时间的transformer模型,很容易应用以前的自动搜索算法(例如,动态规划、整数线性规划)LLM服务(例如, AlpaServe, FlexFlow-Serve, SpotServe)和确定最有效的并行策略没有手动干预。还有一些方法,使卸载技术能够使用更大但更慢的内存(例如,CPU DRAM),除了有限的设备内存(例如,GPU DRAM)之外,还可以保存模型参数和KV缓存。

分散推理:这种方法涉及到模型和数据并行性的结合,其中多个分散的自愿节点协作来处理数据和推断输出。这种方法在硬件资源按地理位置分布的情况下特别有用。受众包计算的启发,Petals使用互联网上的协作商品图形处理器提供开花176B模型。分散推理为运行llm打开了被忽视的消费者级GPU开辟了一个新的方向,但也面临着一些实际挑战,如设备异构性、有限的计算和内存容量、低带宽网络、容错和隐私保护。

3.2.3内存管理。

高效的内存管理仍然是LLM服务的前沿挑战,特别是考虑到transformer架构固有的内存密集型特性。随着对长序列推理的需求日益增长,与模型权重和其他激活的必要工作空间相比,KV缓存的内存占用是一个主要的优化目标。在增量解码过程中,随着KV缓存内存动态且不可预测地增长和收缩,朴素方法(例如,faster transformer)以最大序列长度假设预先分配一个连续的内存片段。1)具有不同请求长度的输入批次和2)复杂的解码场景,并行生成多个输出序列(例如,波束搜索,并行解码)。vLLM提出了Paged attention方案,将KV缓存划分为非连续的内存块,并显著提高了批处理的大小和吞吐量。SpecInfer提出了树注意和深度优先树遍历,以消除对共享相同前缀的多个输出序列的冗余KV缓存分配。LightLLM采用了一种更细粒度的token级内存管理机制来进一步减少内存使用。然而,这种分散的内存管理机制的开销带来了新的挑战。特别是对于使用其他优化来提高批处理大小的情况,这些细粒度的内存管理方法可能只提供边际吞吐量的好处,同时大幅放大了推理延迟。很明显,LLM推理中的内存减少与其他算法创新和系统级优化是复杂的联系。虽然有些工作可能对特定的工作负载很有效,但它们可能会相互抵消,导致整体性能下降。在LLM推理系统的内存效率和计算性能之间取得正确的平衡仍然是该领域的一个开放和紧迫的挑战。

3.2.4请求规划。

有效地调度传入的推理请求对于优化LLM服务至关重要。本节回顾了最大化资源利用率、保证延迟服务级别目标(SLO)内的响应时间以及有效处理不同请求负载的请求调度算法。LLM服务的请求调度与一般的ML服务技术共享共性,因为两者都旨在有效地管理传入的请求和优化资源利用率。这些常见的方面包括动态批处理、抢占、优先级、交换、模型选择、成本效率、负载均衡和资源分配。然而,LLM服务由于其独特的特点,如庞大的模型规模、迭代自回归解码机制、未知的变量对上下文信息的输出长度和状态管理,也带来了独特的挑战。 早期的LLM服务系统(例如,在NVIDIA Triton上的Faster transformer)只支持与以前的方法类似的请求级调度。Orca首先注意到生成式llm和以前的ML推理系统的请求级调度之间的差距。考虑到可变的输出序列长度,它以先到先得(FCFS)顺序以迭代粒度调度引擎的执行,并允许对选定的操作进行批处理,以更好地利用硬件。以下许多方法继承了选择性批处理和迭代级调度策略,例如vLLM和RayLLM中的连续批处理以及TensorRT-LLM 中的实时批处理。此外,SpecInfer扩展到推测解码,通过迭代地选择一批请求来执行推测推理和验证的一次迭代。FastServe专注于作业完成时间(JCT),并涉及迭代级优先处理,以对具有较短输入长度的请求进行优先排序,而不是FCFS。 SARATHI针对由不同长度的输入请求的初始迭代引起的分布式推理中的管道气泡。为了使GPU计算饱和,它将输入提示分割成统一的块,如果可能的话,用其他请求的解码迭代来附加块槽,这也被称为Dynamic SplitFuse的DeepSpeed-FastGen所采用。S3涉及一个输出序列长度预测器,并帮助在GPU内存约束内调度更多的并发请求,以获得更大的批处理大小和更高的推理吞吐量。

3.2.5内核优化。

在本小节中,论文将深入研究内核级优化,它是针对语言模型推理管道中的特定操作的性能。这些优化利用了特定于硬件的特性和软件技术来加速关键的计算内核。

内核融合:为了减少内核启动和内存访问造成的开销,内核融合被以前的DNN框架和编译器广泛采用。由于LLM推理不需要反向计算,因此存在更多的核融合机会。一些当代transformer推理引擎(如Faster transformer,TenTrans,Turbo transformer,LightSeq,Byte transformer)和编译器(如Welder)融合(1)具有相同形状的GEMMs(例如,对查询、键和值的三个线性转换)和(2)向其他非GEMM内核添加偏差,如残差连接、层规范化和激活函数(例如,ReLU)。其中,融合的多头注意核的优化已经得到了广泛的探索,并将在以下几个方面进行讨论。

定制注意力:为了使注意力操作在GPU上有效地运行,专门为注意力计算定制或定制GPU内核是至关重要的。例如,cuDNN提供了一个融合的多头注意内核API。与此同时,一些实现已经被开源了,以获得更多的性能提升。由于具有特殊的自回归解码机制,它们大致可以分为两类。一个是第一次迭代(即初始/预填充/上下文/提示符阶段),它并行地处理来自输入提示符的所有token。例如,xFormers使用CUTLASS将在线softmax trick扩展到整个注意力计算。另一个是用于以下迭代(即增量/解码/生成阶段),并且内核每次迭代只生成一个输出token。对于自回归解码,一种常见的做法是保存以前计算过的键和值,以便在生成一个新的token时只需要一个查询来计算,而不是重新运行整个序列。该领域优化的主要方向是最大限度地提高线程占用率和最小化设备上的高带宽内存(HBM)访问(即,使用共享内存或寄存器)。它们通常并行化批大小和磁头尺寸(例如,Faster transformer)以分配工作负载。有些方法进一步支持通过将KV缓存划分为块来并行化序列长度维度,但最终需要减少块级的结果,比如 FlashDecoding。随后的 FlashDecoding++通过引入一个预先已知的统一最大值来消除部分softmax的这种同步。为了更好地利用线程,有必要根据工作负载选择适当的并行维度。

采样优化:采样算法的选择会极大地影响LLM的产生质量。默认的贪婪采样总是选择概率最高的token。并行采样技术,如波束搜索,通过保持每次迭代中得分最高的序列的固定数量(即beam width),有效地解码近似最优序列。各种随机抽样技术(例如,top-k,top-p,temperature controlling)已经被提出,以为更多样化的输出引入随机性。然而,他们仍然面临着一些实际的系统挑战。一个是冗余KV缓存增加的内存压力,另一个是LLM的大量词汇表(即数万个)带来的采样效率问题。例如,LightSeq 提供了一个高效的分层实现,它将词汇表划分为k组,使用一些GPU指令检索每个组中的候选项,然后对这些候选项进行重新排序,以获得top-k token。

可变序列长度:LLM推理的另一个独特挑战是,序列的输入长度和输出长度都可以发生变化,而后者是事先未知的。加快推理速度的一种方法是一次处理一个批处理中的多个序列。然而,当一批序列具有可变的输入长度时,通常使用填充使它们都具有相同的长度用于批处理,浪费了计算和内存资源。为了缓解这些低效问题中的一些问题,可以采用各种策略。填充技术将序列存储在一个连续的内存空间中,不需要填充,在注意力计算之前只解包。锯齿张量进一步支持使用编译器生成的内核使用最小填充的计算。将序列绑定到一个更小的计算粒度中(例如,chunks)也是一种可能的解决方案,以减轻填充标记的内存使用。由于初始阶段和增量阶段的混合执行,桶装输入提示也给内存管理和请求调度带来了新的挑战。

自动编译:大多数现有的LLM推理系统使用特定于供应商的库作为其后端,如cuBLAS、cuDNN和CUTLASS,它们提供了优化的内核实现。为了进一步提高推理效率,他们还需要付出大量的努力,在NVIDIA GPU上为特定的LLM操作符(例如,attention)优化手动编写的内核。尽管有这些工作,使用自动DNN编译器的趋势仍然存在,如TVM(即,Unity ,Relax和TensorIR ),MLIR,JAX ,OpenAI Triton,TASO和TorchInductor。编译方法可以帮助发现可能更有效的运营商实现,更重要的是,促进对替代硬件平台的适应,包括移动和边缘设备、CPU、DL加速器和其他类型的GPU(例如,AMDGPU和Apple M2 Ultra)。

四、软件框架

生成式LLM服务需要一个完整的优化堆栈,并且最近的许多工作已经开始开发软件框架,以提供高效的LLM推理部署服务。下面,论文将重新讨论这些系统,并调查表2中几个具有代表性的基于GPU的开源LLM服务系统的全面分析。该分析不包含一些流行的相关项目,包括 1) 针对其他硬件的专门解决方案 (如PopTransformer, CTranslate2, lammap.cpp and ggml) and 2) 建立在其他系统之上的部署解决方案,如 OpenLLM(vLLM), xinferencer(ggml + vLLM + xFormers), LMDeploy(FasterTransformer), gpt-fast(PyTorch), DeepSpeed-MII和DeepSpeed-FastGen(DeepSpeed-Inference), RayLLM 和 RayServe (vLLM).

论文比较了这些最先进的LLM服务系统,并总结了它们在几个方面的差异。首先,这些系统大多支持张量并行性,以实现多GPU推理,提高系统性能。其中一些将来支持管道并行或卸载,以支持对多节点或资源受限环境的推断。其次,部分系统从Orca中学习并实现迭代级调度。第三,论文研究了这些系统的注意核心,并分别介绍了它们在初始阶段和增量阶段的实现。在初始阶段,他们通常采用批的一般矩阵乘法(GEMM)方法(例如,cuBLAS, torch, Relay),一些利用在线 softmax trick来减少HBM访问(例如,Flash-attention, xFormers)。增量阶段更具挑战性,因为每个token生成方案降低了计算强度。为了提高GPU的利用率,Faster transformer手动将注意力计算(如 linear projection, positional bias, dot product, softmax等)融合到一个高性能的内核模板中,并涉及几种内核优化技术,如碎片内存缓存、减少warp-shuffle instruction、具有张量核心和多精度支持的半矩阵乘法和积累(HMMA)。FlexFlow-Serve支持推测解码,并提供了一个基于树的并行解码内核,以验证来自多个序列(即来自多个小模型或不同波束或并行采样)的推测标记,具有零内存冗余和最大线程并行性。通过将KV缓存划分为页面,vLLM扩展了融合的多头注意(MHA)内核,以消除冗余内存的使用,特别是对于并行采样场景。LightLLM采用了一种后续的方法,即将KV缓存划分为更细粒度的token部分。

请注意,还有一些其他值得注意的方面。例如,即使是对于最流行的Flash和Paged attention力内核,它们通常也会在这些系统中以不同的方式实现。TGI直接导入原始的Flash/Paged注意库,LightLLM采用OpenAI Triton实现的内核,MLC-LLM通过TVM生成内核,TensorRT-LLM从Faster transformer的融合注意内核中进行修改,以支持Paged attention。另一个例子是关于输入感知的内核选择。在初始阶段,TensorRT-LLM根据上下文长度从cuBLAS和Flash attention中进行选择。除了注意计算外,对于线性投影算子,最近还有一种趋势是用一般矩阵向量积(GEMV)代替GEMM,以更有效地处理小批量(即1)的情况。这些系统还具有许多其他不同的特性,如编程语言(即C++、Python)、低精度支持(即FP16、INT8)、支持的硬件和模型。总之,这些不同的设计和实现的选择在很大程度上取决于它们的优先级优化目标。例如,vLLM使用paged attention以提高高吞吐量(Tpt),而FlexFlow-Serve利用推测来加速低延迟(Lat)。基本上,低延迟和高吞吐量是LLM服务系统中的双重优化目标,代表互补但经常冲突的目标,需要一个平衡策略来优化单个任务的快速响应和在指定时间框架内处理的任务量之间的权衡。最近的一些研究表明,进一步通过TTFT+TPOT×输出序列长度来分解响应延迟,其中TTFT表示到第一个token的时间,TPOT表示每个输出token的时间。前者由初始相位处理速度驱动,而后者直接依赖于增量解码过程中每次迭代的执行时间。区分这两个指标有利于LLM服务提供商,从而导致不同的系统设计选择和用户体验(例如,更快的应用程序响应能力,更长的提示)。此外,降低计算成本也是设计和实现一些LLM服务系统的一个重要和实际目标。虽然它不太可能有一个一刀切的解决方案,但论文相信,未来的LLM服务系统将不断集成这些不同的特性,从而不断提高系统效率和硬件利用率。

五、基准

建立一个全面的、可重复的基准来比较各种LLM服务系统的性能,如MLPerf,对该领域的学术和工业社区都是要付出的关键努力。它不仅将帮助LLM用户选择正确的系统解决方案,而且还将鼓励研究人员和开发人员跟上高级优化的步伐。不幸的是,尽管有之前的一些报告,但到目前为止,社区还没有启动一个足够令人信服的基准,考虑到所有的影响因素。这主要是因为有许多评估设置,包括模型配置、硬件环境和请求负载等。在有限数量的设置组合下进行测试,不能得出具有可信度的结论。例如,某些系统优化技术只能在高负载或低负载条件下实现性能优势,相反地,它们甚至可能是有害的。此外,在度量推理延迟时,如何排除与GPU推理无关的额外开销(如请求调度开销、固有的网络延迟等)。由于在系统设计上的差异,这也是一个具有挑战性的话题。此外,一个公平的基准测试需要考虑模型输出内容的严格对齐,这在许多测试中经常被忽视。

六、与其他调查的联系

论文对高效生成式LLM服务和推理的调查补充和扩展了该领域现有文献的范围,同时保持了一个独特的焦点。在相关工作中,一些研究在探索更通用的transformer模型和领域特定加速器的设计方面最接近。然而,论文的调查通过特别关注生成性LLM服务,这是一个微妙的领域,并不是其他研究的中心焦点。此外,一些研究深入探究了在GPU和新型加速器上的LLM推理效率的实验研究,提供了与论文关注的服务效率直接相关的有价值的经验见解。此外,LLMCarbon 还解决了LLM部署的一个日益重要的方面------其环境影响(例如,碳足迹)。虽然论文的调查从绩效的角度来看,论文的主要焦点是效率,但这些研究提供的环境视角在论文更广泛的讨论中是不可否认的相关和受尊重的。一些调查和基准测试为模型压缩和量化提供了有价值的见解。这些研究为间接支持论文对相关方向的探索奠定了基础。一些研究为理解LLM的有效性(如准确性、困惑程度、事实性等)提供了基本的背景,这超出了本调查的范围。论文的调查也承认了之前的调查对大规模DNN模型的分布式训练的贡献,因为它们告知了必须考虑LLM服务的背景。从本质上说,论文的调查坐落在一系列不同的研究中,借鉴并有助于对LLM的更全面的服务效率的理解,包括算法创新和系统优化。通过整合来自这些不同领域的见解,论文的目标是提供对该领域的最新进展和挑战的细致和全面的概述。

七、未来方向

随着我们站在LLM进步的最前沿,不仅了解这些技术的现状,而且预测和塑造它们的未来发展轨迹也变得越来越重要。特别是在生成式LLM服务领域,有一个巨大的未探索的可能性和新出现的挑战。这一领域的快速发展需要一种前瞻性的方法,其中确定创新和改进的潜在途径是至关重要的。这种远见不仅让我们为适应即将到来的技术转变做好了准备,而且还指导研究界解决最相关和最具影响力的领域。在此背景下,论文概述了未来研究和发展的几个有前途的方向,每个方向都提供了显著提高生成式llm服务效率的潜力。

硬件加速器的开发和增强。未来在提高生成式LLM服务效率方面的进展,主要得益于专门硬件加速器的开发和改进,并辅以协调硬件和软件优化的协同设计方法。例如,将更接近处理单元的内存集成起来,或优化芯片架构以更好地与LLM算法的数据流相结合,可以大幅降低延迟和能源消耗。这种方法在最近的GPU改进中得到了例证,比如NVIDIA的Hopper架构,它展示了HBM和SRAM容量、内存带宽、计算单元和等分带宽的改进,直接有利于llm的处理。持续创新在这一领域可能涉及设计硬件固有的调整生成LLM的计算模式,如优化特定需求的注意机制和张量操作普遍在这些模型,最终影响LLM服务系统的设计和实现。

高效和有效的解码算法。更有效的解码算法的发展可以大大提高服务效率。由于对更节省资源的方法来利用llm中封装的大量知识的需求,未来的工作可以探索传统自回归方法的替代方法,并在保持解码质量的同时解锁实时应用程序的生成速度。一个有希望的方向是广义推测推理,因为它能够保持相同的生成质量。具体来说,小的投机模型可以推广到任何其他形式的方法,这些方法可以比llm更有效地生成草案标记,如知识检索和用户定义函数。例如,最近出现了一些后续的工作,用早期退出或非自回归解码取代了草案模型。总之,高效解码算法的开发,如投机解码和底层系统的优化,为提高生成式llm的服务效率提供了一个重要的机会。

长上下文/序列场景优化。随着llm的应用继续扩展到更复杂的场景中,对处理更长的上下文或序列的需求正在稳步增长。为具有长序列工作负载的llm提供服务需要解决来自算法和系统两方面的挑战。就llm而言,当序列比训练中观察到的更长时,甚至使用相对位置编码或对较长的语料库进行微调后,它们也经常出现长度泛化失败。即使对于一些声称支持超长环境的模型,研究也发现它们遇到了"中间损失"的情况。目前的方法试图通过在保留相关信息的同时减少计算序列长度来缓解这种限制,如检索增强、序列压缩和缓存。对于LLM服务系统,较长的序列带来了关键的挑战,包括更多的内存消耗和KV缓存的访问,以及二次级的自注意计算复杂度的增加。

关于在复杂环境中进行部署的探索。随着llm应用的扩展,一个关键的未来方向是在各种复杂环境中探索和优化它们的部署。这种探索超越了传统的基于云的部署,包括边缘计算、混合计算(结合云和边缘计算)、分散计算以及使用现场实例等更实惠的资源等场景。每个环境都为LLM的服务带来了独特的挑战和机遇。例如,边缘计算允许通过处理更接近源的数据来更快的响应时间和减少带宽使用,但它也为有限的计算资源和存储容量带来了挑战。混合计算提供了一种平衡的方法,但需要高级管理来有效地分配计算任务。分散计算为众包计算资源提供了一个很有前途的途径,但它也带来了关于数据隐私和安全的额外考虑。LLM通过先发制人的资源提供服务,可以显著降低货币成本,但需要容错机制来处理其固有的不可预测性和可变性,以确保一致的性能和系统可靠性。成功地应对这些健壮、可伸缩的挑战将是LLM和高效的LLM应用的关键。

自动适应特定的要求。特定于应用程序的不同需求创造了广泛的创新LLM服务优化机会,如参数化微调、从外部向量存储检索、在线学习和知识更新、多模式工作负载,以及将不同LLM的能力链接在一起。这些独特的挑战还要求通过将优化空间扩展到整个LLM生命周期,将其自动和顺利地集成到现有的LLM服务基础设施中,包括数据采集和处理、AutoML和模型管理、资源分配和性能监控。

八、结论

高效的LLM服务是实现先进人工智能技术平民化的基本一步。本调查旨在为研究人员、从业者和开发人员提供对现有方法的全面了解,使他们能够在现实环境中部署llm时做出明智的决策。通过整合对算法和系统的最新研究成果,本文希望加快进展,促进追求高效LLM服务解决方案的创新。

相关推荐
xiaoshiguang33 小时前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡3 小时前
【C语言】判断回文
c语言·学习·算法
别NULL3 小时前
机试题——疯长的草
数据结构·c++·算法
TT哇3 小时前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos5 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习5 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA5 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo5 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc5 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游6 小时前
【算法day20】回溯:子集与全排列问题
算法