面向 LLM 服务的 CAP 原则:长上下文大语言模型服务综述
Pai Zeng Huawei Cloud & SJTU
Zhenyu Ning SJTU
Jieru Zhao SJTU
Weihao Cui SJTU
Mengwei Xu BUPT
Liwei Guo UESTC
Xusheng Chen Huawei Cloud
Yizhou Shan Huawei Cloud
arXiv:2405.11299v2 [cs.DB] 27 May 2024
摘要
我们综述了大语言模型(large language model, LLM)服务领域,以理解成本效率(cost-efficiency)与准确性(accuracy)之间的复杂动态关系——在大规模部署模型时,对更长上下文理解的需求不断增长,使这一矛盾尤为突出。我们的研究发现,该领域的工作沿着三个既相互独立又相互冲突的目标进行优化:提升服务上下文长度(Context, C)、提升服务准确性(Accuracy, A),以及提升服务性能(Performance, P)。受数据库中 CAP 定理(CAP theorem)的启发,我们提出面向 LLM 服务的 CAP 原则(CAP principle),指出任何优化至多只能同时改善这三个目标中的两个。本综述在该框架下对现有工作进行分类。我们发现,用户可感知度量指标的定义与连续性,对于判定某一目标是否达成至关重要,这与实际应用中的 CAP 数据库类似。我们将 LLM 服务的 CAP 原则视为一项指导原则而非形式化定理,用以提醒设计者关注服务模型过程中固有且动态的权衡。由于服务准确性与性能已有大量研究,本综述聚焦于扩展服务上下文长度并应对由此带来的挑战的工作。
1. 引言
大语言模型(large language models, LLMs)及其底层的 Transformer 架构深刻变革了人工智能,并成为众多新兴应用的基石。围绕 LLM 的生态正螺旋上升,迈向通用人工智能(artificial general intelligence, AGI):新 LLM 及其应用数量激增;截至 2024 年,基于 LLM 的应用已在图像分类与视觉推理等多项任务上超越人类[1, 2]。高质量模型对实现 AGI 至关重要,但同样重要的是,以合理较低的成本、在不牺牲准确性的前提下大规模部署与服务模型。服务准确性与服务性能(例如每秒 token 数)之间的冲突十分棘手,催生了该领域大量研究[3, 4]。总体而言,生产环境中并不存在放之四海而皆准的方案。提升性能的优化可能导致准确性下降,反之亦然。例如,稀疏性(sparsity)与量化(quantization)是两种常见技术,以牺牲准确性换取更好的性能。遗憾的是,准确性与性能之间的冲突近来因实际部署中对更长上下文理解的需求日益增长而进一步加剧[5]。这引入了新的复杂性:Transformer 的注意力机制随上下文变长呈现出二次方增长的资源消耗[6]。此外,LLM 难以有效利用更长上下文中的信息[7]。本质上,长上下文服务打破了服务准确性与性能之间本已脆弱的平衡,呼唤新型系统设计。
Preprint. Under review.
图 1:面向 LLM 服务的 CAP 原则。C 表示提升上下文长度,A 表示提升准确性,P 表示提升服务性能或总体成本效率。该原则指出,任何服务优化至多只能同时改善上述三个目标中的两个。(原文图见 PDF 第 2 页)
为探索大规模模型部署中准确性与性能之间的复杂关系——尤其是在处理长上下文时——我们对 LLM 服务领域进行了广泛综述。在审阅相关文献后,我们强调三项关键观察。
- 首先,我们发现服务系统(serving system)的范围已扩展。它由两个系统层组成:模型服务层(model serving layer)与智能体服务层(agent serving layer)。模型层系统运行给定的 LLM 模型,通常将模型推理暴露为其北向 API[8, 9]。该层工作通常优化模型结构[10, 11]、缓存[8, 12]、调度[13, 14]等。智能体层系统位于模型层系统之上,源于新兴的基于 LLM 的系统应用:它们利用 LLM 驱动的工作流,在处理复杂现实任务时提升原始 LLM 模型的准确性与效率[15]。
- 其次,我们发现该领域的工作沿着三个不同目标进行优化:提升服务上下文长度(Context)、提升服务准确性(Accuracy),以及提升服务性能(Performance)。具体而言,上下文指上下文窗口中的 token 数量;准确性指在特定任务(例如 MMLU)上的评估指标;性能指首 token 时延(time-to-first-token, TTFT)、每秒 token 数、每百万 token 价格等。
- 最后,我们发现无论作用于哪一层,上述三个目标之间都存在三难困境。任何服务优化至多只能改善两个不同目标。我们还观察到,某一方向的进展并不必然带来其他方向的进展。例如,使用位置嵌入(positional embedding)扩展模型范围并不能提升模型在超出该上下文长度之外的准确性[16];而使用量化[11]、剪枝[17]与稀疏性[12]能够以更快速度服务模型,但可能以准确性降低为代价。
基于上述观察,并受数据库经典 CAP 定理[18]启发,我们提出面向 LLM 服务的 CAP 原则:对任意给定的 LLM 服务优化——无论作用于哪个系统层——至多只能改善下列目标中的两个:
- Context(上下文长度):终端用户有效处理并感知到的上下文长度。
- Accuracy(准确性):基于特定任务指标、由终端用户评估的输出精度。
- Performance(性能):终端用户感知到的 token 处理与生成效率。
所提 CAP 原则的视角强调终端用户从对远程 LLM 服务系统应用特定优化中所感知到的效果,而非聚焦于 LLM 服务系统内部的某一组件。这一点至关重要,因为我们关心的是 LLM 服务系统作为整体能否服务 AGI,而非单一方向上的局部改进。总体而言,该原则导向六类优化:C、A、P、CA、CP 与 AP,取决于优先考虑哪些目标。
LLM 的 CAP 原则在诸多方面与数据库的 CAP 定理相似。
- 二者都指出:为实现其他目标,必须至少放弃一个目标。由于我们聚焦于长上下文服务,维持较长上下文(C)是必要的。这留下两个选项:提升准确性(A)或提升性能(P)。提升准确性依赖于设计新算法以更好地利用长上下文特征。然而,这些算法可能因增加 FLOPs、硬件不友好操作等而损害模型执行的成本效率。另一方面,通过量化与稀疏性等技术在特定硬件上增强性能,通常以准确性下降为代价。尽管存在不损失准确性而提升性能的方法,它们一般需要额外硬件资源。
- 二者的目标都以连续而非二元方式度量。用户可感知度量指标的定义与连续性,对于判定某一目标是否达成至关重要。一些近期研究已从准确性角度考察了这一方面[19, 20]。数据库 CAP 中的可用性与 LLM CAP 中的准确性均介于 0 到 100。LLM CAP 原则中的准确性,正如数据库 CAP 定理中的可用性一样,不必达到 100%,只需足够高以使终端用户认为其有用即可。因此,从系统视角看,若某一被归类为 CP 的优化满足用户的准确性要求,仍可能被感知为实现了全部三个 CAP 目标——这与实际数据库中对 CAP 的观察类似[21]。
- 二者最初都被提出,以使系统设计者在部署大规模系统时意识到艰难的设计权衡。
我们预见未来可能出现真正的 CAP,即这些目标之间不再存在固有冲突。所提 CAP 原则主要源于在现有 AI 芯片上使用基于 Transformer 的 LLM,反映了当今硬件与软件的约束与能力。随着我们迈向 AGI,模型与硬件都有望显著演进。新兴技术可能协同发展,新模型将专门设计以在下一代硬件上优化性能。模型与硬件共同演进之间的协同,对于克服当前障碍、在 LLM 服务中实现真正的 CAP 至关重要。
本综述按所提 CAP 原则组织。相较既有综述[3, 4, 22–26],我们做出两项独特贡献。首先,我们提出面向 LLM 服务的 CAP 原则,并将现有工作映射到 CAP 版图上,以凸显其间张力。其次,我们将大规模 LLM 服务系统视为整体加以审视,而非聚焦于某一特定技术(例如 RAG[26]、长上下文[23])或某一层(例如模型层[3]、智能体层[25])。在本文其余部分,我们将讨论表 1 与图 2 所列工作。我们聚焦于扩展服务上下文长度并应对由此带来的准确性与性能问题的工作。具体而言,将涵盖模型记忆(model memory,表 2)、位置嵌入(表 3)、Found-in-the-middle(中间发现)、面向长上下文的分布式加速、提示压缩(prompt compression)、稀疏性(表 5)以及智能体记忆(agent memory,表 7)。
2. 面向 LLM 服务的 CAP
表 1:面向 LLM 服务的 CAP 定理导向六类结果。
| 类型 | 优化 |
|---|---|
| C | 模型记忆(Model Memory)、位置嵌入(Positional Embedding) |
| A | Found-in-the-middle |
| P | 稀疏注意力(Sparse Attention)、线性注意力(Linear Attention)、分布式加速(Distributed Accl.)、量化(Quantization)、模型剪枝(Model Pruning) |
| CP | 提示剪枝(Prompt Pruning) |
| CA | 智能体记忆(Agent Memory) |
| AP | N/A |
2.1. 概述
我们综述该领域,并将相关工作映射到表 1,跨越图 2 所示的智能体层与模型层。值得注意的是,我们可将所有现有 LLM 服务优化工作映射到由 CAP 产生的六类之中,这凸显出所提 CAP 原则反映了该领域固有且长期存在的设计权衡。
对表 1 的概览:
- 共有六类:C、A、P、CA、CP 与 AP,取决于优先考虑哪些目标。
- C:该方向工作仅提升 LLM 服务系统的上下文长度。我们的研究识别出两种提升 C 的途径。我们称第一种为模型记忆(Model Memory),即一类通过递归与动态外部记忆增强 Transformer 的工作。另一种是位置嵌入(Positional Embedding),将模型的上下文窗口扩展到更长上下文与更多 token。
- A:该方向工作应对长上下文服务带来的准确性问题。已有若干初步工作,例如 Found-in-the-middle,但其中一些为更好的 A 而牺牲了 P。
- P:该方向工作提升服务性能或总体成本效率。我们聚焦于专门为改善长上下文服务而提出的两类工作。第一类是分布式加速,探索序列并行以实现更快处理。第二类是稀疏性,通过降低计算与内存占用以获得更好性能。
- CP:该类工作同时改善两者。我们识别出提示压缩为该类别中唯一一类工作。
- CA:该类工作同时改善两者。我们识别出智能体记忆为该类别中唯一一类工作。
图 2:当今的 LLM 服务系统通常包含两层:模型层(运行给定的 LLM 模型)与智能体层(运行基于 LLM 的系统应用)。PE 表示位置嵌入(Positional Embedding)。Quant 是量化(quantization)的缩写。(原文图见 PDF 第 4 页)
表 2:模型记忆工作对比。
| 工作 | 记忆聚合(Memory Aggregation) | 记忆组织(Memory Org.) | 记忆检索(Memory Retrieval) | 记忆更新(Memory Update) | 记忆淘汰(Memory Eviction) |
|---|---|---|---|---|---|
| Transformer-XL [10] | 点积注意力(dot-attention) | FIFO | 全部 | 无 | 丢弃 |
| Compressive Transformer [27] | 点积注意力 | FIFO | 全部 | 无 | 丢弃 |
| Memorizing Transformer [28] | 学习门控(learned-gate) | FIFO | kNN | 无 | 丢弃 |
| Memformer [29] | 点积注意力 | 随机 | 全部 | 是 | 是 |
| Memory Transformer [30] | 软提示(soft prompt) | 随机 | 全部 | 是 | 是 |
| RMT [31] | 软提示 | FIFO | 全部 | 无 | 丢弃 |
| AutoCompressor [32] | 软提示 | FIFO | 全部 | 无 | 丢弃 |
| Infini-Attention [33] | 学习门控 | 随机 | 线性 | 是 | 是 |
2.2. 提升上下文长度(C)
本节综述扩展服务系统上下文长度、以应对日益增长的长上下文推理需求的工作。我们将讨论两种途径。我们称第一种为模型记忆(Model Memory),即一类通过递归与动态外部记忆增强 Transformer 架构的工作。另一种是位置嵌入(Positional Embedding),扩展 LLM 的上下文窗口以处理更多 token。
2.2.1. 模型记忆(Model Memory)
扩展 Transformer 上下文长度的一种方式是增加记忆以保存长程信息。模型记忆(model memory)是我们为该类工作所起的名称:它们通过递归与动态外部记忆增强 Transformer 架构。其核心在于为 Transformer 构建记忆系统,使其能够审视过去的长程信息。
系统视角下的分类法 我们意识到,管理 Transformer 模型的增强记忆类似于操作系统中经典的虚拟内存管理[34],其核心围绕如何组织记忆、读什么、更新什么,以及淘汰什么、何时淘汰。为此,我们建议通过映射到以下五个维度来对比模型记忆工作。
- 记忆聚合(Memory Aggregation):决定如何将局部记忆与全局记忆(从增强记忆中检索得到)聚合。可以是注意力、学习门控或软提示。
- 记忆组织(Memory Organization):决定外部增强记忆如何组织。可以是固定大小的 FIFO 缓冲区或随机访问缓冲区。出于容量顾虑,似乎不存在动态大小的记忆。
- 记忆检索(Memory Retrieval):决定如何以及检索增强记忆中的什么内容。多数工作检索全部记忆,另一些则使用特定算法检索一部分。
- 记忆更新(Memory Update):决定出现新记忆时如何更新增强记忆。若为 FIFO 记忆,更新意味着入队;若为随机记忆,更新将使用特定算法更新全部或部分记忆。
- 记忆淘汰(Memory Eviction):决定增强记忆已满时淘汰什么。若为 FIFO 记忆,淘汰丢弃尾部记忆;若为随机记忆,由于记忆原地更新,不会发生淘汰。
我们接下来深入讨论表 2 所列工作。
- Transformer-XL [10] 为 Transformer 架构增加递归。它使用逐层记忆缓冲区捕获长期依赖,并将长序列切分为固定大小的片段,以捕获相邻层之间的片段级递归。其记忆组织为 FIFO,且没有更新规则。随着新片段到来,旧记忆被丢弃。推理时,它使用点积注意力聚合从记忆读取的隐状态与当前片段的局部状态。Compressive Transformer [27] 为 Transformer-XL 增加第二级压缩记忆。它在不改变核心机制的前提下进一步扩展上下文。Memorizing Transformer [28] 采取略有不同的方式:它不读取全部记忆,而是使用 kNN 算法从外部记忆检索,并通过学习门控进行聚合。上述三项工作都会丢弃遥远过去的信息。
- Memformer [29] 为 Transformer 架构增加固定大小的动态外部记忆。它使用随机访问记忆,而非前两项工作所用的 FIFO 记忆。它将记忆划分为多个槽位,并设计基于注意力的算法独立更新记忆槽。此外,它使用遗忘机制淘汰在多个时间戳内未更新的记忆槽。由此,它关注更重要的信息,并声称在理论上具有无限的时序记忆范围。
- Memory Transformer [30] 与 Memformer [29] 的不同在于:前者使用软提示(soft prompt)[35] 将外部记忆信息与当前提示聚合。它将记忆 token 前置到经分词的用户提示之前,并使用未经修改的注意力模块,使记忆 token 能够关注长序列。
- RMT [31] 与 AutoCompressor [32] 使用软提示将记忆 token 添加到提示开头,这类似于 Memory Transformer [30],并采用 Transformer-XL [10] 中的片段级递归。二者均基于 Transformer-XL 的代码库构建。
- Infini-Attention [33] 是该类别中的最新工作。它将压缩与动态记忆与标准点积注意力层紧密集成,使模型能够关注无限上下文长度。它采用关联矩阵作为记忆,允许随机访问;使用线性注意力检索记忆,并使用 delta 更新规则更新记忆;通过学习门控将检索到的记忆与局部注意力状态聚合。相较标准 Transformer-XL,该方法使用更少的计算与内存。
总之,模型记忆这一类工作通过动态与压缩记忆增强原始 Transformer 架构,使模型能够处理长甚至无限上下文。它们在如何访问记忆、如何更新记忆等方面有所不同。由于多数工作要么丢弃要么压缩记忆,它们不可避免地损害 A。它们在 P 上是中性的,因为它们并未解决注意力机制中的二次复杂度问题。
2.2.2. 位置嵌入(Positional Embedding)
该类工作聚焦于位置嵌入(positional embedding, PE),使 LLM 能够处理长上下文序列(从而提升 C)。在表 3 中,我们从四个维度进行对比。
- 位置(Location):位置信息被编码进 token 表示的位置。
- 是否需要训练(Require training):是否可即插即用而无需重训练。
- 自适应性(Adaptive):是否能根据输入自适应调整。
- 集成方式(Integration):位置表示如何与 token 表示集成。
下文讨论按外推(extrapolation)与插值(interpolation)分类。
- 位置外推(Position Extrapolation)。该策略将位置嵌入扩展到训练所用最大上下文长度之外。例如,ALiBi [36] 引入相对位置嵌入,并在注意力上施加可学习的线性偏置,使模型能够根据序列实际长度动态调整注意力分布。XPOS [37] 在 ROPE 基础上引入额外的指数衰减项,使注意力随相对距离增大而衰减。CLEX [38] 通过泛化位置嵌入缩放,将连续动态建模为带有长度缩放因子的常微分方程。
- 位置插值(Position Interpolation)。该策略将输入位置编码索引范围缩放到模型的上下文窗口内。例如,Linear Interpolation [39] 引入一种位置插值技术,直接缩小位置索引。由此,最大位置索引与预训练阶段先前的上下文窗口约束相匹配,从而扩展上下文窗口。受神经正切核(Neural Tangent Kernel, NTK)理论启发,仅使用位置插值的模型将难以识别相邻 token 的顺序与位置。NTK Interpolation [40] 设计了一种非线性方法,通过改变 RoPE 中的底数来动态调整缩放因子。YaRN [41] 结合 NTK Interpolation 与 Linear Interpolation,并引入注意力分布校正策略,以抵消长输入导致的注意力矩阵中的分布偏差。FIRE [42] 使用可学习连续函数将位置信息映射为偏置,并提出渐进插值,以应对输入长度超出训练域时的泛化问题。LongRoPE [43] 通过识别并利用 RoPE 维度中的非均匀性以及 token 位置中的非均匀性,改进位置插值方法。PoSE [44] 引入一种称为位置跳跃式方法(Positional Skip-wise Method)的训练方法,通过对各片段的位置索引施加定制的跳跃偏置项,在固定上下文窗口内模拟扩展输入。
表 3:位置嵌入工作对比。
| 工作 | 位置(Location) | 是否需要训练 | 自适应性 | 集成方式 |
|---|---|---|---|---|
| ALiBi [36] | QK 相乘之后 | ✓ | ✗ | 相加 |
| XPOS [37] | QK 相乘之前 | ✓ | ✗ | 相乘 |
| CLEX [38] | QK 相乘之前 | ✓ | ✓ | 相乘 |
| Linear Interpolation [39] | QK 相乘之前 | ✗ | ✗ | 相乘 |
| NTK Interpolation [40] | QK 相乘之前 | ✗ | ✗ | 相乘 |
| YaRN [41] | QK 相乘之前 | ✓ | ✓ | 相乘 |
| FIRE [42] | QK 相乘之后 | ✓ | ✓ | 相加 |
| LongRoPE [43] | QK 相乘之前 | ✓ | ✓ | 相乘 |
总之,位置嵌入研究通过外推与插值增强模型对训练阶段未曾出现的位置信息的泛化能力。这些方法因是否将输入位置索引范围缩放到模型上下文窗口内而有所不同。它们在 C 与 P 上是中性的。我们认为它们对实现长上下文服务至关重要。
2.3. 提升准确性(A)
更长的 C 对 A 构成挑战。本节聚焦于应对长上下文 LLM 服务所带来准确性问题的工作。Lost-in-the-middle [7] 是分析 LLM 如何利用长上下文的开创性工作。他们发现,现有 LLM 无法鲁棒地利用冗长上下文中的信息,且文档位置会影响最终服务准确性。这一缺陷将限制长上下文 LLM 在实际应用中的使用,导致输出出现偏差。
我们发现三项工作来应对该问题。
- Attention Sorting [45] 通过将关键信息置于输入提示末尾来应对该问题。其做法是:执行一步解码,按文档所受注意力排序(注意力最高者排在最后),重复该过程,再用新排序的上下文生成答案。尽管它能提升 A,但该方法的局限也很明显:并非所有任务都能映射到一组文档,且额外排序带来不可忽视的开销,损害 P。
- Attention Bucket [46] 使用多个模型副本,每个副本对旋转位置嵌入采用不同的基角。这创造出独特的注意力波形,以增强 LLM 对各种上下文位置的感知。该方案跨越模型层与智能体层。它们提升 A,但因需要多个副本来处理输入提示而牺牲了 P。
- Found-in-the-middle(中间发现)[47] 采取更轻量的方法。他们发现,lost-in-the-middle 现象可能源于两个因素:因果注意力中 LLM 不成比例地偏好初始 token[12],以及 RoPE 的长期衰减效应[16]削弱了位置遥远但语义有意义的 token 的注意力分数。他们的答案是多尺度位置编码(Multi-scale Positional Encoding, Ms-PoE):为不同注意力头分配不同缩放比率,以保留预训练阶段学到的信息,同时利用位置索引重缩放缓解长期衰减效应。该工作属于模型层,在提升 A 的同时不增加额外开销。
总之,在长 C 下提升 A 仍是一个需要密切审视的领域。已有一些旨在提升长上下文推理与理解的初步工作,但其中一些为更好的 A 而牺牲了 P。我们认为,需要更多研究以同时提升 A 与 P。
2.4. 提升性能(P)
本节涵盖提升 P 的工作。长上下文服务在计算 FLOPs 与内存占用方面需求显著更高。从系统视角看,运用并行或近似等原则应对这些问题并不罕见。我们聚焦于专门为改善长上下文服务而提出的三类工作:稀疏注意力(sparse attention)、线性注意力(linear attention)与分布式加速。
稀疏注意力通过在每一步注意力中选择性地仅关注输入子集来降低资源占用。线性注意力通过核函数将输入特征映射到更低维空间后再计算注意力分数,从而近似注意力计算以降低资源占用。两种技术都旨在降低传统注意力机制的二次复杂度。线性注意力通过降维实现,而稀疏注意力通过选择性聚焦实现。当数据不同部分的重要性非均匀,或序列具有天然局部性(如图像或结构化文本)时,稀疏注意力尤为有用。线性注意力更适于需要对全部数据进行压缩并高效处理的任务。分布式加速探索序列并行以实现更快处理。关于提升 P 的一般性优化(例如 paged attention[8]、flash attention[48]、KV caching[49]等),我们建议读者参阅[3, 4]。
2.4.1. 稀疏注意力(Sparse Attention)
本节探讨稀疏性(sparsity)——一种通过最小化冗余 QK 乘法运算并降低内存占用以增强计算效率的方法。我们基于两个基本方面将稀疏性技术分为四类。第一方面与 Transformer 架构相关。对于 Encoder-Decoder 架构,稀疏性用于在注意力计算中选择性地忽略查询与键之间不太重要的交互,从而将计算资源聚焦于更关键的元素。对于 Decoder-only 架构,稀疏性用于从键值缓存中清除不太重要的数据。第二方面聚焦于识别查询与键之间哪些连接不太重要的策略。这些策略分为两类:动态稀疏性与静态稀疏性[50]。动态稀疏性适应传入序列,在运行时持续识别查询与键之间不太重要的连接并过滤相应 token。静态稀疏性则使用预先确定的稀疏模式决定忽略哪些连接,实现更简单,但可能牺牲自适应性。
我们在表 5 中从四个维度对比代表性稀疏性工作。
- 稀疏策略(Sparsity Strategy):注意力矩阵的稀疏模式是预定义的(静态),还是在推理时动态确定的(动态,有时也称学习得到的)。
- 模式策略(Pattern Strategy):保留连接的组成(对应静态方法)以及获取模式的技术(对应动态方法)。
- 补偿(Compensate):系统是否对被丢弃元素进行补偿。
- 是否需要训练(Require training):稀疏性工作是否可即插即用而无需训练。
以下讨论按表 4 组织。
表 4:讨论矩阵。
| Encoder-Decoder | Decoder-only | |
|---|---|---|
| 动态稀疏性(Dynamic Sparsity) | (1) | (4) |
| 静态稀疏性(Static Sparsity) | (2) | (3) |
(1)动态稀疏 + 编码器–解码器。在前大语言模型时期,编码器–解码器模型会在运行时根据输入的查询(query)与键(key)动态调整注意力模式,包括 Adaptively Sparse Transformer [51]、Sinkhorn Attention [52]、Routing Transformer [53]、Reformer [54]、Landmark Attention [55] 等算法工作,以及 A3 [56]、Spatten [57]、Sanger [58]、Dota [59]、Salo2 [50]、Acceltran [60]、Fact [61]、Energon [62]、Dtqatten [63] 等硬件加速器工作。这些方法会过滤无关 token,并基于输入或内部状态为关键注意力计算生成稀疏模式。它们采用多种技术在运行时确定稀疏模式,例如基于阈值对注意力矩阵剪枝、通过聚类为查询识别重要键,或采用 Top-k 剪枝等。例如,Routing Transformer 利用聚类度量键与查询之间的相似度,并为每个查询识别 Top-k 个最相关的键。Sanger、Acceltran 与 Dtqatten 则通过对近似得分矩阵中低于预定义阈值的元素进行掩码,从而导出稀疏模式。
(2)静态稀疏 + 编码器–解码器。注意力机制的二次复杂度会带来沉重的计算与内存负担,尤其当上下文很长时。在长输入序列场景下,动态稀疏因过滤或聚类查询与键的额外开销而引入效率问题。这催生了静态稀疏。Block-Bert [64]、Sparse Transformer [65]、Longformer [66]、BigBird [67]、Star-Transformer [68]、LongT5 [69]、LongNet [70]、Zebra [71] 等模型,以及 Vitcod [72]、Salo [73] 等硬件加速器采用静态稀疏策略。这些工作通过将注意力连接约束为预定义稀疏模式(如块注意力、滑动窗口注意力、全局注意力、随机注意力与膨胀注意力)来实现稀疏性。例如,Longformer 结合滑动窗口注意力与全局注意力,分别捕获局部依赖与长程依赖。
(3)静态稀疏 + 仅解码器。进入大语言模型时期后,仅解码器架构正成为主流。在仅解码器 Transformer 的解码过程中,会缓存历史键与值以提高计算效率,因此稀疏性现在更偏向于淘汰 KV 缓存中不重要的键与值。静态稀疏仍适用于仅解码器架构的模型。例如,LM-Infinite [74] 与 StreamingLLM [12] 缓存起始 token 以及最后 L 个 token 的键与值,且仅缓存中的键与值会与当前查询进行注意力计算。
(4)动态稀疏 + 仅解码器。由于仅解码器架构单步解码具有线性复杂度,动态稀疏再次活跃起来。例如,FastGen [75] 在预填充阶段为每个注意力头选择合适的压缩策略,并在解码阶段根据该压缩策略决定是否缓存新生成 token 的 KV 向量。H2O [76] 与 Keyformer [77] 缓存最后 L 个 token 以及运行时由注意力分数动态选出的重要 token 的键值向量。SparQ Attention [78] 基于近似注意力分数消除不重要的键值向量;为补偿被消除的值向量,SparQ Attention 额外维护所有被消除值向量的均值向量,用于计算注意力输出。EasyKV [79] 通过基于局部注意力分数与鲁棒性度量的 Robust Cache 淘汰策略,淘汰不重要的键值向量。LESS [80] 采用基于 KV 缓存淘汰的低秩方法,学习原始注意力输出与稀疏策略近似注意力输出之间的残差;其做法是将按淘汰策略丢弃的信息累积到常数大小的低秩缓存或状态中,使查询能够恢复丢失信息。InfLLM [81] 缓存起始 token 与最后 L 个 token 的键与值,并通过查找表从外部存储器重新加载部分相关的、已被淘汰的键值向量。
总之,稀疏性通过最小化冗余计算与内存使用来提升性能(P)。该领域多数工作仅提升 P,但可能以准确性下降为代价。StreamingLLM [12] 是一个例外:它通过支持无限上下文窗口并利用高效注意力,同时实现了 CP。我们认为,探索模型记忆、位置嵌入与稀疏性优化的组合将是有趣的方向。
2.4.2 线性注意力(Linear Attention)
线性注意力将注意力机制相对序列长度的复杂度从二次降为线性。其做法是通过核函数在计算注意力分数前将输入特征映射到更低维空间,从而近似注意力计算。具体而言,它用其他函数替换 softmax 操作,例如 $\mathrm{sim}(Q, K) = \phi(Q)\phi(K)^{T}$,并计算 $\phi(Q)(\phi(K)^{T} V)$ 而非 $\mathrm{sim}(Q, K)V$,从而将二次复杂度 $O(n^{2} d)$ 降为线性 $O(nrd)$,其中 $r$ 表示 $\phi()$ 将 $\mathbb{R}^{d}$ 映射到 $\mathbb{R}^{r}$。该方向的工作如 Linear Transformer [83]、Performer [84] 与 Efficient Attention [85] 定义了不同的 $\phi()$ 以近似 softmax 操作,而 Scatterbrain [86] 与 ViTALiTy [87] 则分别进一步用 Reformer [54] 与 Sanger [58] 的稀疏注意力来补偿低秩函数。例如,Performer 使用正正交随机特征(PORF)作为低秩函数 $\phi()$,而 Scatterbrain 表明,将低秩线性注意力(经由 Performer 中的函数 $\phi()$)与稀疏注意力(经由 Reformer 中的局部敏感哈希)相结合,可得到比单独任一方法更优的高效近似。
线性注意力与稀疏注意力均降低了传统注意力机制的二次复杂度。线性注意力通过降维实现,稀疏注意力则通过选择性聚焦实现。二者都以准确性(A)换取更好的性能(P)。
表 5:稀疏性工作对比。
| Work | Sparsity Strategy | Pattern Strategy | Compensate | Require Training |
|---|---|---|---|---|
| Sparse Transformers [65] | Static | Local + dilated | ✗ | ✓ |
| Adaptively Transformers [51] | Dynamic | Topk | ✗ | ✓ |
| Block Attention [64] | Static | Block | ✗ | ✓ |
| ETC [82] | Static | Local + Global | ✗ | ✓ |
| BigBird [67] | Static | Local + Global + Random | ✗ | ✓ |
| Longformer [66] | Static | Local + Global | ✗ | ✓ |
| Reformer [54] | Dynamic | LSH | ✗ | ✓ |
| Sinkhorn Attention [52] | Dynamic | Block + Sort | ✗ | ✓ |
| Routing Transformer [53] | Dynamic | Clustering | ✗ | ✓ |
| Star Transformer [68] | Static | Local + Global | ✗ | ✓ |
| LongT5 [69] | Static | Local + Global | ✓ | ✓ |
| LongNet [70] | Static | Dilated | ✗ | ✓ |
| Zebra [71] | Static | Local or Global | ✗ | ✓ |
| Landmark Attention [55] | Dynamic | Block + Topk | ✗ | ✓ |
| LM-Infinite [74] | Static | Local + Global | ✗ | ✓ |
| StreamingLLM [12] | Static | Local + Global | ✗ | ✗ |
| H2O [76] | Dynamic | Local + Topk | ✗ | ✗ |
| Keyformer [77] | Dynamic | Local + Topk | ✗ | ✗ |
| SparQ Attention [78] | Dynamic | Topk | ✓ | ✗ |
| EasyKV [79] | Dynamic | Topk | ✗ | ✗ |
| LESS [80] | Dynamic | Topk | ✓ | ✓ |
| InfLLM [81] | Dynamic | Local + Topk | ✗ | ✗ |
2.4.3 分布式加速(Distributed Acceleration)
我们讨论以分布式方式探索序列并行(Sequence Parallelism, SP)维度的工作。在此,长上下文推理请求被切分为子序列并分布到各节点并行处理。虽然张量并行(TP)或流水线并行(PP)等传统分布式策略也能提升推理性能,但本综述略去它们,因为它们并非专为长上下文处理设计,通常与 SP 优化正交或互补。
我们的分析分两步展开。首先,研究用 SP 加速单个长上下文请求的方法;其次,研究加速服务长上下文请求的集群的方法。
加速单个请求。
图 3:采用序列并行的相关工作。灰色框表示并非专为长上下文服务设计的工作。(原文图见 PDF 第 10 页)
图 3 展示了该研究方向各工作之间的关系。该线研究可追溯到在线归一化器工作 [88],这是一种数学上等价的分块 softmax 计算方式,可避免物化完整注意力矩阵 $\mathrm{softmax}(QK^{T})$。该方法是 memory-efficient attention [89] 及其 CUDA 实现 [48, 96] 的基础。
SP 最早由 Li 等人 [97] 提出,并已广泛应用于 Megatron [98]、DeepSpeed [99] 等分布式大语言模型训练框架。在大语言模型服务系统语境下,出现了新的挑战:(1)大语言模型服务通常对延迟敏感,因此所需批大小远小于训练;(2)大语言模型服务存在自回归解码阶段,此时序列长度仅为 1,却需要大量内存存储 KV 缓存;(3)大语言模型服务通常依赖大型融合内核以提升性能。虽然序列中每个 token 的前馈网络(FFN)计算是线性独立的,但注意力计算并非如此。因此,使用 SP 计算分布式注意力时涉及大量数据交换,从而为性能优化打开了显著空间。
Blockwise Parallel Transformer(BPT)[90] 将这种分块并行计算思想从自注意力扩展到自注意力与 FFN 的融合。BPT 直接用每个 $Q$ 注意力结果块计算 FFN,完全不物化完整注意力矩阵,从而降低处理超长上下文请求的内存需求。
Ring Attention [91] 是 BPT 的后续工作,并将其适配到分布式场景。如图 4a 所示,它将分块注意力与 FFN 计算分布到各设备,使键值块能够在主机间以环形方式并发通信。该设置使通信与查询–键–值块及 FFN 的计算重叠,从而提升效率。Striped Attention [93] 通过解决因果掩码后分布式节点间的负载不均衡问题来改进 Ring Attention,如图 4b 所示。Burst Attention [92] 通过将 FlashAttention 的分块优化融入每节点计算,并引入用于分布式协调的全局优化器,来增强 Ring Attention。Dist Attention [94] 专为自回归解码阶段优化 Ring Attention,如图 5 所示——此时查询长度仅为 1。在解码阶段,$Q$ 长度为 1,且 KV 已分布在序列并行节点之间。
加速集群。
部署长上下文服务时,系统会遇到不同上下文长度的请求。这种多样性给大语言模型服务系统带来重大挑战:不同请求的计算与内存需求可相差数量级。两项并行工作 Infinite-LLM [94] 与 LoongServe [95] 以相似思路应对该挑战:它们采用 SP,将不同上下文长度的请求切分为更小、可管理的片段,并将这些片段分布到整个集群进行调度。
Infinite-LLM [94] 引入 Dist Attention,这是一种针对自回归解码阶段优化的 SP 注意力机制。此外,Infinite-LLM 还纳入一个全局内存管理器,在考虑一致性约束与碎片化的前提下,协调集群中各请求片段之间的内存分配。
LoongServe [95] 则提出弹性序列并行(Elastic Sequence Parallelism, ESP),以极小开销动态调整推理请求的并行度。ESP 促成两种优化策略:(1)在预填充阶段之后降低序列并行度,并在解码阶段维持较低并行度,因为该阶段(每步自回归)所需计算更少;(2)随着序列长度增长,在自回归阶段提高序列并行度——当预期大语言模型生成长输出序列时,这一点尤为有前景。
图 4:大语言模型服务预填充阶段使用的高效 SP 注意力机制。(原文图见 PDF 第 11–12 页)
(a)Ring Attention [91] 中计算单个解码器层的工作流。它通过分块计算以及计算与数据传输的重叠高效实现 SP。
(b)Striped Attention [93] 中计算单个解码器层的工作流。它通过 token 置换优化 Ring Attention,从而减轻因果掩码导致的 SP 节点间负载不均衡。
图 5:Dist Attention [94, 95],针对大语言模型服务自回归解码阶段优化的 SP 注意力机制。在解码阶段,$Q$ 长度为 1,且 KV 已分布。(原文图见 PDF 第 12 页)
总之,现有工作已从单请求视角或集群视角大幅提升了长上下文服务的性能(P)。我们也发现值得探索的潜在未来方向。首先,尽管这些系统工作对长上下文模型具有通用性,其优化路径与上层模型级优化并无协同,甚至可能相互矛盾。例如,为 SP 节点间负载均衡而优化的注意力机制,在上下文稀疏性下可能表现不佳。其次,就我们所知,尚无工作对智能体层技术与分布式加速系统进行协同设计。例如,请求的分布式推理完成后,其“记忆”分散在多个节点,给智能体系统收集与过滤它们带来挑战。最后,同样地,尚无工作考察是否应以及如何用 SP 加速模型记忆这一线工作(见 §2.2)。
2.5 同时提升上下文长度与性能(CP)
本节讨论能够同时提升上下文长度(C)与性能(P)的工作。一石二鸟颇具挑战;我们识别出一条工作线:提示压缩(prompt compression)。
2.5.1 提示压缩(Prompt Compression)
提示压缩在保留关键信息的前提下缩短给定提示的长度,从而使服务系统能够处理更长上下文。回顾可知,我们依据用户感知的度量指标判定 C 与 P 是否得到满足。我们将该方法归为 CP,因为它可在提示送入模型之前缩短用户提供的提示,从而提升用户感知的上下文长度与性能。我们按大语言模型被用作黑盒还是白盒对工作进行分类。
表 6:提示压缩工作对比。
| Type | Work |
|---|---|
| Black-Box | Selective Context [100], LLMLingua [101], LongLLMLingua [102], LLMLingua2 [103] |
| White-Box | Gist-Token [104], PCCC [105], ICAE [106], AutoCompressor [32] |
黑盒压缩。 LLMLingua [101] 观察到自然语言中存在显著冗余,并提出通过删除 token 来压缩提示的一组方法。它使用 token 级迭代算法压缩提示;通过考虑 token 之间的条件依赖,可保留提示中的关键信息。LongLLMLingua [102] 基于 LLMLingua,通过加入对比困惑度以捕获相对问题的 token 分布偏移,从而实现问题感知压缩。LLMLingua2 [103] 更进一步,面向任务无关的提示压缩:它使用 GPT-4 从原始提示生成压缩文本,并用二分类器丢弃不需要的 token。
白盒压缩。 该线工作会以特定方式修改模型架构以实现压缩,并通过软提示(soft prompting)[35] 馈入压缩后的提示。Gist tokens [104] 修改 Transformer 注意力掩码,使大语言模型能将提示压缩为更小的“gist” token 集合,这些 token 可被缓存并复用以提升计算效率,从而同时改善 C 与 P。另一项工作 PCCC [105] 为大语言模型添加可训练的软提示权重。其洞见是:用于条件化大语言模型的提示,可近似地由一组精心选择的、小得多的权重表示。其目标是训练软提示权重,使之尽可能逼近固定的硬提示。ICAE [106] 采取不同方法:它由两个模块组成——一个从大语言模型经 LoRA 适配的可学习编码器,用于将长上下文编码为少量记忆槽;以及一个固定解码器,即大语言模型本身,其中表示原始上下文的记忆槽被条件化,以与提示交互并完成各类目标。最后,基于 RMT 架构 [31] 的 AutoCompressor [32] 构建段级摘要 token 以压缩提示。
总之,压缩提示有多种方式。既可以视大语言模型为黑盒,在送入黑盒大语言模型之前用一组方法压缩提示;也可以修改模型架构以实现有效压缩。提示压缩提升用户感知的 C 与 P。
2.6 同时提升上下文长度与准确性(CA)
本节讨论能够同时提升上下文长度(C)与准确性(A)的工作。我们识别出一条工作线:智能体记忆(agent memory),即在智能体层管理记忆。
2.6.1 智能体记忆(Agent Memory)
扩展服务系统上下文长度与性能的一种方式,是在智能体层隐式管理记忆与提示。我们将该方法称为智能体记忆。它属于 CA,因为它能在固定上下文模型之上营造无限上下文的错觉,并反思过往记忆以提升未来任务准确性,从而改善用户感知的 C 与 A。智能体记忆不同于此前介绍的模型记忆(model memory):智能体记忆在智能体内操纵记忆与提示,而模型记忆在模型内操纵记忆。二者并非冲突方案,而是相互补充。例如,可以在 Infini-Attention [33] 等模型记忆工作之上运行 MemGPT [107] 等智能体记忆工作。
我们从两个维度讨论智能体记忆工作。
表 7:智能体记忆工作对比。
| Work | Online Memory Management | Offline Memory Reflection |
|---|---|---|
| MemWalker [108] | ✓ | / |
| WebGPT [109] | ✓ | / |
| MemGPT [107] | ✓ | / |
| TheSim [110] | ✓ | ✓ |
| ChatDev [111] | ✓ | ✓ |
| MetaGPT [112] | ✓ | ✓ |
| Self-Refine [113] | ✓ | ✓ |
| Reflexion [114] | ✓ | ✓ |
| MLCopilot [115] | ✓ | ✓ |
在线记忆管理(Online Memory Management): 指方案能否基于智能体的过往记忆、外部知识与当前用户提示,实时动态构造送入模型的提示。这需要从过往记忆中获取相关信息的机制,以及构造提示的机制。MemWalker [108]、WebGPT [109] 与 MemGPT [107] 是该方向的开创性工作。尤其是,MemGPT 在固定上下文模型之上提供无限上下文的错觉。它构建多层层次结构及一组机制,在当前构造的提示与外部过往记忆之间交换记忆,从而隐式提升 C。
离线记忆反思(Offline Memory Reflection): 指方案能否反思智能体的过往记忆以学习经验、提炼知识、删除不必要语句等。这需要读写过往记忆的机制。许多基于智能体的应用采用该离线机制,以提升未来任务的服务准确性 [113, 114]。例如,ChatDev [111]、Generative Agents [110] 与 MLCopilot [115] 中的智能体会定期反思,将过往记忆综合为更高层次知识,以提升未来任务准确性。综合来看,具备这些特征的智能体记忆可提升 C 与 A。
总之,智能体记忆有两个关键特征:在线记忆管理与离线记忆反思。前者满足 C,后者满足 A。若再加入提示压缩,智能体记忆便接近 CAP。
3 结论(Conclusion)
我们认为,除拥有高质量模型外,以合理成本大规模部署与服务模型且不牺牲准确性同样重要。我们综述大语言模型服务领域,以理解在长上下文服务需求日益增长的背景下,成本效率与准确性之间的复杂动态关系。我们的发现表明,该空间中的工作沿着三个彼此冲突的目标进行优化:提升服务上下文长度(C)、提升服务准确性(A),以及提升服务性能(P)。我们提出 CAP 原则:任何给定的大语言模型服务优化最多只能改善上述三个目标中的两个。我们仔细考察相关文献,发现现有工作均可落入该分类。展望未来,我们希望该原则能帮助设计者认识构建大规模服务系统时固有且动态的权衡。
参考文献
(参考文献列表共约 7 页,请参见原文 PDF 第 15–22 页,此处不再翻译。)