GQA,MLA之外的另一种KV Cache压缩方式:动态内存压缩(DMC)

news2024/12/26 13:29:21

0x0. 前言

在openreview上看到最近NV的一个KV Cache压缩工作:https://openreview.net/pdf?id=tDRYrAkOB7 ,感觉思路还是有一些意思的,所以这里就分享一下。

简单来说就是paper提出通过一种特殊的方式continue train一下原始的大模型,可以把模型在generate过程中的KV Cache分成多个段,并且每个token都会学出来一个0或者1的标记,对于标记为1的token的KV Cache可以累加到上一个标记为1的token的KV Cache上(需要这两个token连续才可以累加),而不是concat,这样就可以高效压缩KV Cache,效果也是不错的,且可以配合GQA联合使用。此外,它在continue train或者推理prefill的时候仍然可以用上Flash Attention,推理的decode阶段可以用上Paged Attention。

但是读完方法部分发现这个方法也有几个缺陷,估计会失去工程应用的机会,只能当一篇paper读一下。第一点就是要对整个模型做全量参数的continue train,虽然训练的数据可以很少,但是能把大模型加载起来的成本已经非常高了,普通人肯定这一步就卡死了。第二,这种方法不能from scratch训练,这样就更阻碍了这种方法的广泛应用,毕竟MLA的成功一个重要原因就是因为Deepseek2直接用这个架构from scratch训出来的model并开源。另外,这里的开源链接目前是空的,还不能看到代码细节。

0x1. 摘要

Transformer 已经成为大型语言模型 (LLM) 的核心。然而,由于需要在内存中存储过去token的key value的缓存(KV Cache),而缓存的大小与输入序列长度和batch大小线性相关,因此生成仍然效率低下。为了解决这个问题,paper提出了动态内存压缩 (DMC),一种在推理时对KV Cache进行在线压缩的方法。最重要的是,模型学习在不同的注意力头和layer中应用不同的压缩率。paper将预训练的 LLM(如 Llama 2(7B、13B 和 70B))改造为 DMC Transformer,在 NVIDIA H100 GPU 上进行自回归推理时,实现了高达 ~3.7 倍的吞吐量提升。DMC 通过在原始数据的极小百分比上进行continue pretrained来应用,而无需添加任何额外的参数。paper发现,DMC 在高达 4 倍的缓存压缩的情况下,保留了原始的下游性能,优于经过微调的分组查询注意力 (GQA) 和key value驱逐策略 (H2O、TOVA)。GQA 和 DMC 可以结合起来获得复合收益。因此,DMC 在任何给定的内存预算内都适合更长的上下文和更大的batch。我们在 https://github.com/NVIDIA/Megatron-LM/tree/DMC 上发布了 DMC 代码和模型。

0x2. 介绍

首先还是提到了大模型推理的时候KV Cache会伴随着序列长度和Batch大小不断增长,这个问题在长文本生成(例如,对话和故事)或为大量用户查询提供服务时更加明显。然后为了缓解这个问题,GQA,Key-Value驱逐策略比如H20,TOVA等被提出,然后Paper说这些方法往往会牺牲预训练模型的精度。另外Flash-Attention等IO-aware或者子平方注意力算法等都无法改善KV Cache。

因此paper提出了动态内存压缩(DMC)方法对KV Cache进行压缩,如图 1 所示,在每个时间步长,DMC 会决定是将当前的key-value表示添加到缓存中,还是对它们与缓存中顶部的项进行加权平均。DMC 中的内存以亚线性方式增长,虽然比不上Linear Attention Transformer推理时的内存恒定,但明显好于Transformer。

在这里插入图片描述

