TriForce: 突破长序列生成瓶颈的分层投机解码技术

在人工智能领域,大型语言模型(LLMs)的长序列生成能力一直是研究的热点。然而,随着模型规模的增长,推理过程中的内存和计算瓶颈成为了限制其应用的主要障碍。为了解决这一问题,Carnegie Mellon University和Meta AI (FAIR)的研究团队联合推出了TriForce,一种创新的分层推测解码系统。TriForce通过利用注意力稀疏性和上下文局部性,有效地缓解了关键的键值(KV)缓存和模型权重瓶颈,实现了对长序列生成的无损加速。在A100 GPU上,TriForce为Llama2-7B-128K模型带来了高达2.31倍的推理速度提升,在RTX 4090 GPU上更是达到了惊人的7.78倍加速,显著减少了生成每个token所需的时间。而且TriForce在处理大型批量数据时也展现了出色的性能,在实际应用中有着高效性和可扩展性。

Figure 1展示了 TriForce 如何使用基于检索的草图和分层推测来有效解决双重瓶颈问题。整合了两个模型和三种缓存,包括草图模型、目标模型以及草图模型的 StreamingLLM 缓存,以及目标模型的检索缓存和完整缓存。过程首先通过重复草图 γ1 步,帮助目标模型使用检索的部分 KV 缓存生成超过 γ2 个 token,然后由目标模型使用完整的 KV 缓存进一步验证这些 token

TriForce的设计深受对大模型(LLMs)处理长上下文时注意力机制的观察所启发。研究揭示了一个关键的现象:在预训练的LLMs中,即使面对长达120K的上下文,通过仅使用4K的token,就能恢复超过96%的注意力得分。这一发现表明,LLMs在处理长序列时,其注意力分布呈现出显著的稀疏性。注意力稀疏性的发现对于TriForce来说至关重要,因为它意味着在进行推测解码时,可以只利用一小部分关键信息,而不必加载整个KV缓存。

a. 展示了随着序列长度增加,使用 StreamingLLM 或 Sliding-window 与 Llama2-7B-128K 之间的自然发散持续增加,表明推测解码的接受率随着更长上下文的增加而下降。温度敏感性表明缺乏鲁棒性。 b. 与模型权重相比,随着上下文长度的增加,KV 缓存逐渐成为另一个瓶颈。 c. 随着上下文长度的增加,KV 缓存占据了大部分内存


另一个关键的观察是上下文局部性。这一概念指出,相邻的token在长上下文中往往需要相似的信息。也就是说,对于任何给定的token,与其相关的信息在上下文中往往集中在一个局部区域内。这种局部性允许TriForce在多个解码步骤中重用特定的缓存段,而不是每次都重新构建整个缓存。通过这种方式,TriForce能够显著提高解码效率,同时保持对上下文的敏感度。

a. Llama2-7B-128K 模型在 120K 上下文中展示了显著的注意力稀疏性。除了前两层外,其余层表现出显著的稀疏性。 b. 可以使用部分 KV 缓存和完整模型权重进行自我推测。使用有限预算的现有方法可以实现高接受率。 c. 在大多数层中观察到明显的局部性,随着上下文的发展这种局部性逐渐减少

这两个观察结果为TriForce提供了坚实的理论基础,使其能够通过智能地选择和重用信息来优化长序列生成过程,从而在保持生成质量的同时,显著提高推理速度。

TriForce: 创新的分层推测解码系统

TriForce系统的核心在于其创新的检索式草稿方法。这种方法通过将KV缓存分割成小块,并计算给定查询与每个块中平均key缓存的注意力,有效地识别和选择最相关的信息。这一策略不仅直观,而且无损,与现有的基于逐出策略的方法相比,如StreamingLLM和H2O,它在保持低延迟的同时,能够更准确地检索详细的上下文信息。

基于检索的草图方法。在需要长期上下文依赖的情况下,StreamingLLM 和 H2O 等方法由于其缓存更新策略而表现不佳,因为它们不可避免地且不可恢复地丢弃 KV 对


为了应对KV缓存瓶颈之外的模型权重瓶颈,TriForce采用了分层推测架构。这一架构首先使用一个轻量级模型,配备StreamingLLM缓存,对目标模型进行初步推测。这种分层的方法显著降低了草稿阶段的延迟,从而加速了整个推理过程。

