论文解读 - 面向高效生成大语言模型服务:从算法到系统综述
一、简要介绍
在快速发展的人工智能(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 服务解决方案的创新。
评论