作者团队使用了部分预训练数据(2%对应2倍压缩,4%对应4倍压缩)对应用了DMC的LLama 2(7B,13B)模型进行continue training。 paper在一些下游任务上评估了我们的 DMC 模型,例如 MMLU 用于事实性,QA 数据集用于常识推理,以及 HumanEval 用于代码。作者发现,DMC LLM 保持了与原始 LLM 相似的下游性能,而基线(如 GQA、H2O 和 TOVA)在高压缩率下会造成显著的性能下降。最后,作者表明 DMC 可以与 GQA 混合,使得它们的压缩率相乘。对于使用 GQA 8 倍预训练的 Llama 2 70B,DMC 2 倍可以实现总共 16 倍的压缩。

作者验证了 KV 缓存压缩在实践中可以转化为更有效的生成。 最后测量到,DMC 4 倍在不损失性能的情况下,将 Llama 2 7B 和 13B 在 NVIDIA H100 或 A100 GPU 上的推理吞吐量提高了 340% 到 370%。事实上,它使大模型能够在给定的内存预算中容纳更大的batch和更长的序列。

0x3. 动态内存压缩方法(DMC)

LLM 的推理通常受内存限制,而不是计算能力限制。减少 KV Cache的大小可以降低延迟并提高 GPU 利用率。DMC 是一种简单且廉价的在线压缩 KV Cache的方法。通过continue pretrain,可以教会预训练的 LLM 使用 DMC。

0x3.1 推理

考虑自回归推理过程中注意力层的正向传播。 在普通 Transformer 中,在每个时间步 t t t k t k_t kt v t v_t vt 都会被追加到 KV Cache中。另一方面,在 DMC 中,KV Cache更新过程有所不同,如算法 1 所示。首先,预测一个决策变量 α t ∈ \alpha_t \in αt {0, 1} (只能取0和1) 和一个重要性变量 ω t ∈ [ 0 , 1 ] ω_t ∈ [0, 1] ωt[0,1]。为了避免添加新的参数,我们分别重用 k t k_t kt q t q_t qt 中的第一个神经元来提取这两个分数。根据 α t \alpha_t αt,决定是将 KV 表示 k t k_t kt v t v_t vt 追加到缓存中,还是将其与缓存的最后一个元素累加。

在这里插入图片描述

具体来说,对于累加,paper根据对当前token预测的重要性分数 ω ω ω 和自上次预测 α = 0 \alpha = 0 α=0 以来所有 token 的重要性分数之和 z t z_t zt 进行加权平均。 事实上, α \alpha α变量有效地将输入序列分割:每个决策决定当前段是否应该继续( α = 1 \alpha = 1 α=1)或是否应该打开一个新段( α = 0 \alpha = 0 α=0)。更新后,DMC 的缓存长度为 l = ∑ t = 1 n ( 1 − α t ) < = n l = \sum_{t=1}^{n}(1-\alpha_t)<=n l=t=1n(1αt)<=n,而在普通 Transformer 中,它始终为 l = n l = n l=n。在下文中,将未压缩缓存的长度 n n n 与压缩长度 l l l 之间的比率 n / l n/l n/l 称为压缩率 (CR)。最后,多头自注意力与普通 Transformer 的计算方式类似,使用 KV Cache序列,区别在于不同头的 KV 序列可能具有不同的长度。 算法 1 对每个 MHSA 层和头独立地应用。请注意,算法 1 可以有效地实现,无需根据 α t \alpha_t αt 进行 if-then-else 语句,而是像公式(9)中那样将之前的 k i k_i ki v i v_i vi z i z_i zi 乘以 α t \alpha_t αt

在这里插入图片描述

0x3.2 训练

DMC 推断算法在累积和追加token到 KV Cache之间切换。为了赋予 LLM DMC 功能,我们在少量预训练数据上继续对它们进行预训练,逐渐提高压缩率以达到目标。然而,这带来了严峻的挑战。首先,我们选择通过梯度下降和决策变量的连续松弛来进行端到端学习。因此,我们必须定义一个 KV 缓存更新操作,当 0 < α < 1 0 < \alpha < 1 0<α<1 时,导致部分聚合、部分累积的key和value状态。其次,为了避免训练-推断不匹配,我们必须在推断时模拟 DMC 行为,同时跨一系列tokens 并行训练:因此, K K K V V V 的长度在训练期间不会通过压缩减少;相反,keys 和 values 的中间状态都显式地保存在内存中,并且一个辅助的(逐渐离散化的)掩码调节 query 和 key 之间的交互。