TriForce的算法伪代码进一步阐释了其工作流程。系统首先初始化目标模型和草稿模型,然后构建检索缓存,并根据上下文局部性的洞察进行更新。在每次迭代中,草稿模型首先预测一定步数的token,然后目标模型使用完整的KV缓存进行自我验证。这个过程不仅构建了一个效率层级,还通过两个瓶颈的有效管理,提高了整体的推理速度。

以下是一个简化的伪代码示例,概述TriForce算法的主要步骤和结构:

# 输入参数:
# Prefix: 输入前缀序列 [x1,...,xt]
# Mp: 目标模型与完整缓存 Cp
# Mq: 草稿模型与StreamingLLM缓存 Cq
# T: 目标序列长度
# γ1, γ2: 推测长度参数
# Draft: 自回归草稿阶段
# Verify: 验证阶段
# Correct: 校正阶段# 初始化阶段
Initialize(Prefix, Mp, Mq, T)
Prefill(Mp, C_p, Prefix)
Prefill(Mq, C_q, Prefix)
Construct(Cr, Prefix[-1])# 迭代推断,直到达到目标序列长度 T
while N < T:# 草稿模型推测阶段for i in 1 to γ1:qi = Draft(Mq, Cq, x≤N)# 采样与验证阶段for i in 1 to γ1:~xi ~ qip_hat = Mp(Cr, x≤N, ~x≤i)if Verify(~xi, qi, p_hat):n += 1else:xi = Correct(qi, p_hat)n += 1break# 如果所有推测的token都被接受,则采样下一个tokenif all tokens accepted:xn+1 ~ p_hatN += 1# 更新缓存Update(Cr, Cq, accepted tokens)# 返回生成的序列
return Generated_Sequence

系统实现采用了Transformer架构,并利用PyTorch CUDA图形和FlashAttention技术来最小化推测解码期间的内核启动开销,并加速注意力操作。为了保持在固定的KV缓存预算内,系统实现了额外的推测缓存结构,包括检索缓存和StreamingLLM缓存。

实验

在实证评估部分,研究团队展示了TriForce在不同硬件配置下对长序列生成的加速能力。实验结果表明,在A100 GPU上,TriForce为Llama2-7B-128K模型实现了高达2.31倍的速度提升。而在两个RTX 4090 GPU上,通过卸载设置,TriForce实现了7.78倍的速度提升,将每个token的生成时间降至0.108秒,仅是A100 GPU上自回归基线的一半。

在 A100 GPU 上的本地实验结果。给出了 TriForce 与 StreamingLLM 方法(Naive Policy)的比较,包括不同采样温度下的速度提升和接受率


除了速度提升,TriForce在处理更长上下文和不同温度设置下也展现了出色的扩展性和稳健性。实验数据显示,随着上下文长度的增加,TriForce能够保持高接受率,理论上甚至可以达到13.1倍的速度提升。即使在温度参数设置为1.0的情况下,TriForce的接受率仍然能够保持在0.9以上,显示了其在不同条件下的稳定性和可靠性。TriForce在处理大批量数据时同样表现出色,实验结果显示,在批量大小为六的情况下,每个样本包含19K上下文,TriForce能够实现1.9倍的效率提升。

(a) KV缓存预算对加速和接受率的影响
图6(a)展示了不同KV缓存预算对加速比和接受率的影响。实验结果揭示了一个重要发现:当KV缓存预算设置为4K时,可以在保持高接受率的同时,平衡草稿阶段的开销。这意味着,4K缓存预算是最优选择,它在加速模型推理和维持解码质量之间找到了一个平衡点。增加缓存预算超过4K,虽然可能进一步提高接受率,但对整体性能的提升贡献有限,反而可能增加计算和内存的负担。
(b) KV缓存块大小的选择
图6(b)探讨了在给定4K缓存预算下,KV缓存块大小对性能的影响。结果表明,过小的块大小可能导致过度拟合个别token,损害了对未来token的泛化能力。相反,过大的块大小可能会使高得分token的重要性被周围低得分token所抵消,从而限制了在有限缓存预算下的选择多样性。因此,选择合适的块大小对于实现高效的缓存利用和保持解码步骤的多样性至关重要。
(c) 与基于树的推测解码的兼容性
图6(c)说明了TriForce与基于树的推测解码方法(如Sequoia和Independent Sequences)的兼容性。这些方法通过使用多个候选来提高接受率让更多的token被接受。当TriForce与这些树状结构结合时,可以利用更大的推测预算,提高目标模型每个解码步骤生成的理论平均token数量。这表明TriForce不仅可以独立提高性能,还可以与其他先进的推测技术相结合,进一步提升LLMs的推理效率。

