发表于2025年1月2日
基于键值缓存管理的大语言模型加速综述
摘要
大语言模型(LLMs)凭借其理解上下文和进行逻辑推理的能力,在自然语言处理、计算机视觉和多模态任务等众多领域引发了变革。然而,大语言模型的计算和内存需求,尤其是在推理过程中,给其扩展到实际应用、长上下文场景和实时应用带来了巨大挑战。键值(KV)缓存管理已成为一种关键的优化技术,通过减少冗余计算和提高内存利用率来加速大语言模型的推理。本综述全面概述了用于大语言模型加速的键值缓存管理策略,将其分为token级、模型级和系统级优化。token级策略包括键值缓存选择、预算分配、合并、量化和低秩分解,而模型级优化则侧重于架构创新和注意力机制,以增强键值的重用。系统级方法解决内存管理、调度和硬件感知设计等问题,以提高不同计算环境下的效率。此外,本综述还概述了用于评估这些策略的文本和多模态数据集及基准测试。通过详细的分类和对比分析,本研究旨在为研究人员和从业者提供有用的见解,支持高效且可扩展的键值缓存管理技术的开发,有助于大语言模型在实际应用中的部署。键值缓存管理的精选论文列表见:https://github.com/TreeAI-Lab/Awesome-KV-Cache-Management。
1 引言
大语言模型(LLMs)[1,2]在大规模语料库上进行训练,已经在自然语言处理[3,4,5]、计算机视觉[6,7,8]和多模态[9,10,11]任务等多个领域引发了变革。它们理解上下文和进行逻辑推理的能力使其在各个领域取得了显著成功,如时间序列分析[12,13]、推荐系统[14,15]、自动驾驶[16,17,18]和医疗保健[19,20]等。这些突破得益于最先进的架构和训练范式,使模型能够在各种任务中实现无与伦比的性能。著名的大语言模型,如GPT[21,22,23]、LLaMA[24,25]、DeepSeek[26,27,28]、Mistral[29,30]和GLM[31,32],均基于基础的Transformer架构[33]构建,该架构擅长捕捉序列数据中的长距离依赖关系。然而,尽管大语言模型功能强大,但其计算和内存需求,特别是在推理期间,在将其扩展到实际应用、长上下文场景和实时应用时,仍带来了重大挑战。
大语言模型推理中的一个关键瓶颈在于键值(KV)对的高效管理。最近,缓存技术[34,35]已被广泛应用于存储先前计算的中间结果,以便在后续推理步骤中重用,从而加速模型,如图神经网络[36,37,38]。幸运的是,大语言模型固有的自回归生成机制为利用键值缓存进行高效文本生成提供了机会。具体而言,自回归生成使大语言模型能够逐个token地生成文本,每个token都依赖于先前生成的所有token。虽然这种方法在生成连贯且与上下文相关的输出方面非常有效,但随着输入序列变长,其扩展性较差,因为计算和内存需求会随着序列长度呈二次增长。键值缓存通过存储先前解码步骤中的键和值矩阵来解决这个问题,允许重用这些矩阵,从而显著减少冗余计算。
最近的一些综述[2,39,40,41,42,43,44,45,46,47,48,49,50]探讨了高效大语言模型的领域。这些综述主要研究了大语言模型效率的各个方面,提供了有价值的见解,同时也为进一步的改进和创新留下了空间。特别是,许多这些工作主要关注提高大语言模型效率的整体方法,从多个维度研究了广泛的技术,如跨度数据级优化(例如提示工程)、模型架构级优化(例如高效Transformer设计)和系统级优化(例如任务调度)。例如,Ding等人[42]探索了整合数据级和模型架构视角的效率技术,而Miao等人[43]从综合系统级视角研究了高效的大语言模型推理。同样,Tang等人[46]、Wan等人[44]和Xu等人[48]提供了涵盖数据、模型和系统级优化的分析,反映了大语言模型加速的整体方法。
另一方面,一些综述关注大语言模型加速的更专业方面。例如,Zhu等人[2]、Park等人[40]、Wang等人[41]和Tang等人[46]将模型压缩作为模型级优化的一个关键方面。同样,Kachris等人[47]研究了为大语言模型量身定制的硬件加速策略,而Xu等人[48]研究了参数高效调整方法。Albalak等人[49]讨论了提高大语言模型训练效率的数据选择策略,Xia等人[51]强调了协作技术,如推测解码[52,53],以加速模型推理。Li等人[54]关注提示压缩。与我们的工作类似,Shi等人[55]、Li等人[56]和Yuan等人[57]也探索了使用键值缓存来加速大语言模型。然而,我们的综述既具有互补性又更加全面,为基于文本和多模态的大语言模型的键值缓存管理提供了详细的分类。我们从token级、模型级和系统级的角度对技术进行分类,并包括文本和多模态场景的基准测试。特别是,作为对现有键值缓存综述的补充,我们详细比较了现有模型在token级、模型级和系统级的差异和优势。
具体而言,本综述全面概述了键值缓存管理的现状及其在加速大语言模型推理中的作用。我们首先介绍Transformer架构以及键值缓存在实现高效自回归文本生成中的作用。然后,我们分析与键值缓存管理相关的挑战,包括其对计算复杂度、内存使用和实时性能的影响。在此之后,我们提出了现有优化技术的分类,将它们分为token级、模型级和系统级优化方法。此外,我们讨论了用于对这些技术进行基准测试的数据集和评估指标,并深入了解它们在各种任务和应用中的有效性。
2 预备知识
在庞大语料库上进行预训练的大语言模型(LLMs),展现出了卓越的上下文理解和逻辑推理能力。这些模型在众多领域的广泛任务中都取得了显著成功,涵盖自然语言处理[3,4,5]和计算机视觉[6,7,8]等。主流的大语言模型,如GPT[58]、LLaMA[24]和DeepSeek[26],主要构建于Transformer架构[33]之上。为探究键值(KV)缓存管理在加速大语言模型计算中的作用,我们首先概述Transformer模型的核心组件,接着介绍用于管理键值缓存以加速大语言模型的机制。本综述中的重要符号汇总于表1。
表1 符号汇总
Transformer[33]已成为大语言模型的骨干架构,因其能够高效捕捉序列数据(如文本)中的长距离依赖关系。这一特性使其特别适用于机器翻译、文本生成和图像字幕生成等任务。Transformer架构采用编码器 - 解码器结构,大多数大语言模型仅使用解码器组件。我们首先介绍Transformer解码器的核心组件,然后描述关键的自回归生成机制。特别地,我们不描述Transformer中的某些组件,如归一化,因为它们不影响对键值缓存管理的理解。
2.1.1 Transformer解码器
如图1所示,基于解码器的Transformer架构由多个堆叠的Transformer块组成,每个块旨在有效处理序列数据。通常,一个Transformer块包含两个核心组件,即多头自注意力(MHSA)机制和前馈网络(FFN)。这些块按顺序排列,其中一个块的输出作为下一个块的输入。这种迭代设计使模型能够逐步完善对输入序列的理解,使其在文本生成和语言建模等任务中非常有效。
位置编码:在输入序列被Transformer块处理之前,会经历一个预处理阶段。首先,分词器对输入句子 \(X\) 进行处理,将其分割成离散单元,如单词或子单词。得到的序列可以表示为 \(X = [x_1, x_2, \cdots, x_{|X|}]\) 。然后,这些token通过嵌入层映射到密集向量表示,即 \(X = I_X E^{\top}\) ,其中 \(I_X \in \{0, 1\}^{n × d_{vocab}}\) 表示分词后输入 \(X\) 的独热向量,\(E \in \mathbb{R}^{d_{vocab} × d_x}\) 是嵌入矩阵,\(X = [x_1, x_2, \cdots, x_{|X|}] \in \mathbb{R}^{n × d_x}\) 是得到的嵌入token表示矩阵。由于Transformer架构本身并不考虑序列中token的顺序,因此将位置编码添加到token嵌入 \(x\) 中以融入位置信息。这可以表示为 \(X = X + PE(X)\) ,其中 \(PE(X) \in \mathbb{R}^{n × d_x}\) 表示一个函数[59,60,61](例如,基于正弦和余弦的位置编码),用于为输入 \(X\) 生成位置嵌入。
Transformer块:一旦准备好输入特征,它们就会通过一系列堆叠的Transformer块。每个块都以多头自注意力(MHSA)机制开始,该机制可以捕捉局部和全局依赖关系。对于每个token,自注意力机制计算序列中所有其他token的加权和,其中权重来自token之间的相似度。特别地,由于每个Transformer块内的操作是相同的,我们以单个Transformer块为例。具体来说,给定一个块的输入,记为 \(X \in \mathbb{R}^{|X| × d}\) ,MHSA机制计算查询向量 \(Q_i \in \mathbb{R}^{|X| × d_k}\) 、键向量 \(K_i \in \mathbb{R}^{|X| × d_k}\) 和值向量 \(V_i \in \mathbb{R}^{|X| × d_v}\) 。
这些向量通过学习到的线性变换得到,如下所示:
\(Q_i = XW_{Q_i}, K_i = XW_{K_i}, V_i = XW_{V_i} \quad (1)\)
其中 \(W_{Q_i} \in \mathbb{R}^{d_x × d_k}\) ,\(W_{K_i} \in \mathbb{R}^{d_x × d_k}\) 和 \(W_{V_i} \in \mathbb{R}^{d_x × d_v}\) 是学习到的权重参数。然后,对每个三元组 \((Q_i, K_i, V_i)\) 应用自注意力操作,得到第 \(i\) 个注意力头的输出 \(Z_i\) 如下:
\(Z_i = Attention(Q_i, K_i, V_i) = Softmax(\frac{Q_i K_i^{\top}}{\sqrt{d_k}}) V_i \quad (2)\)
其中 \(\sqrt{d_k}\) 是一个缩放因子,用于确保数值稳定性。为了捕捉不同的关系,对 \(x\) 并行应用多个注意力头,并将它们的输出通过一次变换连接起来,如下所示:
\(Z = Concat(Z_1, Z_2, \cdots, Z_h) W_O \quad (3)\)
其中 \(Concat\) 是连接操作,\(W_O \in \mathbb{R}^{d_v × d_o}\) 是可训练参数。
在自注意力机制之后,输出会通过一个前馈网络(FFN)。FFN是一个全连接神经网络,应用两个由非线性激活函数 \(\sigma(\cdot)\) (例如ReLU[62])分隔的线性变换:
\(FFN(Z) = \sigma(ZW_1 + b_1)W_2 + b_2\)
其中 \(W_1 \in \mathbb{R}^{d_o × d_1}\) 和 \(W_2 \in \mathbb{R}^{d_1 × d_2}\) 是两个参数。此外,\(b_1 \in \mathbb{R}^{d_1}\) 和 \(b_2 \in \mathbb{R}^{d_2}\) 是两个偏置向量。
2.1.2 自回归生成机制
大语言模型采用自回归机制逐个token地生成文本,每个token都依赖于先前生成的token。这个迭代过程确保输出序列保持连贯且符合上下文。形式上,给定一个token输入序列 \(X = [x_1, x_2, \cdots, x_t]\) ,模型在每个解码步骤 \(t\) 通过对条件概率分布进行建模来预测下一个token \(x_{t + 1}\) ,如下所示:
\(P(x_{t + 1} | x_1, x_2, \cdots, x_t) = Softmax(h_t W_{out} + b_{out}) \quad (5)\)
其中 \(h_t \in \mathbb{R}^{d_h}\) 表示大语言模型在步骤 \(t\) 时关于 \(X\) 的隐藏状态,\(W_{out} \in \mathbb{R}^{d_h × vocab}\) 是输出投影矩阵,\(b_{out}\) 是偏置向量。Softmax函数将对数its转换为词汇表上的概率分布。然后,在每个解码步骤,模型通过从预测的概率分布中采样来生成下一个token \(x_{t + 1}\) :
\(x_{t + 1} \sim P(x_{t + 1} | x_1, x_2, \cdots, x_t) \quad (6)\)
生成的token \(x_{t + 1}\) 随后被附加到序列 \(X = [x_1, \cdots, x_t, x_{t + 1}]\) 中,这个过程一直持续,直到生成一个特殊的序列结束(EOS)token或达到预定义的最大长度。
图1 用于大语言模型的仅解码器Transformer
自回归生成是一种强大的机制,使大语言模型能够生成高质量、上下文连贯的文本。然而,对于长序列,它会带来计算挑战,因为在生成过程中每个token都需要重新计算键和值。键值缓存优化通过存储先前计算的键和值,并在后续token生成中重用它们,从而解决了这个问题,减少了冗余计算并提高了推理效率。
2.2.1 基于键值缓存的自回归生成
这里,我们描述缓存token的键值对如何加速大语言模型的推理。具体来说,在每个解码步骤 \(t\) ,模型对整个序列 \(X = [x_1, \cdots, x_{t - 1}, x_t]\) 执行自注意力操作,以生成下一个token \(x_{t + 1}\) 。这个过程需要为 \(X = [x_1, \cdots, x_t]\) 中所有先前处理的token计算键和值矩阵。值得注意的是,在生成token \(x_t\) 时,大语言模型已经计算了 \(X[1:t - 1] = [x_1, \cdots, x_{t - 1}]\) 中token的键和值。键值缓存通过存储 \(X[1:t - 1]\) 先前计算的键和值矩阵并重用它们来优化这个过程,从而只需要为新token \(x_t\) 计算键和值。这通过消除冗余计算显著提高了效率。
形式上,在解码步骤 \(t\) ,新的token嵌入 \(x_t\) 用于计算查询向量 \(q_i^t\) 、键向量 \(k_i^t\) 和值向量 \(v_i^t\) ,如下所示:
\(q_i^t = x_t W_{Q_i}, k_i^t = x_t W_{K_i}, v_i^t = x_t W_{V_i} \quad (7)\)
新计算的 \(k_i^t\) 和 \(v_i^t\) 随后被附加到先前步骤缓存的键和值矩阵中:
\(K_i^t = Concat(\hat{K}_i^{t - 1}, k_i^t), V_i^t = Concat(\hat{V}_i^{t - 1}, V_i^t) \quad (8)\)
其中 \(\hat{K}_i^{t - 1} \in \mathbb{R}^{(t - 1) × d_k}\) 和 \(\hat{V}_i^{t - 1} \in \mathbb{R}^{(t - 1) × d_v}\) 表示 \(X[1:t - 1]\) 中token的缓存键和值矩阵。这些缓存矩阵随后用于token \(x_t\) 的缩放点积注意力计算。步骤 \(t\) 时token \(x_t\) 的注意力输出 \(z_i^t\) 计算如下:
\(z_i^t = Softmax(\frac{q_i^t K_i^{t^{\top}}}{\sqrt{d_k}}) V_i^t\)
然后,类似的键值重用过程可以应用于大语言模型每一层的不同注意力头。
2.2.2 时间和空间复杂度分析
给定一个基于Transformer的 \(L\) 层大语言模型,每层有 \(h\) 个注意力头,输入序列长度为 \(X = [x_1, \cdots, x_t]\) ,我们分析节省的时间和存储缓存键值对所需的空间。为简单起见,我们假设为大语言模型所有层的所有头存储 \(t_c个token的键值对。
节省的时间:对于每个token,节省的计算时间来自于避免重复计算公式(1)中的键值对、公式(2)中的自注意力结果以及公式(3)中的线性变换。我们忽略了Transformer中不影响理解键值缓存加速的操作的时间分析,如层归一化和位置编码。计算每个token的查询、键和值的时间为\(\triangle_{1}=O(2d_{x}d_{k}+d_{x}d_{v})\) 。此外,计算公式(2)中每个注意力结果\(z_{i}\) 的时间为\(O(t(d_{k}+d_{v}))\) 。为了合并公式(3)中的\(h\) 个注意力结果,所需时间为\(\triangle_{2}=O(h d_{v}+d_{v}d_{o})\) 。因此,对于跨\(h\) 个注意力头和\(L\) 层的\(t_{c}\) 个缓存token,总共节省的计算时间为:
\(O\left(L \cdot h \cdot t_{c} \cdot t \cdot\left(d_{k}+d_{v}\right)+L \cdot h \cdot t_{c}\left(\triangle_{1}+\triangle_{2}\right)\right) \quad(10)\)
因此,节省的时间与缓存token的数量\(t_{c}\) 成正比,显著加速了模型计算,特别是对于较长的序列(当\(t\) 较大时)。
额外空间:与不进行缓存的计算相比,需要额外的空间来存储跨\(h\) 个注意力头和\(L\) 层的\(t_{c}\) 个token的缓存键值对。假设每个键和值以Float16精度存储,则所需的总额外空间可以表示为:
\(O\left(L \cdot h \cdot t_{c} \cdot 2 \cdot sizeof( Float 16)\right)\)
因此,对于相同的大语言模型,存储键值对所需的额外空间主要取决于缓存token的数量以及缓存键值的精度。为了解决这个问题,现有方法探索了各种技术来减少额外的空间消耗,例如仅缓存最重要的键值对,或者应用量化技术来降低存储的键值的比特精度。
2.3 键值缓存管理中的挑战
如2.2.2节所分析的,重用缓存的键值对使大语言模型能够避免重新计算过去的token,从而在推理过程中显著提高速度。然而,随着序列长度的增加,键值缓存的大小也会成比例增加,给内存带来巨大压力。因此,如何有效地管理这个缓存以加速大语言模型计算,同时又不过度占用空间,成为了一个挑战。
- 缓存淘汰策略:当缓存达到容量时,确定淘汰哪些项目是一个复杂的问题。像最近最少使用(LRU)或最不经常使用(LFU)这样流行的策略,并不符合大语言模型的模式,会导致性能不佳。
- 内存管理:键值缓存所需的内存随着序列长度和层数线性增长,这可能很快就会超过硬件内存限制,特别是对于长序列。因此,管理不同类型存储硬件(如GPU、CPU或外部内存)之间的协作,成为了一个重大挑战。
- 延迟瓶颈:在每个解码步骤访问和更新缓存会引入延迟,特别是对于内存带宽有限的硬件。
- 压缩权衡:压缩键值缓存可以减少内存使用,但如果丢失关键信息,可能会降低模型性能。
- 动态工作负载:处理动态且不可预测的工作负载(其中访问模式和数据需求频繁变化),需要能够实时响应的自适应缓存策略。
- 分布式协调:在分布式键值缓存中,跨多个节点维护协调,以确保一致性、容错性和高效的资源使用,这增加了显著的复杂性。
3 分类法
在上述章节中,我们分析了缓存的键值(KV)对数量如何显著影响推理过程中的计算时间和额外内存需求。高效的键值缓存管理对于平衡性能提升和资源利用至关重要,尤其是随着序列长度和模型规模的不断增长。在仔细研究现有方法后,我们将键值缓存优化策略分为三个层次:token级优化、模型级优化和系统级优化。每个层次都针对键值缓存管理相关挑战的特定方面,并提供独特的技术来提高效率。详细的分类法如图2所示。
图2 大语言模型键值缓存管理分类法
token级优化
指的是通过在token级别进行细粒度的精心选择、组织和压缩,来提高键值缓存管理效率,而无需对原始模型的架构进行更改。键值缓存选择(4.1节)侧重于对最相关的token进行优先级排序和存储。键值缓存预算分配(4.2节)则根据token动态分配内存资源,以确保在有限内存下高效利用缓存。此外,键值缓存合并(4.3节)通过组合相似或重叠的键值对来减少冗余,而键值缓存量化(4.4节)通过降低缓存键值对的精度来最小化内存占用。最后,键值缓存低秩分解(4.5节)使用低秩分解技术来减小缓存大小。
模型级优化
指的是设计高效的模型结构来优化键值缓存管理。这可以进一步细分为几种策略:注意力分组和共享(5.1节)方法研究键值的冗余功能,并在Transformer层内或跨层对键值缓存进行分组和共享。架构变更(5.2节)旨在设计新的注意力机制或构建外部模块以进行键值优化。此外,还有一些工作设计或结合非Transformer架构(5.3节),这些架构采用其他内存高效设计(如循环神经网络)来优化传统Transformer中的键值缓存。
系统级优化
指的是通过两个经典的底层方面来优化键值缓存管理:内存管理(6.1节)和调度(6.2节)。内存管理技术侧重于架构创新,如虚拟内存适配、智能前缀共享和层感知资源分配;调度策略则通过前缀感知方法(用于最大化缓存重用)、抢占式技术(用于公平的上下文切换)和特定层机制(用于细粒度的缓存控制)来实现多样化的优化目标。此外,我们在6.3节中详细介绍了硬件加速器设计,包括单GPU/多GPU设计、基于I/O的解决方案、异构计算和基于SSD的解决方案 。
4 token级优化
在token级别,优化完全基于token的键值对的特征和模式来改进键值缓存,而不考虑模型架构改进或系统并行化技术带来的增强。一般来说,token级优化方法主要受大语言模型和序列输入的观察结果指导。现有方法可以分为五种主要类型:键值缓存选择、键值缓存预算分配、键值缓存合并、键值缓存量化和键值缓存低秩分解。token级优化的分类法如图3所示。
图3 键值缓存管理的token级优化分类法
4.1 键值缓存选择
键值缓存选择机制已成为一种关键的优化策略,旨在降低大语言模型中键值缓存的内存利用率、最小化推理延迟并提高整体吞吐量。这些优化目标推动了各种选择方法的发展,这些方法可以分为两类:
(1)静态键值缓存选择,仅在预填充阶段进行token过滤,选定的token在后续解码步骤中保持固定;
(2)动态键值缓存选择,在解码阶段持续更新键值缓存,实现自适应缓存管理。
在动态键值缓存选择方法中,未被选择的键值缓存token可能会被永久淘汰,或卸载到如CPU内存这样的分层缓存设备中,实现多层存储策略。鉴于解码过程中的实时键值缓存选择可能会带来巨大的计算开销,一些研究专注于开发优化的检索算法,以提高这一过程的效率。这些优化包括以块级检索代替token级粒度以降低搜索复杂度、采用异步查询机制来隐藏延迟,以及使用并行检索管道来加速选择过程。这些优化工作旨在减轻计算负担,同时保持token选择的有效性。键值缓存选择的总结见表2。
表2 键值缓存选择策略比较
4.1.1 静态键值缓存选择
静态键值缓存选择方法在预填充阶段完成后,立即对键值缓存进行一次性压缩。然后,模型在后续的解码推理中使用这个压缩后的键值缓存。FastGen[133]引入了一种模式感知方法,通过识别五种基本的注意力结构并实施有针对性的选择策略。这些策略包括基于邻近度的保留以处理局部注意力模式、选择性保留关键标点token以聚焦注意力、基于频率的过滤以处理稀疏注意力分布,以及对广泛注意力模式的完整token保留。
SnapKV[134]简化了FastGen的方法,仅基于token的重要性分数来检索token。它表明在所有提示token中,只有一部分携带了对响应生成至关重要的信息,并且这些token在生成阶段保持其重要性。该方法采用末端定位的观察窗口来检测这些重要的上下文token,然后将它们相应的键值对与观察窗口中的token连接起来。Attention-Gate[135]引入了一种可学习的键值缓存淘汰机制,该机制处理整个上下文序列,并通过参数化策略网络生成token级的淘汰决策,实现动态的上下文内存管理。
4.1.2 带永久淘汰的动态选择
这一类方法在解码阶段频繁进行键值缓存选择,从内存中永久删除未被选择的键值缓存token。早期的工作采用滑动窗口机制来应对长文本推理挑战,窗口外的token会被永久淘汰且无法访问。StreamingLLM[136]揭示了Transformer注意力中的一个关键现象,即初始序列token保留的键值对对模型性能至关重要。这种注意力汇聚效应通过早期位置的非对称注意力权重积累表现出来,与语义重要性无关。该方法利用这一特性,将注意力汇聚位置与近期上下文结合起来进行高效处理。LMInfinite[137]表明,包括滑动窗口模式和相对位置编码在内的传统技术,无法解决长度泛化问题。该研究通过整合Λ形注意力掩码和注意力距离上限机制,引入了一种新颖的方法。
近期的工作探索利用注意力分数作为选择重要键值缓存token的标准。H2O[127]观察到注意力计算主要由一组称为“重击者”(H2)的高影响力token驱动。该方法将缓存优化重新表述为一个动态子模问题,利用累积注意力分数来指导token保留决策。与H2O不同,BUZZ[128]采用蜂巢状结构,在局部键值缓存段中选择重击者。NACL[129]指出H2O的一个基本局限性,即其依赖可能有偏差的局部注意力统计信息。为克服这一问题,他们开发了一种替代方法,实施多样化的随机淘汰策略来选择token。Scissorhands[130]基于时间重要性原则,即具有历史重要性的token在后续计算步骤中保持其影响力。这一观察使得通过选择性token保留来保留重复的注意力模式成为可能。此外,Keyformer[131]揭示了token删除会扭曲底层的softmax概率分布。考虑到softmax分布在评估token重要性中的关键作用,他们引入正则化技术来减轻这些分布扰动。SepLLM[132]观察到分隔符token(如逗号、句号和换行符)会获得不成比例的高注意力分数,并且自然地总结文本段。基于此,SepLLM在缓存中保留分隔符token以及初始token、重要token和近期token。
4.1.3 无永久淘汰的动态选择
上述基于永久淘汰的方法面临两个主要限制。首先,不可逆地淘汰token可能会损害模型在长序列任务上的性能,特别是在大海捞针式的场景中,并且这些方法难以适应多轮对话上下文。其次,解码阶段的键值缓存选择会引入计算开销,对解码延迟产生不利影响,从而影响端到端的加速效果。为应对这些挑战,一些研究专注于开发解码阶段无永久淘汰的键值缓存选择策略。这些方法通常采用多层缓存系统(如CPU - GPU分层缓存),并利用先进的数据结构和系统级增强来优化检索效率,从而在减少GPU键值缓存占用的情况下实现高效推理。
为加速关键token的检索,一些研究提出了基于索引的方法,这些方法以块或簇为粒度组织和访问键值缓存,实现高效的查询和提取操作。InfLLM[121]以块为单位维护完整的键值缓存,同时通过分层存储策略促进长序列处理。该框架采用CPU - GPU内存编排,将重要token和当前计算单元保留在GPU内存中,同时将访问频率较低的单元卸载到CPU内存中。为进一步提高前k块检索的精度,Quest[122]框架提出了一种基于键值缓存块中最小和最大键值的精细块表示方法。PQCache[98]也实现了基于块的键值缓存管理,并通过最大内积搜索(MIPS)识别显著token,利用乘积量化(PQ)码和质心。SqueezedAttention[123]在离线阶段使用K均值聚类将语义相似的键分组,每个组由一个质心表示。在推理时,它将输入查询与这些质心进行比较,仅从上下文中识别和加载语义相关的键。类似地,RetrievalAttention[124]使用近似最近邻搜索(ANNS)技术对键值缓存token进行索引。此外,EM - LLM[125]将传入的token动态分割为事件片段。此外,它实现了一种混合检索机制,将语义相似性匹配与时间上下文相结合,以高效访问相关的键值缓存段。同样,ClusterKV[126]将token分组为语义簇,并在推理时选择性地召回它们,为大语言模型实现了高精度和高效率。
为加速前k token的识别,SparQ[138]识别输入查询向量中r个最重要的元素,并选择性地检索缓存键矩阵K隐藏维度上的相应组件,以进行近似注意力计算。为重叠预取延迟,InfiniGen[139]采用异步预取,利用前一层查询选择的显著键值条目索引,检索当前层的键值缓存条目。为确保最大的模型性能,RecycledAttention[140]在推理计算期间保留整个键值缓存,这在内存效率方面没有改进。该方法定期进行前ktoken选择,以识别显著token。此外,MagicPIG[141]表明基于注意力的前k选择可能会导致性能下降。为解决这一限制,他们引入了一种新颖的异构计算框架,利用局部敏感哈希(LSH)技术。该系统存储LSH哈希表,并在CPU上进行注意力估计。
4.1.4 总结与未来方向
静态键值缓存选择算法总体上展示出卓越的解码效率;然而,其在多轮对话和扩展解码长度场景中的有效性仍有待充分验证。动态键值缓存选择算法虽然具有适应性,但由于解码阶段频繁的缓存选择操作,会引入额外的计算开销。多层缓存架构和预取方案部分缓解了这些挑战,但其在可接受的解码延迟约束内实现快速准确检索的能力,仍需要在涉及长序列的实际应用中进一步实证验证。此外,现有选择方法主要依赖基于注意力分数的前k选择机制。然而,基于现有的位置编码方案,当前的前k方法可能无法在超长序列任务中有效识别和提取相关token。
4.2 键值缓存预算分配
大语言模型的分层架构导致各层的信息提取模式各不相同,每一层的键值缓存对模型性能的贡献也有所差异。这种固有的异质性表明,对各层进行统一的键值缓存压缩可能并非最优选择。键值缓存预算分配旨在通过根据每个组件对预测准确性的重要性,智能地分配内存资源,从而在最小化准确性下降的同时优化内存利用率。当前的预算分配策略可以分为两个粒度级别:层级预算分配,为模型的不同层分配不同的压缩比;以及更细粒度的头级预算分配,能够在每一层内的各个注意力头之间进行精确的内存分配,提供更灵活和有针对性的优化机会。键值预算分配的总结见表3。
表3 键值缓存预算分配策略比较
4.2.1 层级预算分配
与传统的统一键值缓存大小的方法不同,PyramidKV[116]采用金字塔形的内存分配策略,为较低层分配较大的缓存容量,而随着层数增加,缓存容量逐渐减小。这一设计基于以下观察结果:较低层在输入序列上表现出均匀的注意力分布,而较高层则将注意力集中在特定token上。PyramidInfer[117]也采用金字塔形预算分配策略,同时在每一层选择具有高注意力值的token。此外,在解码阶段,PyramidInfer通过注意力值的频繁更新,动态维护一组重要token。与先前方法不同,DynamicKV[118]通过分析注意力模式,实现了一种输入自适应的预算分配策略。具体来说,它计算近期和历史token之间的平均注意力分数,识别各层中具有最高注意力值的前k个token,并根据重要token在每一层中的密度按比例分配预算。同样,PrefixKV[119]通过计算每一层中token的平均注意力分数,确定该层最重要的token。PrefixKV[119]然后使用统一的阈值来确定保留token的数量,并根据各层的重要性分布自适应地调整保留数量。CAKE[142]从两个角度审视注意力分数:token间注意力的空间分布和注意力焦点的时间演变。这些测量结果相结合,计算出特定层的重要性分数,进而指导内存资源的分配。此外,SimLayerKV[120]识别出“懒惰层”,即那些在捕捉长距离依赖关系方面效果有限的层。该框架然后选择性地保留缓存条目,为懒惰层保留初始和近期token,同时为非懒惰层保留完整的键值缓存。
4.2.2 头级预算分配
AdaKV[110]利用了不同注意力头的注意力模式表现出明显集中性的观察结果。它通过优化原始和修剪的多头注意力输出之间的L1损失边界,实现了特定头的内存分配。在层级预算的约束下,该方法在不同头之间分配缓存容量,以最大化保留的注意力信息总和。在AdaKV的基础上,CriticalKV[111]引入了重大改进,认识到键值缓存条目的重要性不仅限于注意力权重,还包括值状态和预训练参数矩阵。利用这一见解,该框架实现了一种新颖的选择算法,通过最小化最大潜在输出扰动,识别出关键的缓存条目。LeanKV[112]实现了一种针对每个注意力头和输入请求独立运行的细粒度内存优化策略。该方法确定保留大部分信息流所需的最小token子集,并根据预定义的注意力分数阈值(通常保持总注意力质量的95%)分配缓存空间。
基于检索头的方法是头级分配策略中的一个特殊类别,专注于识别和优先考虑对从长序列中提取关键信息至关重要的注意力头。由于这些被称为检索头[143]的特殊头在信息提取中起着重要作用,该方法会为它们分配更大的缓存预算。RazorAttention[113]将检索头分为两类:回声头,专注于先前出现的相同token;归纳头,关注当前token重复之前的先行token。该框架实施差异化缓存策略,为检索头维护完整的缓存条目,同时将非检索头的远程token压缩为合并补偿token。HeadKV[114]通过引入一种新颖的头评估框架进一步增强了RazorAttention,该框架同时评估检索和推理能力,以优化键值缓存分配策略。DuoAttention[115]进一步引入了一种参数化方法,区分两类注意力机制:检索头,对全面的长上下文处理至关重要;流式头,主要处理近期token和注意力汇聚点。这种分类通过学习参数自动识别需要完整注意力跨度的检索头。
4.2.3 总结与未来方向
尽管键值缓存预算分配研究最近取得了进展并受到越来越多的关注,但仍有几个关键挑战尚未解决。首先,分配策略与模型性能之间的关系需要进一步研究。例如,主张为较低层分配更大预算的金字塔形分配策略[116,117],与基于检索头的研究[113,114]之间存在显著差异,后者表明较低层很少表现出检索头特征,因此需要的缓存资源最少。此外,该领域缺乏全面的实验比较,特别是关于头级预算分配策略与vLLM[144]和FlashAttention[145]等前沿框架的兼容性和性能优势。现有方法,如PyramidInfer[117],对输入注意力模式表现出一定的适应性。然而,未来的研究可以针对实时、特定任务的分配策略,在推理过程中根据输入特征、任务复杂性或下游需求动态调整内存预算。
4.3 键值缓存合并
键值缓存合并通过在不显著降低模型准确性的情况下压缩或整合键值缓存,提供了一种有前景的解决方案。与统一压缩策略不同,键值缓存合并技术利用层内和层间的固有冗余,动态优化内存利用。这些方法旨在在保留准确注意力计算所需关键信息的同时,减小键值缓存的大小,从而在资源受限的环境中实现高效推理。现有的键值缓存合并策略可分为两种主要方法:层内合并,专注于整合单个层内的键值缓存,以减少每层的内存使用;跨层合并,针对层间的冗余,消除不必要的重复。这两种方法各有优势,为平衡内存节省和模型性能下降提供了灵活性。键值缓存合并的总结见表4。
表4 现有键值缓存合并方法总结
4.3.1 层内合并
随着输入序列长度的增加,键和值的数量也会增加,导致注意力过程的计算成本更高。为了解决这个问题,CCM[101]、LoMA[102]、DMC[103]提出学习一个压缩模块来压缩token的键值对。
具体来说,CCM[101]在输入序列中插入一个特殊的指示token[COMP],并将这些指示token之间每一层中累积的过去注意力键/值(KV)对压缩到一个紧凑的内存空间中。这种压缩利用了受压缩Transformer[146]和Gisting[147]启发的技术。CCM[101]不是对所有token计算注意力,而是通过引用合并后的token为每个新token计算注意力分数。类似地,LoMA[102]在输入序列中插入一个特殊token,以确定哪些连续token应该被压缩。LoMA[102]使用双向注意力、重复区域监督以及精心设计的注意力掩码和损失函数进行压缩。DMC[103]学习一个变量,以决定在必要时是将新的键值对追加到缓存中,还是使用加权平均将它们合并到现有的键值表示中。请注意,CCM[101]、LoMA[102]和DMC[103]需要监督学习来学习压缩模块。
相反,CaM[104]、KVMerger[108]和D2O[105]是无需训练的,它们基于观察结果,直接提出基于规则或启发式的合并策略。具体来说,它们将每一层中token的键和值分为重要(保留)和不重要(淘汰)的token。然后,它们通过将不重要token的键和值与保留的重要token合并,保留潜在有用的不重要token,确保不丢失有价值的信息。特别地,D2O[105]基于余弦相似度将一个淘汰token的键(或值)与一个保留token合并。与D2O基于余弦相似度类似,AIM[106]和Look - M[107]将多个token的键(分别对应值)合并为一个。CaM[104]基于注意力分数将多个淘汰token的键(或值)与保留token合并,以获得最终的合并结果。此外,KVMerger[108]首先通过聚类具有高余弦相似度的连续token来识别合并token集,确保只有具有强上下文相关性的相邻token被分组在一起。然后,KVMerger使用高斯核权重将每个合并集中的token合并到关键token(基于最高注意力分数选择)中,其中距离较近的token对合并状态的贡献更大。
与将多个token的键值合并为一个不同,CHAI[109]观察到多头注意力中的头通常会为token产生高度相关的注意力分数,特别是在大语言模型的较后层中。为了利用这种冗余,CHAI[109]将每一层中产生相似输出的注意力头聚类,并仅为每个聚类中的一个代表性头计算注意力。具体来说,在每个聚类中,CHAI[109]选择一个代表性头来执行注意力计算,并且计算出的注意力分数在该聚类中的所有头之间共享。
4.3.2 跨层合并
MiniCache[99]观察到中深层的键值缓存表现出较高的角度相似性,使其成为合并的理想选择。为了实现这一点,MiniCache[99]将相邻相似层中每个token的键(和值)对合并为一个共享表示。具体来说,MiniCache[99]将键值向量分解为幅度和方向分量,仅存储共享的方向向量、token幅度和不可合并的token,以最大化内存效率。不同的是,KVSharer[100]观察到一个违反直觉的现象:当两层的键值缓存差异很大时,在推理期间将一层的键值缓存与另一层共享不会导致显著的性能下降。基于这一观察,KVSharer[100]计算所有层对之间键值缓存的欧几里得距离,按差异程度对层对进行排序,并优先选择差异最大的层进行共享。由于KVSharer[100]可以将一层的键值缓存共享给多个其他层,因此存储的键值缓存显著减少。
4.3.3 总结与未来方向
键值缓存合并是一种通过整合或压缩键值缓存来优化大语言模型内存利用的变革性方法,同时保持较高的模型准确性。然而,该领域仍有几个关键方向和挑战需要未来探索。首先,当前的键值缓存合并方法通常设计用于广泛的任务,但针对特定任务或领域微调合并策略可能会进一步提高效率。例如,某些任务由于其注意力模式中固有的冗余,可能容忍更激进的合并,而其他任务可能需要更保守的方法来保持准确性。基于任务难度、序列长度或可用硬件资源实时调整压缩级别的自适应合并机制,是未来工作的一个有吸引力的方向。其次,稀疏注意力机制已经通过对token子集进行操作来降低注意力的计算复杂度,可以与键值缓存合并相结合,以实现更高的效率。探索合并如何补充基于稀疏性的方法,如块稀疏或低秩注意力,可能会导致新颖的混合解决方案。第三,虽然实证结果表明合并不会显著降低性能,但提供关于关键信息保留的理论保证可以增强这些方法的可靠性。未来的工作可能集中在量化合并策略、token重要性和注意力准确性之间的关系,以提供更正式的保证。
4.4 键值缓存量化
量化技术[151,152,153,154,155]已广泛应用于从不同方面加速机器学习模型,如模型参数量化[156,157,158,159]和数据特征量化[160,161]。类似地,键值(KV)缓存量化正成为解决大语言模型内存和计算瓶颈的一种极具前景的解决方案。在自回归解码过程中,大语言模型为序列中所有token的每个注意力层生成键值对。如果我们以全精度将所有键值对存储在内存中,随着序列变长,这个缓存会呈指数增长,显著增加内存和带宽需求。量化通过降低数值表示的精度(例如,从FP32到INT8或INT4),大幅压缩键值缓存的大小。这种压缩可以实现高达4倍或更多的内存节省,使大语言模型能够在内存有限的GPU或边缘设备等资源受限的设备上运行。
然而,键和值中的异常值对低比特量化构成了重大挑战,因为这些极端值在压缩为低比特表示时可能导致性能大幅下降[162,163,164]。根据所使用的技术,现有的键值缓存量化方法可分为三大类:固定精度量化,将所有键和值量化到相同的比特宽度;混合精度量化,为缓存的关键部分分配更高的精度,而为不太重要的组件使用较低的精度;异常值重新分布,重新分布或平滑键和值中的异常值,以提高量化质量。这些方法共同实现了高效的键值缓存压缩,同时减轻了通常与低比特量化相关的性能下降。
图4 三种量化类型。矩阵\(X \in \mathbb{R}^{T × C}\),其中\(T\)是token数量,\(C\)是特征维度
4.4.1 固定精度量化
固定精度量化建议将token的不同键(不同值)量化到相同的比特宽度。ZeroQuant[95]提出对键和值进行逐token量化。如图4所示,逐token量化方法对每个token单独进行量化。特别地,ZeroQuant[95]在推理期间动态计算每个token的最小 - 最大范围。这确保每个token根据其独特范围进行量化,显著降低量化误差。同样,FlexGen[96]和QJL[97]直接对键和值进行逐token量化,其中缩放因子和零点在同一token内的所有元素之间共享。PQCache[98]使用乘积量化方法[161,165]来压缩键值对。然而,统一量化方法,即在所有token上对键和值使用固定的比特宽度,通常可能不是最优的。这是因为它们忽略了token的不同重要性[112],并且没有考虑键和值中的异常值模式[84,148]。
4.4.2 混合精度量化
与固定精度量化不同,在固定精度量化中所有键或值都被量化到相同的比特宽度(例如,4比特或8比特),混合精度量化为关键token和部分的键和值分配更高或全精度,而对不太关键的部分使用较低精度。键值混合精度量化的总结见表5。
表5 现有混合精度量化模型总结
KVQuant[84]基于观察结果提出了几种策略来平滑地量化键和值。首先,KVQuant观察到在应用旋转位置嵌入(RoPE)之前,键值在特定通道中表现出异常值。然而,在应用RoPE之后,这些异常值通道的幅度变得不太一致,这给低精度量化带来了独特的挑战。因此,KVQuant[84]建议在应用RoPE操作之前按通道量化键,按token量化值。
其次,KVQuant[84]观察到键值缓存激活中包含异常值,这些异常值会扭曲量化范围。为了解决这个问题,他们按向量(例如,按通道或按token)隔离异常值,以稀疏格式存储它们,并将其余值量化到更窄的范围。
第三,大语言模型不成比例地将高注意力分数分配给第一个token(即注意力汇聚点),量化第一个token会损害大语言模型的性能。因此,KVQuant[84]以全精度(FP16)保留第一个token,同时量化序列的其余部分,IntactKV[85]和SKVQ[86]也采用了这种方法。
与KVQuant[84]类似,KIVI[87]按通道量化键缓存,因为某些通道表现出较大的异常值,按token量化值缓存,因为值缓存中没有明显的异常值模式。此外,KIVI[87]以全精度保留最新的键和值,同时量化较旧的键值对。这种方法基于以下观察:最新的键值对对于生成后续token至关重要。
与KIVI[87]类似,WKVQuant[88]暂时以全精度保留最新的键和值,同时仅量化过去的键值缓存。这种方法有助于在计算过程中保持精度。此外,WKVQuant[88]引入了一种二维量化策略,优化参数矩阵,使键值缓存中的值进入更平滑、更均匀的范围,显著提高量化质量。GEAR[89]、MiKV[90]、ZipCache[92]和ZIPVL[91]根据每个的重要性对键值缓存进行量化,以实现高效且有效的压缩。
首先,GEAR[89]应用量化将大多数不太重要的条目(例如,98%)压缩到超低精度,显著减少内存使用。接下来,GEAR[89]使用低秩矩阵来近似残差误差,捕捉数据中的结构化模式。此外,GEAR[89]使用稀疏矩阵存储异常值,纠正由这些值引起的个体误差。MiKV[90]是一种混合精度键值缓存量化方法。基于使用现有方法(如H2O[166]和SnapKV[134])测量的每个token的重要性,MiKV[90]将不太重要的键值对存储为低精度,同时将最重要的键值对保留为高精度。
与近似每个token的重要性权重不同,ZipCache[92]准确计算每个token的重要性。与计算重要性分数不同,PrefixQuant[93]观察到token级异常值经常出现在固定位置(例如,初始token)或低语义值token(例如,“.”,“\n”)。基于这一观察,PrefixQuant[93]离线识别大语言模型中高频异常值token,并在键值缓存中为它们添加前缀,有效地消除了token级异常值。类似地,MiniKV[94]观察到重要token可以在生成之前被识别,并且在整个生成过程中保持一致,因此以高精度保留这些重要token。
QAQ[148]提出了一种质量自适应量化方法,根据每个token的重要性和敏感性动态确定合适的量化比特,同时处理异常值和异常情况以保持模型性能。SKVQ[86]引入了带通道重排的裁剪动态量化。
首先,SKVQ[86]使用变换不变排列根据统计特征对相似通道进行分组,并应用裁剪动态量化来减轻异常值问题。其次,SKVQ[86]对初始token和最新token保持高精度,同时量化较旧的token。因此,SKVQ[86]有效地减少了量化误差,提高了量化模型的准确性。
CacheGen[149]和AsymKV[167]使用层间非对称量化,为敏感的早期层的键矩阵分配更高比特精度,为不太敏感的层分配较低比特精度,平衡内存效率和性能。特别地,CacheGen[149]还利用token级局部性,通过编码相邻token的键值张量之间的差异(增量)而不是原始值。Atom[150]识别并分离异常值通道,重新排列矩阵,将这些异常值通道分组在末尾,从而确保规则的内存访问模式以提高硬件利用率。然后,Atom[150]以更高精度量化异常值,而普通通道量化为INT4以实现最大效率。特别地,Atom[150]应用细粒度组量化,将矩阵划分为较小的子组(例如,每组128个元素),并在每个子组内独立进行量化。
4.4.3 异常值重新分布
如前所述,键和值中的异常值给它们的量化带来了重大挑战。最近的研究提出了两种主要方法来解决这个问题:将异常值重新分布到新添加的虚拟token中,或者应用等效变换函数来平滑键和值,以提高量化精度。现有异常值重新分布模型的总结见表6。
表6 4.4.3节中异常值重新分布模型总结
具体来说,MassiveActivation[72]强调了大语言模型(LLMs)中大规模激活的现象,即一小部分激活比其余部分大得多。为了解决这个问题,MassiveActivation[72]建议在输入中添加一个虚拟token,使大语言模型能够将大规模异常值封装在每个头的这些学习到的键值对中。
接下来,我们介绍基于等效变换函数的方法。首先,QuaRot[73]、Qserve[74]和Q - INT4[75]通过Hadamard旋转将异常值重新分布到所有通道,成功降低了异常值token的最大值。激活的Hadamard旋转可以合并到前面的线性层中,从而将键值的异常值重新分布到参数中。尽管有这种改进,但异常值token的幅度仍然比正常token大数百倍,在跨token使用共享量化尺度时会导致显著的性能问题[93]。在这个想法的基础上,SpinQuant[76]提出训练一个正交矩阵,而不是依赖随机的Hadamard矩阵来实现更好的性能。类似地,DuQuant[77]采用通道置换将异常值均匀分布到块中,并利用块旋转进一步平滑异常值。
SmoothQuant[78]利用了一个关键观察结果,即不同token在其通道上显示出相似的变化模式。基于这一见解,它通过离线过程将量化复杂度从激活转移到权重。具体来说,SmoothQuant[78]引入了一种数学上等效的逐通道缩放变换:\(Y=(X diag(s)^{-1}) \cdot(diag(s) W)=\hat{X} \hat{W}\),其中\(X\)代表键或值,平滑因子\(s \in \mathbb{R}^{C_{i}}\)用于缩放\(X\) 。这种变换实现了两个关键好处:它平滑了键值的分布,便于更容易地进行量化,并且允许在离线处理时将平滑因子有效地合并到前一层的参数中。特别地,平滑因子\(s\)是根据输入动态决定的。类似地,OS + [79]引入了通道方向的移位来消除异常值的不对称性,并进行通道方向的缩放来减少异常值的集中程度。这些操作无缝地迁移到后续层,在保持与浮点模型等效的同时提高了量化性能。
与使用手工制作的变换[77,78,79]将量化难度从激活转移到权重不同,AffineQuant[80]使用一个结合了缩放和旋转变换的仿射变换矩阵。这使其能够更有效地优化权重分布,使其更好地与量化函数对齐,并减少量化误差。仿射变换矩阵比SmoothQuant基于标量的缩放提供了更丰富的灵活性,能够对权重和激活分布进行更精细的调整。基于AffineQuant[80],FlatQuant[81]引入了一种快速且可学习的仿射变换,以增强权重和激活的平坦性,它将变换分解为较小的矩阵以减少内存和计算成本。同样,AWQ[82]和OmniQuant[83]提出了可微且可学习的等效变换,它们使用梯度下降以端到端的方式优化等效参数(例如,通道方向的缩放和移位)。
4.4.4 总结与未来方向
键值缓存量化是一种在大语言模型(LLMs)自回归解码过程中减少内存和计算开销的关键技术。虽然已经取得了显著进展,但该领域仍然充满活力且发展迅速,有几个有前途的未来研究方向。首先,一个有前途的途径是开发实时自适应量化方法。这些技术可以在推理过程中根据实时指标(如token重要性、异常值的存在或序列长度)动态调整量化级别。这种方法可以在保持性能的同时显著提高效率,特别是对于处理具有不同复杂程度的长序列。其次,另一个重要方向是将键值缓存量化扩展到多模态和多任务模型。多模态模型处理来自文本、视觉和音频等不同领域的输入,多任务场景通常表现出高度多样化的注意力模式和内存需求。这就需要设计更先进和定制的量化策略,以在这些日益复杂的环境中平衡效率和准确性。
第三,混合量化技术也具有巨大的潜力。通过结合固定精度、混合精度和异常值重新分布方法,研究人员可以开发出更通用和高效的量化框架。例如,将混合精度分配方案与异常值平滑变换相结合,可以优化内存使用和性能,提供一种适用于各种任务和模型的灵活方法。最后,解决异常值的挑战仍然是一个关键的关注领域。异常值可能对量化效率和模型性能产生不成比例的影响。未来的研究可以探索先进的异常值检测机制或创新的编码技术来减轻其影响。更好地处理异常值可以进一步提高量化方法的有效性,实现更强大和内存高效的实现。
4.5 键值缓存低秩分解
现有研究表明,键值缓存中的大部分信息可以由其一小部分奇异值或低秩分量捕获,这使得低秩分解成为一种强大的压缩工具。利用这一特性,键值缓存低秩分解技术旨在在保留准确注意力计算所需基本信息的同时,减少内存需求。低秩分解策略可以分为三种主要方法:奇异值分解(SVD),利用键值矩阵的低秩结构保留最关键的奇异值;张量分解,将键值矩阵分解为较小的组件以最小化冗余;以及学习低秩近似,结合自适应机制根据学习到的表示优化压缩。每种方法在计算效率和准确性保留之间提供了独特的平衡,实现了可扩展且内存高效的大语言模型推理。
4.5.1 奇异值分解
首先,ECKVH[66]、EigenAttention[67]和ZDC[68]表明键值缓存具有低秩特性,少量的顶部奇异值保留了大部分信息。使用奇异值分解(SVD),该方法通过分组头、应用SVD并保留顶部奇异值来压缩键值缓存,有效地减少了键值头的数量,同时误差最小。此外,ZDC[68]使用自适应混合压缩比机制,为较浅层中不重要的token分配更高的压缩率,同时在较深层中保留更重要的token,利用了相邻层中token特征的相似性。其次,LoRC[69]不是分解键值对,而是采用键值权重矩阵的低秩近似,并采用渐进式压缩策略,在不需要模型重新训练的情况下有效地压缩键值缓存。具体来说,LoRC[69]使用SVD对键和值参数矩阵(即\(W_{i}^{k}\)和\(w_{i}^{v}\))进行压缩,如\(W_{i}^{k}=U_{i}^{k} \sum _{i}^{k} P_{i}^{k^{\top}}\)和\(W_{i}^{v}=U_{i}^{v} \sum _{i}^{v} P_{i}^{v \top}\) 。此外,在较浅层中保守地应用压缩以最小化误差放大,在较深层中更积极地应用压缩。然后,它不是存储\(K^{i}=X_{i} W_{i}^{k}\)和\(V^{i}=X_{i} W_{i}^{v}\) ,而是仅存储\(\hat{K}^{i}=X_{i} \overline{U}_{i}^{k}\)和\(\hat{V}^{i}=X_{i} U_{i}^{v}\) ,以及\(\sum _{i}^{k} P_{i}^{k}\)和\(\sum _{i}^{v} P_{i}^{v \top}\) 。此外,ShadowKV[70]直接对应用RoPE之前的键进行SVD分解,以降低键表示的维度。Palu[71]应用SVD来压缩键和值。
4.5.2 张量分解
张量分解[168,169,170]是一种广泛使用的算法,用于将矩阵分解为一系列局部张量的乘积,如矩阵乘积算子(MPO)[171]和Turker分解[172]。以矩阵乘积算子(MPO)[171]为例,使用MPO对矩阵\(W \in \mathbb{R}^{I × J}\)进行分解可以定义为:
\(TD(W)=\prod_{k = 1}^{n} \mathcal{T}_{(k)}[d_{k - 1}, i_{k}, j_{k}, d_{k}] \quad(12)\)
其中\(\mathcal{T}_{(k)}\)表示大小为\(d_{k - 1} × i_{k} × j_{k} × d_{k}\)的局部张量,\(\prod_{k = 1}^{n} i_{k}=I\)且\(\prod_{k = 1}^{n} j_{k}=J\) 。这里,\(n\)表示局部张量的数量,统称为分解后的张量。如公式(12)所示,基于MPO的张量分解非常适合键值缓存压缩,因为它通过将大的键值矩阵分解为较小的局部张量来减少内存占用,在保留基本信息的同时实现高效存储。这种方法最小化了冗余,并保持了准确注意力计算所需的结构完整性。DecoQuant[65]将量化与低秩分解相结合,有效地减少了量化误差。具体来说,DecoQuant[65]利用矩阵乘积算子(MPO)将矩阵分解为较小的局部张量。包含大部分参数的较大张量被量化为低比特精度,而较小的张量保留高精度以最小化整体量化误差。
4.5.3 学习低秩近似
LESS[63]引入了一种新颖的基于学习核的低秩近似方法,以有效地近似softmax函数的结果。具体来说,LESS[63]用一个可分离的相似性度量\(\phi(q_{t}) \psi(K_{t})^{\top}\)代替softmax,其中\(\phi\)和\(\psi\)是按行的函数。这里,\(q_{t} \in \mathbb{R}^{1 × D}\)表示查询,\(K_{t} \in \mathbb{R}^{t × D}\)表示步骤\(t\)的键。详细来说,如果\(\phi\)和\(\psi\)满足:\(a_{t}=softmax(\frac{q_{t} K_{t}^{\top}}{\sqrt{D}}) V_{t} ≈\frac{\phi(q_{t}) \psi(K_{t})^{\top} V_{t}}{\phi(q_{t}) \psi(K_{t})^{\top} 1_{S × 1}}\) ,那么我们在推理时只需要缓存隐藏状态\(H_{t}=\psi(K_{t})^{\top} V_{t} \in \mathbb{R}^{R × D}\)和归一化因子\(z_{t}=\sum_{s = 1}^{t} \psi([K_{t}]_{s}) \in \mathbb{R}^{1 × R}\) 。类似地,MatryoshkaKV[64]通过利用可训练的正交投影矩阵,沿特征维度压缩键值缓存。
4.5.4 总结与未来方向
键值缓存低秩分解是一种在保持注意力计算质量的同时压缩大语言模型中键值缓存的强大技术。当前的方法主要依赖于对所有层或token统一应用的固定低秩近似。然而,未来的进展可以集中在动态秩调整上,即根据token重要性、序列长度或层特定属性调整秩,从而在内存效率和性能之间实现更优的平衡。此外,实时或流式应用为探索提供了有前景的途径。由于键值缓存在推理过程中动态增长,轻量级和增量式分解方法对于支持此类场景至关重要,同时不会影响延迟或准确性。
5 模型级优化
在模型级优化中,为Transformer设计新的架构或机制,以实现对键值缓存更高效的重用。通常,这些方法需要对模型进行重新训练或微调才能生效。然而,也提出了高效的转换管道,以便快速部署到新架构中。根据对模型进行改进的位置和方式,我们将相关工作分为层内或跨层的分组和共享机制(5.1节)、实现架构修改或增强(5.2节),以及结合非Transformer架构进行优化(5.3节)。模型级优化的分类法如图5所示。
图5 大语言模型基于模型的键值优化分类法
5.1 注意力分组和共享
本节探讨注意力分组和共享方法,这些方法是优化键值(KV)管理的有效策略。我们将这些方法分为两个不同的子类型:层内分组(5.1.1节),专注于在单个层内对查询、键和值头进行分组,以减少冗余并提高效率;跨层共享(5.1.2节),跨层共享键、值或注意力组件,以提高信息重用并减少键值缓存需求。注意力分组和共享的总结见表7。
表7 基于模型的注意力分组和共享方法总结
5.1.1 层内分组
Shazeer首先引入了多查询注意力(MQA)[195],它修改了传统的多头注意力机制。在MQA中,Transformer块中的所有注意力头共享单个键和值。这个简单的策略可以极大地加速解码过程。作者的实验表明,MQA在仅引起轻微质量下降的情况下可以获得更高的效率。
MQA是一种激进的策略,它不仅会导致质量下降,还会导致训练不稳定。分组查询注意力(GQA)[196]引入了一种折中的解决方案,将查询头划分为多个组,每个组共享自己的键和值。此外,还提出了一种向上训练过程,通过对与每个组相关联的键和值头进行平均池化,有效地将现有的MHA模型转换为GQA配置。实证评估表明,GQA模型在性能上接近原始的MHA模型,同时提供与MQA相当的推理时间。
基于GQA有几个扩展。AsymGQA[197]通过提出一种激活感知合并策略扩展了GQA。与通过均匀聚类对头部进行分组不同,AsymGQA在训练期间根据激活相似性动态确定查询的分组,并构建非对称的分组结果,从而实现更好的优化和泛化。Weighted GQA[198]为每个键和值头引入了额外的可训练权重,这些权重可以无缝集成到现有的GQA模型中。通过在训练期间调整权重,它在不增加推理开销的情况下提高了模型性能。QCQA[199]利用进化算法为GQA确定最优的查询头分组,该算法由一个计算效率高的适应度函数引导,该函数利用权重共享误差和键值缓存来评估文本生成质量和内存容量。KDGQA[200]认为许多GQA的变体采用固定的分组策略,因此在训练过程中缺乏对键值交互演变的动态适应性。他们的动态键驱动GQA通过在训练期间根据键头规范自适应地分配组来解决这些问题,从而为查询头分组提供了一种灵活的策略,并提高了性能。
GQKVA[201]推进了分组策略,提出了一种广义的查询、键和值分组机制。它首先引入了MKVA和GKVA,其中键和值被分组以共享相同的查询。在此基础上,提出了GQKVA,分别对查询和键值对进行分组。通常,查询被划分为\(g_{q}\)个组,键和值被划分为\(g_{kv}\)个组,每个查询和键值对的组合将使用点积注意力进行交互。这导致了\(g_{q} × g_{kv}\)个不同的输出。它对查询、键和值采用了不同的分组策略,并保持了与MHA相当的计算效率和性能。
5.1.2 跨层共享
Brandon等人引入了跨层注意力(CLA)[186],它扩展了GQA和MQA的思想,通过在相邻层之间共享键和值头,进一步减少了键值缓存中的冗余。与MQA相比,这实现了额外2倍的键值缓存大小缩减,显著提高了内存效率,同时不改变计算复杂度。
LCKV[187]提出仅为一小部分层(甚至仅顶层)计算和缓存键和值,然后让底层的查询与保存的键和值配对进行推理。这种方法不仅极大地提高了推理速度并减少了内存消耗,而且与现有的内存节省技术正交,便于直接集成以进行进一步优化。虽然这种机制使下一个token的计算依赖于前一个token的顶层键和值,这与Transformer的并行训练相矛盾,但LCKV引入了一种近似训练方法来支持并行训练。
共享注意力(SA)[188]提出跨多个层重用计算得到的注意力权重,而不是为每一层重新计算。与其他专注于共享键值缓存的方法不同,SA利用在预训练大语言模型中观察到的注意力分布的各向同性趋势,直接共享注意力权重,大大减少了计算开销和内存使用。
多层键值(MLKV)[189]引入了一种简单的跨多个Transformer层的键值头共享机制。MLKV在层内使用与MQA相同的单个键值头,但它也在多个层之间共享这个键值头。这种极端策略将缓存大小减少到几乎是正常GQA策略的1%,实验表明MLKV仍然具有可比的性能。
轻量级注意力替代(LISA)[190]对跨层注意力模式的相似性进行了全面分析。直接跨层共享注意力权重是无效的,因为注意力头的错位和浅层的敏感性。LISA[190]通过引入微小的前馈网络来对齐层间的注意力头,并使用低秩矩阵来近似层间注意力权重的变化,解决了这些挑战。这实现了查询和键参数的6倍压缩,同时保持了较高的准确性和困惑度。
Wu等人[191]引入了一个统一的框架,系统地分析和优化跨层键值缓存共享机制。他们整合了几种现有方法,在一个统一的结构中探索新颖的变体,并对这些方法进行了全面评估。研究发现,将键值缓存大小减少2倍可以在不显著损失准确性的情况下提高吞吐量,而进一步的减少则需要采用替代设计并增加训练成本。根据分析结果,他们为根据特定需求或约束选择合适的键值共享方法提供了见解。
跨层潜在注意力(CLLA)[192]引入了一个集成框架的有效性。这些解决方案的多样性反映了键值缓存管理的复杂性,以及在优化大语言模型推理系统方面持续创新的丰富机会空间。表10对各种用于键值缓存的内存管理技术进行了比较,突出了诸如分页内存、虚拟内存、动态稀疏性、前缀共享和分布式内存等关键特性。
表10 用于键值缓存优化的内存管理技术比较
6.1.3 总结与未来方向
对大语言模型推理中键值缓存的内存管理策略的探索揭示了一个充满前景的创新局面,这些创新提高了内存效率和整体系统性能。像vLLM[144]和LeanKV[112]中出现的架构进步,通过结合分页和虚拟内存概念进行动态分配,将传统内存管理原则应用于现代人工智能应用。ChunkAttention[238]和MemServe[239]等前缀感知设计优化了数据组织,实现了公共前缀的检测和共享,减少了冗余并加快了推理速度。
未来的工作应通过多个协同方向推进内存管理创新:研究自适应内存层次结构,使其能够根据工作负载模式和资源约束动态调整;探索新颖的压缩技术,在减少内存占用的同时保持快速访问;开发智能预取机制,预测并预加载频繁访问的缓存条目;研究硬件感知优化策略,利用计算存储和内存处理单元等新兴内存技术;设计分布式缓存一致性协议,在多个推理节点之间有效地保持一致性。此外,对基于机器学习的方法的探索可以实现预测性内存分配,从历史访问模式中学习,而对专用数据结构的研究可能会产生更高效的前缀检测和共享机制。这些进展,结合对异构内存系统的研究,根据访问模式和性能要求智能协调不同类型的内存,将显著提高大语言模型推理系统在各种部署场景中的可扩展性和效率。
6.2 调度
基于这些面向调度的工作,我们可以将键值缓存调度优化分为三种主要方法:1)前缀感知调度策略,以BatchLLM[236]和RadixAttention[237]为代表;2)抢占式和公平导向的调度,以FastServe[220]和FastSwitch[225]为示例;3)特定层和分层调度方法,由LayerKV[232]、CachedAttention[233]和ALISA[234]展示。这些方法共同解决了调度优化的不同方面,从内存效率到公平性和延迟减少,而像LAMPS[235]这样的专用解决方案将这些概念扩展到特定用例,如API增强的大语言模型请求,展示了键值缓存调度优化中丰富的设计空间。
6.2.1 前缀感知调度
与传统的基于最近最少使用(LRU)的缓存管理系统不同,在传统系统中共享的键值上下文可能会被过早淘汰或在内存中不必要地扩展,BatchLLM[236]实现了显式的全局前缀识别,并对共享相同键值缓存内容的请求进行协调调度。它以共享前缀的组为粒度调度请求,确保最佳的键值缓存重用,同时最小化缓存生命周期——具有相同前缀的请求被有意地一起调度,以最大化键值缓存共享效率。这种调度方法由一个动态规划算法补充,该算法优化一级前缀模式,实现更高效的键值缓存管理并减少调度开销。
RadixAttention[237]围绕基数树结构构建,用一种智能的缓存感知方法取代传统的先来先服务(FCFS)调度,该方法根据匹配的前缀长度对请求进行优先级排序。它实现了动态内存管理,其中缓存的token和正在运行的请求共享相同的内存池,由一个LRU淘汰策略控制,该策略在保留有价值的祖先前缀的同时,战略性地删除叶节点。这由一个引用计数机制补充,该机制防止在连续批处理期间主动使用的缓存条目被淘汰,同时在节点不再使用时实现高效的内存回收。
表11 用于键值缓存优化的调度方法比较
6.2.2 抢占式和公平导向的调度
FastServe[220]实现了一种主动的键值缓存管理策略,协调GPU和主机内存之间的缓存移动,将数据传输与计算重叠,以最小化延迟影响。这与一个跳过连接的多级反馈队列调度器集成,该调度器根据输入长度信息做出键值缓存调度决策,允许作业直接进入适当的优先级队列,同时避免通过更高优先级队列进行不必要的降级。通过将token级抢占与复杂的键值缓存管理和智能队列放置相结合,FastServe[220]比像vLLM[144]这样的传统运行完成系统实现了显著的性能改进。
FastSwitch[225]引入了一种公平导向的键值缓存调度系统,解决了大语言模型服务中抢占式调度的开销挑战。它有三个关键机制:通过智能缓存移动调度提高I/O利用率、最小化上下文切换期间的GPU空闲时间,以及消除多轮对话中的冗余I/O操作。与传统的基于块的键值缓存内存策略不同,后者以碎片化和粒度限制为代价优先考虑内存效率,FastSwitch[225]实现了一种平衡的方法,在促进更平滑的上下文切换的同时保持高效的内存使用。这种集成的调度方法实现了动态优先级调整以确保公平性,同时最小化上下文切换对性能的影响。
6.2.3 特定层和分层调度
LayerKV[232]引入了一种新颖的按层键值缓存调度方法,以解决大上下文大语言模型服务中日益增长的首次token时间(TTFT)延迟挑战。其贡献在于其细粒度的、特定层的键值缓存块分配和管理策略,这与传统的整体式缓存管理方法不同。通过实现按层键值块调度和卸载机制,LayerKV[232]实现了更高效的内存利用,并减少了大上下文窗口竞争有限的GPU键值缓存块时通常出现的排队延迟。它由一个服务级别目标(SLO)感知调度器补充,该调度器根据服务级别目标优化缓存分配决策,允许在模型层之间动态管理内存资源。
CachedAttention[233]引入了一种分层调度方法,由三层策略组成:层间预加载使用调度器感知的获取和淘汰策略协调键值缓存跨存储层次结构的移动;异步保存将I/O操作与GPU计算重叠;智能缓存放置决策根据调度器提示做出,以确保频繁访问的键值缓存驻留在更快的内存层中。它还提出了一种新颖的位置编码解耦机制,通过有效的截断策略防止上下文窗口溢出时键值缓存无效。
ALISA[234]引入了一种双级键值缓存调度框架,将算法稀疏性与系统级优化相结合。在算法级别,稀疏窗口注意力机制识别并优先考虑用于注意力计算的最重要token,创建全局动态和局部静态稀疏模式的混合,显著减少键值缓存内存需求。在系统级别,其三相token级动态调度器管理键值张量分配,并优化缓存和重新计算之间的权衡。调度器根据token的重要性和系统资源约束,动态决定哪些token在GPU内存中缓存,哪些重新计算。
LAMPS[235]实现了一种预测调度机制,在API调用期间估计预API输出和最佳内存处理策略,根据预测的内存浪费在保留、丢弃或交换键值缓存内容之间进行选择。
6.2.4 总结与未来方向
表11根据对前缀感知、抢占式调度、公平性、特定层优化、分层结构和动态适应性的支持,对用于键值缓存优化的调度方法进行了比较。大语言模型推理中键值缓存管理的调度策略的进展突出了一种多方面的方法来优化性能、内存效率和公平性。通过将这些策略分类为前缀感知、抢占式和公平导向以及特定层调度,我们看到了各种方法在解决不同挑战方面的多样性。例如,像BatchLLM[236]和RadixAttention[237]这样的前缀感知策略通过基于共享前缀智能分组请求,增强了缓存重用,最小化了缓存生命周期并减少了开销。同时,像FastServe[220]和FastSwitch[225]这样的抢占式方法实施主动管理技术,优化缓存移动和调度,显著提高了延迟并确保了上下文切换期间的公平性。像LayerKV[232]、CachedAttention[233]和ALISA[234]这样的特定层调度方法通过实施针对不同模型层独特需求的细粒度管理策略,进一步优化了缓存分配。
未来的工作应通过几个相互关联的维度推进这些键值缓存调度创新:开发自适应混合系统,根据实时工作负载特征动态选择最优调度策略;探索预测模型,预测用户请求模式以主动优化缓存分配;研究自动参数调整机制,在不同的部署场景中调整调度策略;设计上下文感知架构,智能地平衡前缀共享与公平性要求;研究新颖的缓存一致性协议,有效地处理分布式推理场景。此外,强化学习方法的集成可以实现自优化调度器,从历史使用模式中学习,而硬件 - 软件协同设计的探索可以产生专门的加速器,直接支持高效的键值缓存管理操作。这些进展将共同提高大语言模型推理系统在各种操作条件和部署规模下的鲁棒性、效率和适应性。最后,考虑到大语言模型服务[240],针对多个用户和查询的不同调度和共享可能会导致潜在的隐私泄露。因此,在多用户场景中用于大语言模型服务的隐私保护技术,如差分隐私[241,242,243],值得进一步研究。
6.3 硬件感知设计
最近针对键值缓存管理的硬件感知优化涵盖了基于不同硬件架构和约束的几个关键方向。单GPU/多GPU设计专注于优化内存访问模式、用于高效注意力计算的GPU内核设计以及具有负载平衡的并行处理。基于I/O的设计通过异步I/O和智能预取机制优化跨内存层次结构的数据移动。异构设计协调跨CPU - GPU层级的计算和内存分配。基于固态硬盘(SSD)的解决方案已经从基本的卸载方法发展到更复杂的设计,InstInfer利用计算存储驱动器(CSDs)在存储层执行注意力计算,有效地绕过了PCIe带宽限制。这些方法展示了硬件感知设计如何通过仔细考虑和利用不同硬件组件及其互连的特性,显著提高大语言模型推理效率。
6.3.1 单GPU/多GPU设计
基于这些专注于面向GPU设计的工作,我们可以将方法分为几个用于键值缓存优化的关键策略。首先,像HydraGen[226]和DeFT[227]这样的共享前缀优化方法,通过批处理前缀计算和树状注意力模式专注于高效的GPU内存利用。HydraGen[226]不是为每个具有相同前缀的序列维护单独的键值缓存,而是通过分解注意力计算,为多个请求中的公共前缀利用单个共享键值缓存。它通过两种机制实现高效的GPU内存利用:跨序列的批处理前缀键值缓存访问和对唯一后缀键值缓存的单独处理。对于DeFT[227],其核心贡献有两个方面:KV引导分组,通过智能管理共享前缀键值缓存来优化GPU内存访问模式,最小化冗余的全局到共享内存传输;扁平树键值拆分,确保在GPU计算单元之间平衡工作负载分布,同时最小化计算冗余。
其次,以vLLM[144]和ORCA[228]为代表的分布式处理框架,通过复杂的内存管理和同步机制优化多GPU场景。vLLM[144]还实现了一个键值缓存管理器,在模型并行部署中协调跨分布式GPU工作节点的内存分配,其中每个GPU处理一部分注意力头,同时共享相同的逻辑到物理块映射。这种面向GPU的设计通过近乎零的碎片化和灵活的键值缓存共享实现了高效的内存利用,同时支持Megatron - LM风格的张量并行,其中GPU以单程序多数据(SPMD)方式执行同步的块矩阵操作。调度器将包含输入token和块表的控制消息广播到GPU工作节点,使它们能够独立处理分配的注意力头,同时通过全规约操作保持内存一致性,有效地消除了冗余的内存管理同步开销,并最大化了跨分布式资源的GPU利用率。
ORCA[228]使用层内和层间并行将模型层分布在多个GPU上,每个工作进程管理多个控制GPU的线程,并通过一个注意力键值管理器协调键值缓存访问。ORCA的面向GPU的设计通过将控制消息通信与张量数据传输(通过NCCL)分离,最小化了CPU - GPU同步开销,允许每个GPU线程使用请求ID和token索引高效访问键值缓存内存。
第三,像DistServe[229]这样的阶段感知设计将预填充和解码阶段分离到不同的GPU资源上,以优化它们不同的内存访问模式。新颖的批处理策略以Multi - Bin Batching[230]为代表,它专注于基于长度的请求分组以提高GPU利用率,而先进的并行计算框架如Tree Attention[231]引入了复杂的归约算法,用于在多个GPU上高效计算注意力。DistServe[229]认识到预填充和解码阶段具有不同的键值缓存利用特征和内存访问模式:预填充需要密集计算,随着处理输入token,键值缓存大小不断增长,而解码阶段保持固定的键值缓存大小以生成输出token。通过将这些阶段物理分离到不同的GPU上,DistServe实现了针对每个阶段优化的GPU内存管理和键值缓存访问模式,消除了预填充的突发内存访问模式与解码的稳态键值缓存利用之间的干扰。Multi - Bin Batching[230]引入的基于长度的批处理策略有助于最小化GPU空闲时间和内存碎片化,这通常在同一批处理中处理不同长度的请求时发生,因为它确保为每个批处理分配的键值缓存内存更均匀地用于所有请求。Tree Attention[231]实现了一种基于树的归约算法,从根本上改变了在多个GPU上计算和聚合注意力值的方式,通过部分归约实现了对键值缓存数据的更高效处理,显著减少了内存带宽需求和峰值内存使用。
这些方法共同展示了硬件感知设计如何通过仔细考虑GPU架构特征和内存层次结构约束,显著提高大语言模型的效率。
6.3.2 基于I/O的设计
最近针对键值缓存管理的以I/O为重点的优化涵盖了几个关键维度,针对内存层次结构的不同级别。在GPU级别,像FlashAttention[145]和Bifurcated Attention[222]这样的方法通过复杂的分块策略和拆分注意力计算,优化了高带宽内存(HBM)和静态随机存取存储器(SRAM)之间的数据移动,而像PartKVRec[221]这样的系统解决了CPU - GPU数据移动优化问题,通过混合重新计算和传输策略解决PCIe带宽瓶颈,HCache[223]则优化了中间激活存储和恢复。
FlashAttention[145]采用分块策略,仔细管理键值缓存访问模式,通过将频繁访问的键值缓存部分保留在快速SRAM中,同时系统地获取和淘汰数据块以最小化HBM访问,减少了冗余内存操作。Bifurcated Attention[222]提出了一种面向I/O的方法,在共享上下文批处理解码期间通过战略性地将注意力计算拆分为两个不同的通用矩阵乘法(GEMM)操作来优化键值缓存访问模式。它专门针对具有长上下文的高批处理场景中的内存带宽瓶颈,在保持相同计算浮点运算次数(FLOPs)的同时,大幅减少内存I/O操作。对于PartKVRec[221],其关键创新在于其在GPU上进行部分键值缓存重新计算的混合策略,同时从CPU内存传输剩余的缓存数据,有效地隐藏了PCIe传输延迟。其实现采用了一个复杂的面向I/O的调度系统,分析输入特征和硬件能力,以确定重新计算和数据传输之间的最佳平衡,动态管理键值缓存移动,以最大化PCIe带宽利用率,同时最小化GPU空闲时间。HCache[223]战略性地存储和恢复中间激活,而不是完整的键值缓存状态,实现了一个无气泡恢复调度器,仔细平衡计算和I/O操作以最大化带宽利用率。一个关键创新是其基于块的存储管理器,解决了保存(层先于token)和恢复(token先于层)操作之间的I/O模式不匹配问题,优化了数据布局和访问模式以减少I/O开销。Cake[224]解决了从磁盘加载缓存的键值状态到GPU内存的基本I/O瓶颈问题。它引入了一种双向并行化策略,同时利用计算和I/O资源。这种混合方法动态平衡从存储加载缓存的键值状态和在GPU上计算它们,自动适应不同的系统条件,无需手动参数调整。
上下文管理优化以FastSwitch[225]为代表,它通过细粒度的内存管理策略为多用户场景实现了高效的上下文切换机制。FastSwitch[225]通过实施更细粒度和连续的内存管理策略,解决了传统基于块的键值缓存方法中的I/O低效问题,最小化了抢占和上下文切换期间的I/O开销。
这些方法展示了仔细考虑I/O模式和内存层次结构特征如何通过最小化数据移动和最大化不同存储层之间的带宽利用率,显著提高大语言模型推理效率。
6.3.3 异构设计
最近针对键值缓存的异构计算方法展示了多种优化CPU - GPU协作的策略。像NEO[216]和FastDecode[217]这样的系统通过将注意力计算卸载到CPU来实现战略性的工作负载分配,而FlexInfer[218]引入了虚拟内存抽象以实现最佳资源协调。
NEO[216]通过将注意力计算和键值缓存状态战略性地卸载到CPU,推进了大语言模型推理的异构计算。通过非对称GPU - CPU流水线和负载感知调度,它在两个计算平台之间实现了最佳的工作负载平衡,允许在不增加延迟的情况下使用更大的GPU批处理大小。对于FastDecode[217],其关键贡献在于将内存密集型的键值缓存操作战略性地卸载到分布式CPU资源上,利用多个CPU节点的总内存容量和计算能力,而不是将CPU仅仅视为存储设备。通过利用CPU进行键值缓存计算和存储,同时将计算密集型操作保留在GPU上,它创建了一个高效的流水线,最大化了异构基础设施上的资源利用率,允许更大的批处理大小和更高的吞吐量。FlexInfer[218]通过引入基于虚拟内存的抽象vTensor,协调大语言模型推理中的CPU - GPU资源利用。
先进的缓存和预取机制以InfiniGen[139]和Pensieve[219]为代表,InfiniGen[139]对键值缓存条目采用推测性预取,Pensieve[219]为对话状态实施多层缓存。对于InfiniGen[139],其关键创新在于其跨异构架构的预测机制,使用注意力输入的部分计算和修改后的查询 - 键权重来识别并仅从CPU内存预取最相关的键值缓存条目到GPU。Pensieve[219]引入了一种专门为多轮对话大语言模型服务设计的异构计算架构,通过在GPU和CPU资源上实施复杂的多层缓存策略。这种有状态的方法在异构内存层次结构中管理键值缓存数据,在多个硬件层中维护对话历史状态,而不是为每次交互重新计算它们。
复杂的调度和抢占策略由FastServe[220]和PartKVRec[221]展示,FastServe[220]专注于token级抢占和主动内存管理,PartKVRec[221]通过动态调度平衡数据传输和重新计算。对于FastServe[220],其token级抢占能力由一个复杂的异构内存管理系统支持,该系统主动协调GPU和主机内存之间的键值缓存数据移动。它实施了一个跳过连接的多级反馈队列调度器,管理跨CPU - GPU边界的计算资源,优化计算调度和数据移动。PartKVRec[221]采用一个调度器,动态优化跨异构硬件平台的任务分配,使用分析器分析硬件能力和工作负载特征。
这些方法共同展示了如何有效地利用异构架构来克服单设备的限制,同时保持高效的资源利用,并最小化CPU和GPU资源之间的通信开销。
6.3.4 固态硬盘(SSD)基于的设计
最近基于SSD的键值缓存管理方法展示了存储利用策略的演进,从传统的内存层次结构扩展到计算存储创新。FlexGen[96]引入了一种基于SSD的键值缓存管理方法,将内存层次结构扩展到GPU、CPU内存和磁盘存储,通过线性规划确定的智能张量存储和访问模式优化,在资源受限的硬件上实现高吞吐量的大语言模型推理。该系统的关键创新包括在所有三个存储层上协调数据放置、优化访问模式以最小化SSD延迟影响、对模型权重和注意力缓存进行激进的4位压缩,以及将SSD存储有效地用作键值缓存管理的内存层次结构扩展。InstInfer[215]引入了一种更具革命性的方法,利用计算存储驱动器(CSDs)在存储层直接执行注意力计算,将SSD从被动存储设备转变为主动计算单元,并利用闪存通道的高内部带宽绕过传统的PCIe带宽限制。
这些方法展示了存储设备如何有效地集成到大语言模型推理系统中,无论是作为内存层次结构的扩展还是作为计算资源,以在资源受限的环境中实现大型模型和长序列的高效处理。表12比较了基于键值缓存优化的硬件感知设计方法的四个关键特征:单GPU/多GPU支持、I/O感知、异构计算和基于SSD的设计。
表12 用于键值缓存优化的硬件感知设计方法比较
6.3.5 总结与未来方向
最近在键值缓存管理的硬件感知设计方面的进展强调了根据特定硬件架构和约束优化性能,这在大语言模型推理效率上有显著提升。像HydraGen[226]和vLLM[144]在单GPU和多GPU设计中专注于高效的内存访问模式和负载平衡,而基于I/O的策略(如FlashAttention[145]和PartKVRec[221])通过智能预取和调度机制解决数据移动瓶颈。此外,以NEO[216]和FastDecode[217]为代表的异构设计有效地利用了CPU - GPU协作来最大化资源利用率。
未来的工作应通过多个相互关联的方向推进这项研究:探索结合专用硬件加速器和优化内存层次结构的新颖架构设计;研究利用计算存储驱动器和内存处理能力的混合系统;开发基于工作负载模式动态优化资源分配的自适应算法;研究在保持模型保真度的同时减少内存需求的先进压缩技术;设计智能调度机制,有效地协调包括CPU、GPU和定制加速器在内的异构计算资源。这些改进共同作用,将提高大语言模型推理系统在从边缘设备到数据中心的各种部署场景中的性能和可扩展性,同时保持对新兴硬件创新和不同计算需求的适应性。
7 文本和多模态数据集
在本节中,我们介绍用于评估大语言模型效率的文本和多模态数据集。
7.1 文本数据集
我们从最先进的基准框架和各种论文中收集了许多长上下文数据集,包括L - Eval[244]、M4LE[245]、BAMBOO[246]、LongBench[247]、LRA[248]、SCROLLS[249]、ZEROSCROLLS[250]、LooGLE[251]、LongEval[252]和StreamingEval[136]。具体来说,我们将这些数据集分类为不同的任务,包括问答、文本摘要、文本推理、文本检索和文本生成。
7.1.1 问答(QA)任务
此任务的数据集通常由问答对以及包含问题答案的文档组成。对于模型运行此类任务,文档和问题通常作为模型输入,而输出可能有很大差异。一些数据集的答案是封闭式的,这意味着模型应仅以指定形式输出答案,通常是多项选择题答案,而开放式答案则采用更自由的形式。根据问答对中涉及的文档数量,我们可以将问答任务数据集分为单文档问答(QA - SG)和多文档问答(QA - MT)。问答数据集的详细统计信息见表13。
表13 文本问答(QA)数据集
Qasper[260]由基于1585篇自然语言处理论文的5049个问题组成。问题由仅阅读了论文摘要和标题的自然语言处理从业者提出,然后另一组从业者通过阅读整篇论文来回答这些问题,并相应地提供支持证据。数据集中的每个实例由一个问题、一个答案、相应的论文和支持证据组成。LongBench[247]构建的实例不需要证据。
HotpotQA[261]是一个典型的多文档问答数据集。它基于维基百科构建,每个实例由多个文档、一个问题、一个答案和支持事实组成。支持事实是一组手动标注的段落索引。AltQA[253]基于谷歌的NQ[258]数据集。答案均为数值型。原始文档被“修改”,使得数值答案的每个出现都与原始文档不同,以避免预训练中的数据污染。该数据集也用于BAMBOO[246]基准测试。BAMBOO[246]基准测试中的PaperQA和MeetingQA是多项选择题形式的问答任务。这两个数据集的每个实例都由问题、证据、答案和相应内容组成。NarrativeQA[259]使用自包含的复杂叙事作为输入文档。书籍和电影脚本都被使用。在构建问题时,注释者仅获得故事摘要,并被要求基于此编写问题。对于每个故事(总共1572个故事),从每个摘要 - 故事对中构建约30个问答对。值得注意的是,由于故事上下文的一致性,该任务可以简化为从所有与故事相关的答案中选择正确答案。MultifieldQA[247]是Longbench的原始数据集。其内容涵盖科学论文、法律文件、政府报告和谷歌搜索结果。该数据集有中英文版本,每个实例由基于文档构建的上下文和一个问答对组成。2WikiMultihopQA[263]是一个基于维基百科和维基数据构建的多文档问答数据集。维基数据是一个知识图谱数据库,作者能够从中提取与维基百科文档对应的(主题实体,属性,对象实体)三元组。这些三元组在每个问答对中用作证据,作为模型展示其推理过程的一种方式。该数据集总共包含192,606个问题。Musique[264]也是一个多文档数据集(或如论文中所述的多跳数据集)。其数据从现有的单跳问答数据集提取。然后将这些单跳问答组合成多跳问答对。此外,Musique添加了一些无法回答的问答对,以进一步测试模型的能力。Musique中有24,814个可回答问题,每个可回答问题都对应一个无法回答的问题。DuReader[265]是一个多文档问答数据集,其数据基于百度搜索结果。它由200,000个问题、1,000,000个文档和420,000个答案组成。每个实例包含一个问题、多个可能的答案(也可能为空)和多个文档。TriviaQA[254]是一个多文档阅读理解问答数据集。所有问答对均来自14个问答网站,由问答爱好者编写。对于每个问答对,提供6个支持文档(证据),这些文档从必应搜索API和维基百科收集。问答对的总数为95,956个,总共有662,659个支持文档,每个文档的平均长度为2895个单词。TOEFL(L - Eval)[244]收集托福在线练习中的讲座作为上下文。每个实例由一个长讲座输入、多个指令(问题)和相应答案组成。Coursera(L - Eval)[244]是一个基于Coursera网站构建的数据集。与托福类似,每个实例由一个长讲座输入、多个指令和相应答案组成。
SFiction(L - Eval)[244]基于科幻小说,其中现实世界的原则不适用。文档中包含的问题要求模型根据上下文信息或现实世界知识进行回答,以此测试模型的幻觉情况。LongFQA(L - Eval)[244]是一个基于财报电话会议记录的开放式金融问答数据集。CUAD(L - Eval)[244]取自CUAD[257]数据集,该数据集使用法律合同作为上下文。QuALITY[262]是一个多项选择题单文档问答数据集。它使用科幻小说、杂志文章和非小说文章作为输入文档。问题由阅读了完整文档的人编写。每个实例包含一个文档、一个多项选择题和相应答案。值得注意的是,部分问题是无法回答的。NewsQA[245]和DuoRC[245]是英文问答数据集,分别由新闻和电影情节构建。
C3[245]是一个基于中文考试的多项选择题问答数据集。NQ[258]是一个基于维基百科页面的问答数据集。每个实例(或如原始论文中所述的示例)由一个问题、相应的维基百科页面、一个长答案和一个短答案组成。
7.1.2 文本摘要任务
摘要数据集是经过整理的文本及其相应摘要的集合。它们通常包含多样化的内容,如新闻文章、科学论文或对话数据,并与简洁准确的摘要配对。文本摘要数据集的详细统计信息见表14。
表14 文本数据集 - 摘要
CNN/Dailymail[266]、GovReport[270]和XSum[267]在每个实例中都包含一个文档及其相应的摘要。CNN/Dailymail基于超过300,000篇新闻文章,GovReport基于14,466篇长政府报告,XSum基于BBC新闻。MultiNews[269]是一个多文档摘要数据集,每个实例由多个新闻和一个摘要组成。Loogle[251]基于论文、维基百科、电影和电视脚本。每个长输入文本对应多个问题 - 答案 - 摘要三元组。总共有776个文档和6,448个问题。平均文档长度为19.367个单词。VCSUM[271]基于现实世界的中文会议记录。每个会议记录对应一个标题、分段摘要和一个总体摘要。总共有239个会议。SummScreenFD[272]基于电视记录。每个实例由一个包含对话、场景和演员动作的电视记录以及一个摘要(如原始论文中所述的概括)组成。BigPatent[273]基于1,341,362篇专利文档。该数据集的亮点在于重要信息在专利文档中分布均匀,与其他类型的文档相比有所不同。每个实例包含一个文档及其相应的摘要(人工撰写的摘要)。SPACE[274]基于50家酒店的评论。该数据集的亮点在于摘要从6个不同方面撰写,基于酒店的评论。每家酒店构建一个实例,包含酒店名称、多个评论、不同方面的摘要和一个总体摘要。SQuality[275]与QuALITY[262]数据集基于相同的故事领域。它是一个基于查询的摘要数据集。每个实例包含一个故事、多个摘要问题以及与每个问题对应的多个摘要。总共有625个问答对。CNNNews(M4LE)[245]基于CNN英文新闻。数据集中的每个实例都与一个多句摘要配对。CEPSUM(M4LE)[245]基于中国电子商务平台的产品信息。每个实例包含一个产品描述和相应的摘要。LCSTS(M4LE)[245]是一个中文摘要数据集。它由来自中国微博网站的超过200万条帖子组成,每个帖子都与一个摘要配对。M4LE选择文章长度超过30个单词的实例。NCLS(M4LE)[245]是一个包含不同语言的文章和相应摘要的摘要数据集,突出了模型的跨语言能力。原始的NCLS由CNNNews和LCSTS构建。WikiHow(M4LE)[245]基于维基百科上的程序描述。每篇文章的标题都以“How to...”开头。文章的每个段落描述一个步骤,并对应一个简短摘要。这些摘要然后组合在一起作为文章的摘要。News2016(M4LE)[245]基于超过200万篇中文新闻文章。对于每篇文章,其标题用作黄金摘要。M4LE删除长度小于200个单词或超过800个单词的实例。PubMed(M4LE)[245]基于医学论文。在M4LE中,每篇论文的摘要用作论文的摘要。BookSum(M4LE)[245]是一个包含405本英文书籍的数据集,其内容涵盖戏剧、小说和短篇小说。每章内容对应一个人工撰写的摘要。CNewsum(M4LE)[245]基于304,307篇中文新闻文章。每篇文章对应一个人工撰写的摘要。CLTS + (M4LE)[245]基于CLTS[280]。CLTS包含超过180,000篇中文文章,CLTS + 使用反向翻译使摘要更具抽象性。M4LE选择这些实例的一部分进行基准测试。Arxiv(M4LE)[245]基于从arXiv.org收集的论文。对于每篇论文,其摘要用作黄金摘要。
7.1.3 文本推理任务
推理任务涉及模型根据给定信息得出逻辑结论、进行推断或解决问题的能力。它要求理解数据中的关系、模式或规则,以得出准确和连贯的结果。自然语言推理(NLI)可以被视为推理的一个子集。它突出了模型在自然语言指令下进行逻辑推理的能力。在NLI任务中,典型的目标是确定两段文本(一个前提和一个假设)之间的关系。文本推理数据集的详细统计信息见表15。
表15 文本推理/分类数据集
Long Listops[248]是一个数学推理数据集。它输入一个列表操作表达式,指示模型进行计算并输出精确的数值答案。列表操作表达式具有层次结构,涉及一组简单的数学运算符。最终答案是0 - 9中的一个数字,在原始论文中被描述为“一个十向分类任务”。GSM[278]是一个数学推理数据集,它用自然语言描述数学问题并要求模型解决。ContractNLI[277]使用合同作为上下文,并为每个实例提供假设、答案和附加证据。该任务要求模型判断假设与上下文之间的关系。每个实例包含607份合同,每份合同有17个带注释的假设和相应答案。
LSHT(LongBench)[247]是一个中文分类数据集。它基于新华社新闻。模型被要求将输入的新闻文章分类到不同类别。SenHallu[246]和AbsHallu[246]使用内容和相关假设作为模型输入,并指示模型根据内容确定假设是否正确。错误假设(如原始论文中所述的幻觉)由GPT生成。MNDS News[279]是一个分类数据集,由10,917篇新闻文章组成。新闻文章有17个一级类别和109个二级类别。
7.1.4 文本检索任务
大语言模型基准测试中的检索任务评估模型根据给定查询从大量数据中检索相关信息的能力。它测试模型对查询的理解、语义匹配以及识别最相关文档或信息片段的效率。文本检索数据集的详细统计信息见表16。
表16 文本数据集 - 检索
LongChat[252]有两个用于检索的子任务数据集。粗粒度主题检索数据集使用一个谈论多个不同主题的长文档,并指示模型检索文档的第一个主题。另一方面,细粒度行检索更具挑战性,它向模型展示包含不同编号和标签且行模式相似的多行内容。模型被要求检索特定标记行的编号。值得注意的是,这样的数据集很容易构建或生成,因此很容易创建一个超长篇幅的此类数据集。由于根据定义该数据集易于构建,所以数据集的长度和实例数量是不确定的。StreamingEval[136]基于LongChat构建了一个行检索任务,每10行进行一次查询,其答案在上方约20行处,以评估流式对话场景。TopicRet[244]则基于粗粒度主题检索任务,但询问的是第二个或第三个主题而非第一个,从而增加了任务难度。DRCD(M4LE)[245]是一个阅读理解数据集。在M4LE中,DRCD被构建为两个子集,一个(DRCD explicit)要求模型返回与给定主题相关的文章ID,另一个子集(DRCD semantic)要求模型根据多个段落回答特定问题。MARC[245]由双语(即英语和中文)评论组成。模型被要求识别所有正面评论并检索它们。Online Shopping(M4LE)[245]基于中国电子商务平台上的60K产品评论。评论被分为正面和负面两类。
7.1.5 文本生成任务
生成任务要求模型根据给定的指令和上下文生成内容。文本生成数据集的详细统计信息见表17。
表17 文本数据集 - 生成
MultiDoc2Dial[283]为模型提供对话历史和所有涉及的文档,并指示模型生成对话的下一轮内容。OpenReview(L-Eval)[244]基于ASAPReview[285],为大语言模型提供一篇论文并指示其生成一篇评论。
ShowsPred和MeetingPred[246]使用对话历史作为输入,并要求模型推断出最后一轮对话是由哪个角色所说。除了自然语言上下文,代码生成也是大语言模型的一个重要应用。LCC[282]为模型提供长代码片段作为上下文,并指示其生成下一行代码。RepoBench-P[286]要求模型从长输入中检索最相关的代码片段,然后根据指令生成代码。
PrivateEval[246]使用API文档和一个代码片段作为输入,并指示模型相应地生成代码。值得注意的是,为避免预训练导致的数据污染,API文档中的关键词被修改,使文档“私有化”。CodeU[246]采用相同的修改关键词的做法,只是它使用修改后的公共库源代码作为输入,而非API文档。
7.1.6 聚合任务
聚合任务涉及理解和聚合来自整个输入的信息,以回答复杂指令,例如在给定一组不同态度的评论时,计算正面评论的百分比。文本聚合数据集的详细统计信息见表18。
表18 文本数据集 - 聚合
SpaceDigest[250]为模型提供一组酒店评论,并要求模型输出评论中正面评论的百分比。BookSumSort[250]、ReportSumSort[246]和ShowsSort[246]使用打乱顺序的书籍摘要、电视记录或政府报告段落作为上下文,并要求模型将它们按正确顺序排序。PassageCount[247]选择多个段落,复制其中一些段落,然后将所有这些段落打乱后放入一个实例中。然后要求模型确定用于构建此实例的文档数量。
PassageRetrieval[247]则选择30个维基百科段落,并使用GPT-3.5-Turbo为其中一个段落编写摘要。然后将这些段落和生成的摘要用作模型输入。模型随后被指示说出摘要是从哪个段落生成的。
7.1.7 文本数据集的评估指标
上述文本数据集使用的通用评估指标包括精确匹配[287]、部分匹配、准确率、召回率、精确率、F1值、BLEU[288]、SacreBLEU[289]、Rouge[290]、METEOR[291]、BERT[292]、编辑相似度、Pass@k[293]、指数相似度、一致性指数、平均倒数排名。除了通用评估指标,一些特定的基准测试还使用了更具体的指标。对于来自L-Eval[244]的数据集,GPT-4指标表示与Turbo-16K相比的胜率,由GPT-4判断。\(\Delta L\)是答案长度与真实值之间的长度差。对于LooGLE[251],它在问答和摘要任务中使用GPT-4进行答案的语义判断。精确匹配(EM)[287]是用于评估模型在问答或文本生成等任务中准确性的指标。它测量与真实答案完全匹配的预测的百分比,同时考虑内容和格式。部分匹配(PM)指标通过允许对部分正确的答案给予部分分数来评估模型输出与参考之间的相似度。与严格的指标如精确匹配(EM)不同,PM考虑了重叠或共享的元素,如关键词或短语,使其在评估性能时更加灵活。准确率是用于评估模型整体性能的指标,通过测量正确预测的实例(包括正例和负例)在总实例中的比例来计算。召回率是用于评估模型在数据集中检索所有相关实例能力的指标。它计算为正确检索的相关项目数与总相关项目数的比率,强调完整性。精确率是用于评估模型准确性的指标,通过测量正确预测的正例在所有预测正例中的比例来计算。F1值是一种性能度量,它使用精确率和召回率的调和均值将两者结合为一个分数。它提供了一个平衡的评估,特别适用于类别不平衡的数据集,因为它同时考虑了假阳性和假阴性。BLEU[288]是一种广泛用于评估机器生成文本质量的指标,特别是在机器翻译中。它通过比较生成输出中的n元语法与参考文本以测量重叠,并对过短的输出应用惩罚以确保流畅性。SacreBLEU[289]是用于评估机器翻译质量的标准化BLEU指标。它通过固定预处理步骤(如参考处理)简化了BLEU的实现,以确保不同系统之间的结果一致且可重现。
Rouge[290]及其变体通过计算模型输出与参考答案之间的一元组(Rouge-1)、二元组(Rouge-2)、最长公共子序列(Rouge-L)等的重叠来衡量模型的性能。VCSUM数据集中的Gold Rouge-1指的是使用高质量参考摘要(黄金标准)进行评估,确保可靠且有意义的比较。METEOR[291](具有显式排序的翻译评估指标)是一种文本评估指标,旨在评估机器翻译的质量。BERT[292]指标,通常称为BERTScore,是一种文本评估指标,它使用来自BERT模型的上下文嵌入来比较生成文本和参考文本之间的相似度。编辑相似度是一种基于将一个文本序列转换为另一个文本序列所需的最小编辑操作数来测量两个文本序列相似度的指标。它源自编辑距离的概念,如莱文斯坦距离。Pass@k[293]通过测量前k个生成输出中至少有一个包含正确解决方案的百分比来评估模型的性能。在我们调查的数据集中,仅使用Pass@1。指数相似度是一种通过对两个项目之间的差异进行指数加权来测量它们之间相似度的指标,更重视较小的差异。一致性指数是一种用于评估模型预测准确性的指标,特别是在生存分析或排名任务中。
平均倒数排名(MRR)是信息检索和推荐系统中常用的评估指标,用于衡量排名结果的质量。它计算结果列表中第一个相关项目的排名的倒数,并对所有查询进行平均。
7.2 多模态数据集和评估指标
7.2.1 多模态数据集
多模态数据集的出现是为了满足通过整合文本、图像、音频和视频等多种数据类型来全面理解复杂现实世界的需求。这些数据集通过提供丰富多样的数据来训练更强大、通用的模型,推动了人工智能,特别是机器学习和深度学习领域的发展。我们分析了表19中列出的多模态基准测试,突出它们的不同重点。每个基准测试都基于一个或多个多模态数据集构建,涉及数据的收集、处理以及特定验证指标的使用。下面,我们对每个多模态基准测试进行详细介绍和描述。
表19 多模态数据集
LLaVA-Bench[294]:该基准测试围绕图像 - 真实文本描述 - 问题 - 答案三元组构建,数据来自COCO和In-The-Wild数据集。它评估模型在多模态指令遵循和视觉推理方面的熟练程度。通过一系列任务和指标,它量化了模型理解和执行视觉语言指令、清晰表述描述以及进行复杂推理过程的能力。
MMBench[295]:这个基准测试是一个双语多模态基准,便于在英语和中文语言环境中对视觉语言模型(VLM)的性能进行比较分析。它通过能力的分层分类、严格的质量保证措施和双语评估框架,独特地评估多模态模型。与其他基准测试不同,MMBench[295]采用循环评估(CircularEval)策略进行全面评估,并使用大语言模型精确提取选项,使其与其他基准测试区分开来。
MileBench[296]:评估大语言模型的多模态长上下文能力,包括诊断性和现实性评估集。它强调长上下文和多图像任务。这种独特的关注焦点使其能够捕捉现实世界多模态挑战的复杂性和多样性,与现有基准测试有所不同。MileBench[296]中的数据集特点是包含与多个图像集成的长文本,反映了上下文至关重要的现实场景。它包含各种需要理解和生成的任务。
MLVU[297]:是一个全面的基准测试,旨在评估多模态大语言模型理解视频内容的能力。它超越了其前身的限制,显著增加了视频时长,涵盖了多种视频类型,并设计了一系列评估任务。这个基准测试提供了广泛的任务和视频类型,以评估多模态大语言模型的综合能力。它突出了当前方法在提升方面的巨大潜力,并强调了上下文长度、图像理解质量以及大语言模型架构选择等关键因素对未来进展的重要性。
LongVideoBench[298]:提供了一个广泛的基准测试框架,旨在评估大型多模态模型(LMMs)理解带有字幕的长视频(长达一小时)的能力。它高度关注对长时间交织的视频和语言数据流的检索和推理能力,解决了单帧偏差问题,并强调了其在评估长上下文多模态理解方面的优势。
Video-MME[299]:一个用于综合评估的基准测试,评估多模态大语言模型(MLLMs)分析视频的熟练程度。该数据集包含来自不同领域和子领域的900个视频,确保了广泛的场景覆盖。视频长度从11秒到1小时不等,以评估模型在不同时间框架下的灵活性。此外,它整合了各种数据模态,包括字幕和音频轨道,以评估多模态大语言模型的综合能力。该基准测试旨在测试模型对顺序视觉数据的理解能力,特别强调时间推理和多模态输入的处理。
NExT-QA[300]:推动视频理解从单纯的描述发展到对因果、时间和描述性动作的解释,建立了一个视频问答(VideoQA)基准测试。该基准测试拥有一个包含5,440个视频和约52,000个人工标注问答对的数据集,分为因果、时间和描述性类别。它对问答模型提出了挑战,要求其对因果和时间动作进行推理,并解读日常活动中复杂的对象交互。与其他视频基准测试不同,该基准测试特别关注现实视频中丰富的对象交互中的因果和时间动作推理。它是最大的人工标注视频问答数据集之一,支持多项选择和开放式问题,并包含各种反映现实生活场景的视频。
MVBench[301]:具有一个庞大的数据集,该基准测试为20个时间理解任务中的每个任务构建了200个多项选择问答(QA)对,总共积累了4,000个问答对。它从11个公共数据集中的各种视频中提取数据,涵盖不同领域和场景,从而测试模型理解时间序列的能力。该基准测试通过从现有视频注释自动生成多项选择问答对,最大限度地减少了人工干预,确保了公平的评估过程。
MSVD-QA[302]:MSVD数据集是一个包含1,970个带有描述性字幕的视频剪辑的集合,最初用于视频字幕生成。它展示了多样化的现实世界场景,并评估多模态学习模型理解视频内容和生成自然语言描述的能力。
MSRVTT-QA[302]:MSR-VTT数据集由10,000个视频剪辑组成,每个剪辑有20个人工转录的句子,专注于将视频内容与语言描述联系起来。它评估多模态学习模型理解视频信息并将其转化为连贯字幕的能力,在更复杂和多样化的环境中测试它们的视频理解和语言生成技能。
7.2.2 多模态数据集的评估指标
多模态数据集的评估指标包括相对得分、准确率、ROUGE-L、M-Avg、G-Avg、WUPS。在7.1.7节中已经介绍了一些常见指标,包括准确率、ROUGE-L。这里,我们仅介绍多模态数据集特有的指标,包括相对得分、M-Avg、G-Avg、WUPS,如下:
相对得分:此指标用于LLaVA-Bench中,通过将模型输出与参考模型(通常是基于文本的GPT-4)进行比较来评估多模态模型的性能。它计算为候选模型得分与参考模型得分的百分比比率,基于有用性、相关性、准确性和详细程度等维度。
M-Avg:多项选择平均(Multiple-Choice Average)计算为MLVU基准测试中所有多项选择任务的平均准确率。每个任务的准确率由正确预测答案的比例与该任务中的总问题数相比确定。
G-Avg:生成平均(Generation Average)计算为MLVU基准测试中所有生成任务的平均得分。每个任务在多个维度(例如准确率、相关性、完整性和可靠性)上使用GPT-4进行评估,得分范围为1到5。每个任务的总体得分是这些维度的平均值,而G-Avg是这些任务级得分的平均值。
WUPS[303]:Wu-Palmer相似度基于两个单词在分类法(如WordNet)中的位置来测量它们的语义相似度。它通过考虑它们的最低共同祖先(LCS)来计算两个单词的相关程度。
8 结论
大语言模型的进步在各个领域推动了显著进展,但它们在推理过程中的高计算和内存需求带来了挑战,特别是对于长上下文和实时应用。键值缓存管理通过优化内存、减少冗余计算和提高性能,提供了一种有效的解决方案。本综述回顾了跨token级、模型级和系统级优化的键值缓存管理策略。token级优化通过选择、预算分配、合并、量化和低秩分解,专注于对键值缓存的细粒度控制,在不改变模型架构的情况下实现高效的资源分配。模型级优化利用架构创新,如注意力分组和非Transformer设计,提高键值重用的效率。系统级优化通过采用先进的内存管理、调度技术和硬件感知设计,进一步补充了这些努力,以优化不同计算环境中的资源利用。
尽管已经取得了进展,但未来仍有大量的探索机会。关键领域包括开发实时、特定任务的预算分配策略,处理动态工作负载,在多节点系统中进行先进的键值缓存分布式协调,以及利用计算存储和内存处理等新兴架构进行硬件感知创新。此外,集成强化学习和自适应算法可以实现更智能、响应更迅速的键值缓存管理,进一步提高大语言模型在各种部署场景中的效率。