离散决策的梯度估计
推理时是累积还是追加的决策是离散的;然而,在训练中将 s i g m o i d ( k [ 0 ] ) sigmoid(k[0]) sigmoid(k[0])四舍五入到最接近的整数会导致非可微分操作,梯度为零。因此,我们在训练过程中采用决策变量的随机重参数化。

α t ∼ Gumbel-sigmoid ( k [ 0 ] − c , τ ) ∈ [ 0 , 1 ] , \alpha_t \sim \text{Gumbel-sigmoid}(k[0] - c, \tau) \in [0, 1], αtGumbel-sigmoid(k[0]c,τ)[0,1],

其中, τ \tau τ 是温度( 低温度将 α t 锐化为几乎离散的值,这准确地模仿了推理行为。 低温度将\alpha_t 锐化为几乎离散的值,这准确地模仿了推理行为。 低温度将αt锐化为几乎离散的值,这准确地模仿了推理行为。), c c c 是一个常数,减去它是为了使在训练步骤0时,每个 α ≈ 0 \alpha≈0 α0。同样地,我们将 c c c加到重要性变量 ω t ω_t ωt中,以便在开始时每个 ω t ≈ 1 ω_t≈1 ωt1。这确保了DMC最初不执行压缩,且训练表现如同普通的Transformer。

部分累积
随着我们放宽离散决策,我们现在必须定义一个机制来更新KV缓存,使其将算法1推广到连续的 α \alpha α。因此,我们定义部分累积状态对于 α ∈ [ 0 , 1 ] α \in [0, 1] α[0,1]如下:

在这里插入图片描述

注意,当 α \alpha α ∈ {0, 1}时,方程(9)会退化为算法1。

中间压缩步骤

除了方程(9)中显示的key和value的计算,Forward Pass其余部分可以对序列中的所有tokens并行执行。然而,这在训练和评估之间造成了不匹配,因为在训练期间,所有key和value的中间状态在自注意力机制中都是可访问的。

在这里插入图片描述

为了说明这个问题,请考虑上图2中DMC推理期间的KV Cache示例,决策分数序列为 α 1 : 5 = ( 1 , 1 , 0 , 1 , 0 ) \alpha_{1:5} = (1, 1, 0, 1, 0) α1:5=(1,1,0,1,0)(为简明起见,已省略重要性分数 ω \omega ω)。KV Cache的最后一个元素在每个时间步都会发生变化。为了在训练期间正确模拟推理时间KV Cache的演变,保留所有展开的中间KV Cache项。

在这里插入图片描述

论文使用基于 α \alpha α值序列的加性掩码来修改方程(4)中的注意力分数 a i j h a^h_{ij} aijh,如上图3所示。

在这里插入图片描述

在训练期间, α \alpha α值 1) 自然地收敛到0或1,因为模型努力满足语言建模标准并减少不确定性;2)通过Gumbel噪声和低温设置被故意推向几乎离散的状态。这样的 α \alpha α值二值化显著影响了注意力分数——它加强了query与每个key-value段最后元素的交互,并削弱了与中间元素的交互,中间元素在推理期间被丢弃。事实上,当 α ∈ { 0 , 1 } \alpha \in \{0, 1\} α{0,1}时,矩阵充满了0或 − ∞ -\infty 值,并且完全对应于推理时间的query到key的注意力模式。

训练目标

模型被激励将KV Cache压缩到某个CR,从而增加预测的 α \alpha α值。我们不是为每个追加或累积决策 α \alpha α匹配期望的比率,而是计算一个全局的单边损失,作为所有决策之和与在期望的压缩比(CR)下所有层 l l l、头 h h h和时间步 t t t的KV tokens的期望总和之间的差值,归一化为 ( n l n h n ) (n_l n_h n) (nlnhn)