研究团队还进行了详细的分析和消融研究,以确定KV缓存预算和块大小对系统性能的影响。实验结果表明,4K的KV缓存预算是最有效的设置,能够平衡高接受率和减少额外草稿开销之间的关系。同时,对于4K的KV缓存预算,选择适当的块大小对于性能至关重要,过小或过大的块大小都可能影响性能。

TriForce通过利用注意力稀疏性和上下文局部性,有效地缓解了KV缓存和模型权重的双重瓶颈,显著提高了长上下文服务的效率。其在不同硬件配置上的实验结果证明了TriForce在加速长序列生成方面的潜力,有望为长上下文模型的服务带来革命性的变革。

论文链接:https://arxiv.org/abs/2404.11912

GitHub 地址:https://github.com/Infini-AI-Lab/TriForce

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

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

相关文章

1867java银证转账系统系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java银证转账系统系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&a…

go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证

什么是JWT JWT,全名为JSON Web Token&#xff0c;是当下主流的一种服务端通信认证方式&#xff0c;具有轻量,无状态的特点&#xff0c;它实现了让我们在用户与服务器之间传递安全可靠的Json文本信息&#xff0c;它的使用过程主要是这样的&#xff1a; 当用户注册的时候&#x…

【百万字详解Redis】集群

文章目录 一、集群模式概述1.1、什么是集群模式1.2、集群模式特点1.3、集群工作方式 二、集群模式的搭建2.1、搭建前的准备2.2、修改集群配置2.3、启动redis服务2.4、创建集群2.5、查看redis服务状态2.6、进入一个节点2.7、测试操作 三、集群操作3.1、主从切换3.2、从节点操作3…

【Python】解决Python报错:ValueError: not enough values to unpack (expected 2, got 1)

​​​​ 文章目录 引言1. 错误详解2. 常见的出错场景2.1 函数返回值解包2.2 遍历含有不同长度元组的列表 3. 解决方案3.1 检查和调整返回值3.2 安全的解包操作 4. 预防措施4.1 使用异常处理4.2 单元测试 结语 引言 在Python编程中&#xff0c;ValueError 是一个常见的异常类…

2024年如何通过完善的工程化,从0到1手把手建立个人 react 组件库

本文聚焦于快速创建并部署个人的组件库&#xff0c;方便平时开发中将通用的组件抽出&#xff0c;也可用于简历上展示个人的组件成果~ 组件库体验地址&#xff1a;components-library 关于以上内容&#xff0c;你是否好奇如何实现的&#xff0c;对于大多数项目&#xff0c;诸如…

【C语言】预处理详解(上卷)

前言 预处理也是C语言中非常重要的存在。那么就详细地来了解一下吧。 预定义符号 C语言设置了一些预定义符号&#xff0c;可以直接使用&#xff0c;预定义符号也是在预处理期间处理的。 1 __FILE__ //进行编译的源文件 2 __LINE__ //文件当前的…

JavaSE——抽象类和接口

目录 一 .抽象类 1.抽象类概念 2.抽象类语法 3.抽象类特性 4.抽象类的作用 二. 接口 1.接口的概念 2.语法规则 3.接口的使用 4.接口特性 5.实现多个接口 6.接口间的继承 三.抽象类和接口的区别 一 .抽象类 1.抽象类概念 在面向对象的概念中&#xff0c;所有的对…

python -- series和 DataFrame增删改数据

学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列 注意:本文用到的数据集在文章顶部 1.1 直…

微信小程序 map

组件 地图个性化样式组件是腾讯位置服务为开发者提供的地图高级能力&#xff0c;开发者可以在法律允许的范围内定制地图风格&#xff0c;支持定制背景面、背景线、道路、POI等地图元素颜色、显示层级等内容&#xff1b;支持按照类型精细化管理POI的显示、隐藏&#xff1b;灵活…