ℓ C R = 1 n l n h n ∗ max ⁡ ( 0 , ∑ l = 1 n l ∑ h = 1 n h ∑ t = 1 n ( 1 − α l h t ) − n l n h n C R ) . ( 10 ) \ell_{CR} = \frac{1}{n_l n_h n} * \max \left(0, \sum_{l=1}^{n_l} \sum_{h=1}^{n_h} \sum_{t=1}^{n} (1 - \alpha_{lht}) - \frac{n_l n_h n}{CR} \right). \quad (10) CR=nlnhn1max(0,l=1nlh=1nht=1n(1αlht)CRnlnhn).(10)

它被添加到语言建模损失项 ℓ L M = − ∑ t = 1 n log ⁡ p θ ( x t ∣ x < t ) \ell_{LM} = - \sum_{t=1}^{n} \log p_\theta (x_t \mid x_{<t}) LM=t=1nlogpθ(xtx<t)中,最终的训练目标是:

arg ⁡ min ⁡ θ ℓ L M + ℓ C R . ( 11 ) \arg \min_\theta \ell_{LM} + \ell_{CR}. \quad (11) argθminLM+CR.(11)
重要的是,训练过程设计为缓慢提高目标CR并在过程中获取可随时使用的DMC检查点。这是可能的,因为所有超参数,如Gumbel-sigmoid采样温度和学习率,都不会衰减并在整个训练过程中保持不变。这种DMC属性的一个实际应用案例是,在一次运行中生成具有不同CR的一系列DMC检查点,然后选择一个具有期望的效率-性能权衡的检查点。

我个人理解是在计算attenton score矩阵的时候,对于标准的attention来说只有当矩阵中的 q i ∗ k j q_i * k_j qikj接近0的时候才能说明i和j这两个token是相互注意的,也就是有强烈的语义关系。但是现在新插入了一项 l o g ( 1 − α t ) log(1-\alpha_t) log(1αt)进来,并且是求和的方式(见下面的附录H),根据语言模型的特性,这个 α t \alpha_t αt只能尽量往0和1靠,对应的语义关系就是强烈相关和完全不相关,否则会影响最后模型的性能。这样就做到了paper中描述的只和每个key-value段最后元素的交互,并削弱了与中间元素的交互,中间元素在推理期间被丢弃。这样在推理的时候就可以压缩了。

在这里插入图片描述

0x3.3 实际考虑

DMC允许每个头学习自定义压缩,这导致KV缓存序列在各个头之间具有可变长度。这给在 n n n维张量中高效存储这些序列时带来了困难,因为在自回归生成期间,由于DMC的自适应压缩率,每个头的KV Cache将通过不同数量的token进行扩展。然而,使用PagedAttention可以轻松地将这些序列存储在内存中,而几乎没有开销,其中为每个头单独按需分配新page。在第5.2节中,我们展示了基于FlashAttention和PagedAttention的实现测得的延迟和吞吐量。

也就是说,DMC和FlashAttention和vLLM相兼容的,这也让他有一定的实用性可能。

0x4. 总结

读到这里对idea的把握就差不多了,实验部分就不说了。Paper的附录里面还提到一个limit,DMC这种方法针对已经训练好的model通过continue train来应用DMC,如果from scratch训练模型会崩,所以这个应该是相比于MLA的劣势,因为对于很大的model来说不是每个人都有资源去continue train一下model的。不过这个paper的思路还是蛮有意思的,所以就在这里给大家分享一下它的Idea。谢谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1804173.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

打破 AIGC 算力困境,io.net 如何实现“GPU 互联网”?

AIGC 在全球快速发展的当下&#xff0c;诸多项目深陷 GPU 运力不足&#xff0c;速度放缓、任务宕机、项目崩溃等困境&#xff0c;作为瞄准 AI 理念和 DePIN 赛道的 Solana 生态项目新星 io.net 来说&#xff0c;如何集成项目控制与云计算服务成为抢占市场的重要发力方向。第 11…

将web项目打包成electron桌面端教程(一)vue3+vite+js

说明&#xff1a;后续项目需要web端和桌面端&#xff0c;为了提高开发效率&#xff0c;准备直接将web端的代码打包成桌面端&#xff0c;在此提前记录一下demo打包的过程&#xff0c;需要注意的是vue2或者vue3的打包方式各不同&#xff0c;如果你的项目不是vue3vitejs&#xff0…

Nagios的安装和使用

*实验* *nagios安装和使用* Nagios 是一个监视系统运行状态和网络信息的监视系统。Nagios 能监视所指定的本地或远程主机以及服务&#xff0c;同时提供异常通知功能等. Nagios 可运行在 Linux/Unix 平台之上&#xff0c;同时提供一个可选的基于浏览器的 WEB 界面以方便系统管…

go语言后端开发学习(二)——基于七牛云实现的资源上传模块

前言 在之前的文章中我介绍过我们基于gin框架怎么实现本地上传图片和文本这类的文件资源(具体文章可以参考gin框架学习笔记(二) ——相关数据与文件的响应)&#xff0c;但是在我们实际上的项目开发中一般却是不会使用本地上传资源的方式来上传的&#xff0c;因为文件的上传与读…

项目验收总体计划书(实际项目验收原件参考Word)

测试目标&#xff1a;确保项目的需求分析说明书中的所有功能需求都已实现&#xff0c;且能正常运行&#xff1b;确保项目的业务流程符合用户和产品设计要求&#xff1b;确保项目的界面美观、风格一致、易学习、易操作、易理解。 软件全套文档过去进主页。 一、 前言 &#xff0…

图鸟UI-Icon演示:探索多功能前端模板的魅力

在当今数字化的时代&#xff0c;用户界面&#xff08;UI&#xff09;设计在提升用户体验方面扮演着至关重要的角色。随着技术的不断进步&#xff0c;开发者们对于高效、统一且美观的UI组件需求日益增加。图鸟UI&#xff0c;作为一款功能强大且灵活的UI框架&#xff0c;正满足了…

一款免费文件夹同步工具,旨在帮助用户在不同磁盘或文件夹间进行文件和目录的复制、移动和同步工作

一、简介 1、一款免费文件夹同步工具&#xff0c;旨在帮助用户在不同磁盘或文件夹间进行文件和目录的复制、移动和同步工作。这款工具因其简单易用、高度可定制化的特点&#xff0c;受到了广大用户的青睐。SyncToy支持多种同步模式&#xff0c;包括镜像同步、单向同步以及增量同…

第四篇红队笔记-百靶精讲之Prime-wfuzz-wpscan-openssl enc

靶机Prime渗透 主机发现 nmap扫描与分析 目录爆破与模糊测试 dirb 目录扫描 dev secret.txt wfuzz发现 file参数 根据secret.txt-location.txt 和 file参数结合 secrettier360 根据filelocation.txt得到的on some other php page&#xff08;改用之前扫到image.p…

GDAL 保存TIFF时的Options的可选项

使用GDAL保存文件时&#xff0c;高级操作需要对参数Options进行设置&#xff0c;但代码注释中没有这个参数的可选项&#xff0c;在GDAL的官网上有这部分内容&#xff0c;在此记录&#xff0c;以防遗忘&#xff0c;也为方便同道中人查询。 官网关于gdal Driver options参数设置的…

Oxlint 会取代 Eslint 吗?

最近&#xff0c;一个基于 Rust 的代码检查工具 Oxlint 在国外前端社区引起了热议&#xff0c;许多专家对其给予了高度评价。那么&#xff0c;相比于它的大哥 Eslint&#xff0c;Oxlint 有哪些优势&#xff1f;它会在未来取代 Eslint 吗&#xff1f;本文将讨论这个话题。 Oxc 和…