JMS VS AMQP

JMS&#xff08;Java Message Service&#xff09;是一个为Java平台设计的API&#xff0c;主要针对Java开发者提供了一套用于企业级消息服务的标准接口。而AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;是一个应用层协议&#xff0c;它提供了一个开放的、标准…

BUG解决: Zotero 文献GBT7714无法正常调用

1. 下载csl文件 网上有推荐直接下载现成版本的&#xff0c;比如参考资料【1】的蓝奏云文件&#xff0c;但是还是无法实现功能&#xff08;空文档中可以用了&#xff09;。 2. Github版本 也有说网盘版本和那个 Juris-M 的 CSL bug 太多的。 总结 后面发现&#xff0c;只需…

带池化注意力 Strip Pooling | Rethinking Spatial Pooling for Scene Parsing

论文地址:https://arxiv.org/abs/2003.13328 代码地址:https://github.com/houqb/SPNet 空间池化已被证明在捕获像素级预测任务的长距离上下文信息方面非常有效,如场景解析。在本文中,我们超越了通常具有N N规则形状的常规空间池化,重新思考空间池化的构成,引入了一种…

对比深度图聚类的硬样本感知网络

Hard Sample Aware Network for Contrastive Deep Graph Clustering 文章目录 Hard Sample Aware Network for Contrastive Deep Graph Clustering摘要引言方法实验结论启发点 摘要 本文提出了一种名为Hard Sample Aware Network (HSAN)的新方法&#xff0c;用于对比深度图聚类…

Git+Gitlab 远程库测试学习

Git远程仓库 1、Git远程仓库 何搭建Git远程仓库呢&#xff1f;我们可以借助互联网上提供的一些代码托管服务来实现 Gitee 码云是国内的一个代码托管平台&#xff0c;由于服务器在国内&#xff0c;所以相比于GitHub&#xff0c;码云速度会更快 码云 Gitee - 基于 Git 的代码托…

Python实现连连看9

&#xff08;2&#xff09;标识选中的图片 在判断出玩家选中的是哪一张图片之后&#xff0c;接下来就可以标识选中的图片了&#xff0c;即在该选中的图片外围画矩形。代码如下所示。 FIRSTCLICK True #FIRSTCLICK是全局变量 if(click_col>0 and click_row>0) and \(no…

【进程调度的基本过程】初步认识进程和线程的区别与联系:计算机是如何工作的

​ &#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【Java】登神长阶 史诗般的Java成神之路 &#x1f43a;一.冯诺依曼体系结构 认识计算机的祖师爷 -- 冯诺依曼 冯诺依曼&#xff08;John von Neumann&#xff0c;1903年12⽉28⽇-1957年2⽉8⽇&…

调用华为API实现语音合成

目录 1.作者介绍2.华为云语音合成2.1 语音合成介绍2.2 华为语音合成服务2.3 应用场景 3. 实验过程以及结果3.1 获取API密钥3.2 调用语音合成算法API3.3 实验代码3.4 运行结果 1.作者介绍 袁斌&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究…

SpringBoot整合Skywalking

下载Java Agent 官网&#xff1a;https://skywalking.apache.org/downloads/ 提示&#xff1a;Agent最好到网上找一找之前的版本&#xff0c;新版本可能有bug&#xff0c;如果出现了并且网上也几乎没有这个版本的解决方法那么就切换之前的版本 本地启动时 -javaagent:d:\opt\…

建筑特种工高处作业吊篮安装拆卸工题库

1、施工现场外租吊篮设备&#xff0c;在施工前应由( )编制专项施工方案&#xff0c;并由( )技术负责人和现场总监理工程师签字后实行。 A 使用单位 使用单位 B 使用单位 租赁单位 C 租赁单位 使用单位 D 租赁单位 租赁单位 2、施工现场外租吊篮…

java基础语法整理 ----- 上

java基础语法 一、变量二、数据类型三、标识符四、键盘录入五、判断语句1. 三种格式2. 练习题 六、switch语句七、循环八、循环控制语句九、方法 一、变量 1.什么是变量&#xff1a; 在程序运行过程中&#xff0c;其值可以发生改变的量从本质上讲&#xff0c;变量是内存中的一…