STM32高级控制定时器(STM32F103):TIM1和TIM8介绍

目录 概述 1 认识TIM1和TIM8 2 TIM1和TIM8的特性 3 TIM1和TIM6时基和分频 3.1 时基单元 3.2 预分频 3.3 时基和分频相关寄存器 3.3.1TIMx_CR1 3.3.2 TIMx_PSC 概述 本文主要介绍STM32高级定时器TIM1和TIM8的功能&#xff0c;还介绍了与之相关的寄存器的配置参数。包括…

Vue CLI 4与项目构建实战指南

title: Vue CLI 4与项目构建实战指南 date: 2024/6/9 updated: 2024/6/9 excerpt: 这篇文章介绍了如何使用Vue CLI优化项目构建配置&#xff0c;提高开发效率&#xff0c;涉及配置管理、项目部署策略、插件系统定制以及Webpack和TypeScript的深度集成技巧。 categories: 前端…

接口自动化Requests+Pytest基础实现

目录 1. 数据库以及数据库操作1.1 概念1.2 分类1.3 作用 2 python操作数据库的相关实现2.1 背景2.2 相关实现 3. pymysql基础3.1 整个流程3.2 案例3.3 Pymysql工具类封装 4 事务4.1 案例4.2 事务概念4.3 事务特征 5. requests库5.1 概念5.2 角色定位5.3 安装5.4 校验5.5 reques…

如何微调 Llama 3 进行序列分类?

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

GDPU unity游戏开发 寻路与导航

学会寻路&#xff0c;出门在外&#xff0c;身份不是他给的&#xff0c;他做不了你一直的导航。 角色寻路 角色控制器替换为普通的角色控制器&#xff0c;给实验九的地形增加NavMesh Surface组件&#xff0c;然后给角色增加NavMesh Agent组件&#xff0c;并选择合适的参数。通过…

Ubuntu24.04基本配置

目录 0. 前言1. 连接网络2. 更新源3. 安装并配置vim4. 设置用户sudo免密5. 同步双系统时间6. 设置终端颜色主题7. 设置中文输入法8. 调整Dock位置等9. 设置Grub10. 其它美化设置10.1 夜灯10.2 壁纸10.3 终端加强gnome-tweaks10.4 字体 11. 常用工具11.1 邮箱配置11.2 翻译工具1…

【机器学习】机器学习与医疗健康在智能诊疗中的融合应用与性能优化新探索

文章目录 引言机器学习与医疗健康的基本概念机器学习概述监督学习无监督学习强化学习 医疗健康概述疾病预测诊断辅助个性化治疗方案制定 机器学习与医疗健康的融合应用实时健康监测数据预处理特征工程 疾病预测与优化模型训练模型评估 诊断辅助与优化深度学习应用 个性化治疗方…

【C++11】多线程常用知识

知识体系 thread C++ thread中最常用的两个函数是join和detach,怎么选择呢,简单来说,如果希望等待线程结束,用join,如果希望异步执行,且不等待执行结果,那么就用detach;thread_local可以简单理解为一个线程级别的全局变量;线程id在调试多线程程序时是非常有用的东西;…

Responder工具

简介 Responder是一种网络安全工具&#xff0c;用于嗅探和抓取网络流量中的凭证信息&#xff08;如用户名、密码等&#xff09;。它可以在本地网络中创建一个伪造的服务&#xff08;如HTTP、SMB等&#xff09;&#xff0c;并捕获客户端与该服务的通信中的凭证信息。 Responder工…

华为云耀云服务器L实例规则配置教程(亲自实操经验)

我刚买了这个最基础的36&#xffe5;的L实例的云服务器&#xff0c;这个实例是自带公网ip的&#xff0c;不需要额外购买。我准备先配置好&#xff0c;能够通过公网ip访问&#xff0c;以便之后上传javaweb项目可以直接访问&#xff0c;不过中途遇到了点问题&#xff0c;但是已解…