EAGLE-2:通过动态草稿树加速语言模型推理

温馨提示:
本篇文章已同步至"AI专题精讲" EAGLE-2:通过动态草稿树加速语言模型推理

摘要

现代 Large Language Models(LLMs)的推理过程既昂贵又耗时,而 speculative sampling 已被证明是一种有效的解决方案。大多数 speculative sampling 方法(例如 EAGLE)使用静态的 draft tree,并默认 draft token 的接受率仅依赖于其位置。有趣的是,我们发现 draft token 的接受率也依赖于上下文。本文在 EAGLE 的基础上提出了 EAGLE-2,该方法引入了一种新的 上下文感知动态 draft tree 技术用于 draft 建模。该改进利用了 EAGLE 的 draft 模型良好校准的特点:draft 模型的置信得分可以以较小误差逼近 token 的接受率。我们在三个系列的 LLM 和六个任务上进行了广泛评估,EAGLE-2 达到 3.05× 到 4.26× 的加速比,比 EAGLE-1 快 20%-40%。EAGLE-2 同时确保生成文本的分布保持不变,因此是一种 无损加速算法

1. 引言

现代 Large Language Models(LLMs)(OpenAI, 2023;Touvron 等,2023)展现出了惊人的能力,并被广泛应用于各类场景。然而,其参数规模已大幅增长,甚至超过千亿。在自回归生成过程中,每生成一个 token 都需要访问全部模型参数。一次对话中可能会生成数百到数千个 token,这使得 LLM 推理过程既慢又昂贵Speculative sampling方法(Leviathan 等,2023;Chen 等,2023a)旨在解决这一问题,其核心思想是快速生成一批 draft token,并并行验证这些 token。通过在单次前向传播中生成多个 token,这些方法显著减少了推理延迟。
在这里插入图片描述

标准的 speculative sampling 方法(Leviathan et al., 2023;Chen et al., 2023a)使用链式结构的 draft。为了提高被接受的 token 序列长度,近期的 speculative sampling 工作引入了树状结构的 draft。Sequoia(Chen et al., 2024)显式地假设 draft token 的接受率仅依赖于其在树中的位置。EAGLE(Li et al., 2024b)和 Medusa(Cai et al., 2024)在所有上下文中使用相同的静态 draft tree 结构:在 draft 阶段的第 i 步,添加 k 个候选 token,且 k 为固定值。这种做法隐含地采纳了上述假设。然而,这一假设似乎与 speculative sampling 的基本直觉相矛盾:某些 token 更容易预测,较小的模型就能准确地预测它们。我们的实验(见第 3.1 节)表明,draft token 的接受率不仅依赖于其位置,还高度依赖于上下文。因此,静态 draft tree 结构存在内在的局限性。根据不同上下文中 draft token 的接受率动态调整 draft tree 的结构,能够取得更好的效果。
在这里插入图片描述
然而,获取 draft token 的接受率需要原始 LLM 的前向计算结果,这与 speculative sampling 减少原始 LLM 前向调用次数的目标相冲突。幸运的是,我们发现 EAGLE 的置信度校准效果良好:draft 模型的置信分数(即概率)可以很好地近似 draft token 的接受率(见第 3.2 节)。这使得基于上下文的动态 draft tree 结构成为可行的选择。

我们提出 EAGLE-2,该方法利用 draft 模型的置信分数来近似接受率。在此基础上,它动态调整 draft tree 的结构,从而提升被接受的 token 数量。我们在六个任务上进行了全面且广泛的测试:多轮对话、代码生成、数学推理、指令跟随、文本摘要以及问答任务。所使用的数据集包括:MT-bench(Zheng et al., 2023)、HumanEval(Chen et al., 2021)、GSM8K(Cobbe et al., 2021)、Alpaca(Taori et al., 2023)、CNN/Daily Mail(Nallapati et al., 2016)以及 Natural Questions(Kwiatkowski et al., 2019)。对比方法涵盖了六种先进的 speculative sampling 技术:标准 speculative sampling(Leviathan et al., 2023;Chen et al., 2023a;Joao Gante, 2023)、PLD(Saxena, 2023)、Medusa(Cai et al., 2024)、Lookahead(Fu et al., 2023)、Hydra(Ankner et al., 2024)以及 EAGLE(Li et al., 2024b)。实验基于三类 LLM 系列:Vicuna、LLaMA2-Chat 和 LLaMA3-Instruct。

在所有实验中,EAGLE-2 表现最佳,取得了 2.5 倍到 5 倍的加速效果。图 1 和图 2 展示了 EAGLE-2 与其他 speculative sampling 方法在 MT-bench 上的加速比。MT-bench 是一个多轮对话数据集,非常贴近 ChatGPT 等模型的真实应用场景,并被广泛用于评估最先进的开源或闭源模型。在 MT-bench 数据集上,EAGLE-2 的速度大约是 Medusa 的 2 倍,约为 Lookahead 的 2.3 倍,同时确保输出分布保持不变。

除了性能表现之外,EAGLE-2 还具有以下优势:

  • 开箱即用。相比 EAGLE,EAGLE-2 无需训练任何额外的模型。它不需要训练一个单独的模型来预测 draft tree 结构,而是基于 draft 模型的置信分数动态调整 draft tree 结构,这一点对于 speculative sampling 至关重要。因此,EAGLE-2 完全无需额外训练。

  • 可靠性。EAGLE-2 不对原始 LLM 的参数进行微调或更新,也不会放宽 token 的接受条件。这确保了生成文本的分布与原始 LLM 完全一致,并且在理论上是可证的。

2. 预备知识

2.1. 推测式采样

Speculative sampling(Leviathan 等,2023;Chen 等,2023a;Sun 等,2024c;2024b)的核心思想是“先起草,后验证”:先快速生成一个可能正确的草稿,然后检查草稿中哪些 token 是可以接受的。我们用 tit_iti 表示第 i 个 token,用 Ta:bT_{a:b}Ta:b 表示从$ t_a$ 到 tbt_btb的 token 序列,即 ta,ta+1,⋅⋅⋅,tbt_a, t_{a+1}, ···, t_bta,ta+1,⋅⋅⋅,tb。Speculative sampling 在草稿生成阶段与验证阶段之间交替进行。
在这里插入图片描述

设有前缀 T1:jT_{1:j}T1:j,在草稿生成阶段,speculative sampling 使用一个草稿模型(比原始 LLM 更小的模型)以 T1:jT_{1:j}T1:j 为前缀,自回归地生成一个草稿序列 T^j+1:j+k\hat{T}_{j+1:j+k}T^j+1:j+k,同时记录每个 token 的概率 p^\hat{p}p^

在验证阶段,speculative sampling 调用原始 LLM 来检查草稿 T^j+1:j+k\hat{T}_{j+1:j+k}T^j+1:j+k,并记录其对应的概率 ppp。然后,speculative sampling 从前往后依次决定草稿中每个 token 的接受与否。对于第 j+ij+ij+i 个草稿 token t^j+i\hat{t}_{j+i}t^j+i,它被接受的概率为:min⁡(1,pj+i(t^j+i)/p^j+i(t^j+i))\operatorname* { m i n } ( 1 , p _ { j + i } ( \hat { t } _ { j + i } ) / \hat { p } _ { j + i } ( \hat { t } _ { j + i } ) )min(1,pj+i(t^j+i)/p^j+i(t^j+i)),如果该 token 被接受,则继续检查下一个;否则,从分布 norm(max⁡(0,pj+i−p^j+i))\text{norm}(\max(0, p_{j+i} - \hat{p}_{j+i}))norm(max(0,pj+ip^j+i)) 中重新采样一个 token 来替换 t^j+i\hat{t}_{j+i}t^j+i,并丢弃草稿中其后的所有 token。Leviathan 等(2023)在其附录 A.1 中证明了 speculative sampling 与标准自回归解码的分布是一致的。EAGLE 和 EAGLE-2 都遵循这一框架。

2.2 EAGLE

EAGLE(Li 等,2024b)是对 speculative sampling 的一种改进方法。在本工作提交时,EAGLE 在 Spec-Bench(Xia 等,2024)上排名第一。Spec-Bench 是一个为评估不同场景下的 speculative decoding 方法而设计的全面基准测试。

草稿生成阶段(Drafting Stage)
与标准的 speculative sampling 使用自回归方式预测 token 序列不同,EAGLE 在更结构化的特征层级(即在 LM Head 之前的特征层)上进行自回归生成,然后再使用原始 LLM 的 LM Head 获取草稿 token。
由于该采样过程会在特征序列中引入不确定性,为了解决这一问题,EAGLE 还向草稿模型输入一个提前一步的 token 序列,如图 3a 所示。

验证阶段(Verification Stage)
在标准的 speculative sampling 中,草稿结构是链式的(chain-structured),这意味着一旦某个草稿 token 被拒绝,其后所有 token 都必须被丢弃。而 EAGLE 使用树结构的草稿(tree-structured draft),当某个草稿 token 被拒绝时,可以尝试其它的备选分支。图 3b 展示了两者之间的区别。
在这里插入图片描述
EAGLE 与 EAGLE-2 的区别
EAGLE 的草稿树结构是固定的,在草稿生成阶段会填充对应的位置。EAGLE-2 的目标是在此基础上进一步改进,通过引入可动态调整的草稿树来增强生成能力。图 4 以一个简单的示例说明了 EAGLE 与 EAGLE-2 之间的差异。

3. 观察结果

3.1 依赖上下文的接受率

首先,我们评估了使用动态草稿树的必要性,这取决于草稿token的接受率是否仅与其在草稿树中的位置相关。我们在 Alpaca 数据集和 Vicuna 7B 模型上测试了不同位置的草稿token的接受率,结果如图 5 所示。总体来看,草稿token的接受率确实与位置有关:位置 P1 的接受率最高,位置 P6 的接受率最低。草稿树左上方(如位置 P1)的token接受率较高,而右下方(如位置 P6)的接受率较低。这也解释了为什么静态草稿树(如 EAGLE 和 Medusa 中使用的)在左上方节点较多、右下方节点较少的设计合理性。然而,我们还观察到相同位置的接受率存在显著差异,这表明草稿token被接受的概率不仅依赖位置,还与上下文有关。这提示我们,基于上下文的动态草稿树比静态草稿树具有更大的潜力。
在这里插入图片描述

3.2 草稿模型的良好校准性

为了应用动态草稿树,我们需要一种低成本的方法来估计草稿令牌的接受率,而无需调用原始 LLM。我们在 Alpaca 数据集上进行了实验,探究草稿模型的置信度分数(即 LLM 对每个 token 输出的概率)与接受率之间的关系。如图 6 所示,草稿模型的置信度分数与令牌的接受率之间呈现出强正相关关系。例如,置信度分数低于 0.05 的草稿令牌,其接受率约为 0.04;而置信度分数高于 0.95 的令牌,其接受率约为 0.98。因此,我们可以使用草稿模型的置信度分数来估计接受率,无需额外开销,从而支持对草稿树的动态调整。在其他方法的草稿模型中,如 GLIDE 和 CAPE(Du 等人,2024),也观察到了类似的现象。

4. 基于上下文的动态草稿树

基于上述观察结果,我们提出 EAGLE-2,这是一种用于 LLM 推理加速的算法,它能够动态调整草稿树结构。EAGLE-2 不改变草稿模型的训练与推理过程,也不影响验证阶段,其改进主要体现在两个方面:如何扩展草稿树(见第 4.1 节)以及如何对草稿令牌重新排序(见第 4.2 节)。在扩展阶段,我们将当前草稿树最新一层中最有希望被接受的节点输入草稿模型,以生成下一层草稿令牌;在重新排序阶段,我们选择接受概率更高的令牌,作为传入原始 LLM 的验证输入。

在草稿树中,每个节点代表一个 token。下文中,“节点”和“token”将交替使用。
在这里插入图片描述

4.1 扩展阶段

得益于树状注意力机制(tree attention),草稿模型可以同时输入当前层的所有 token,并在一次前向传播中计算出下一步 token 的概率,从而实现对当前层所有 token 的扩展。然而,如果一次性输入太多 token,草稿模型的前向传播速度可能会下降;同时,草稿树每一层中的 token 数量会呈指数级增长。因此,我们需要对草稿树进行选择性扩展。

我们从当前层中选择全局接受概率最高的前 kkk 个 token 进行扩展。在 speculative sampling 中,如果一个草稿 token 被拒绝,则其后所有 token 都会被丢弃;一个 token 只有在其所有前缀都被接受的情况下才最终被接受。因此,token tit_iti全局接受率是从根节点到 tit_iti 路径上所有 token 的接受率的乘积。我们将其定义为值 ViV_iVi
Vi=∏tj∈Path(root,ti)pj≈∏tj∈Path(root,ti)cj,V _ { i } = \prod _ { t _ { j } \in \mathrm { P a t h } ( \mathrm { r o o t } , t _ { i } ) } p _ { j } \approx \prod _ { t _ { j } \in \mathrm { P a t h } ( \mathrm { r o o t } , t _ { i } ) } c _ { j } , Vi=tjPath(root,ti)pjtjPath(root,ti)cj,
其中,Path(root, titᵢti) 表示从根节点到草稿树中节点 titᵢti 的路径,pjpⱼpj 表示节点 tjtⱼtj 的接受率,cjcⱼcj 表示草稿模型对 $tⱼ $的置信度分数。第 3.2 节的实验表明,置信度分数与接受率之间存在显著的正相关关系。我们利用这一关系来近似估算该值。

从具有较高 V 值的 token 开始的分支更有可能被接受。因此,我们从最后一层中选择值最大的前 k 个节点作为草稿模型的输入,并根据其输出扩展草稿树。图 7 顶部展示了扩展阶段的流程。

4.2 重排序阶段

扩展阶段的目的是加深草稿树。由于接受率的取值范围在 0 到 1 之间,越深的 token,其值越低。一些未被扩展的浅层节点可能比已扩展的深层节点具有更高的值。因此,我们不会直接将扩展阶段选出的 token 作为最终草稿,而是对所有草稿 token 进行重排序,并选择值最高的前 m 个 token。一个节点的值始终小于或等于其父节点的值。对于值相同的节点,我们优先选择更浅层的节点。这样可以确保重排序后选出的前 m 个 token 仍然构成一棵连通的树。

随后,我们将这些被选中的 token 展平为一维序列,用作验证阶段的输入。为了确保与标准自回归解码保持一致,还需调整注意力掩码(attention mask)。在标准自回归解码中,每个 token 都可以看到其之前的所有 token,因此形成的是一个下三角的注意力矩阵。而在草稿树中,来自不同分支的 token 之间不应彼此可见,因此必须根据树的结构调整注意力掩码,确保每个 token 只能看到它的祖先节点。图 7 底部展示了重排序阶段的过程。

温馨提示:
阅读全文请访问"AI深语解构" EAGLE-2:通过动态草稿树加速语言模型推理

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

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

相关文章

防水防尘防摔性能很好的智能三防手机,还有22000mAh大电池

在电力巡检的崇山峻岭间,在野外地质勘探的风沙深处,在应急救援的急风骤雨里,传统智能设备因其固有的脆弱性与续航短板往往力不从心,甚至成为保障工作连续性的掣肘。而真正的智能三防手机应是一堵移动的堡垒,集坚不可摧…

Charles中文版抓包工具使用指南 提高API调试和网络优化效率

在现代开发过程中,调试API、捕获HTTP/HTTPS流量和优化应用的网络性能已经成为开发者的常见任务。尤其是在调试复杂的API接口和分析网络请求时,开发者需要一款高效且功能强大的工具。Charles抓包工具凭借其强大的网络调试功能和易用的操作界面&#xff0c…

【C#补全计划:类和对象(九)】接口

一、接口的概念1. 概念:接口是行为的抽象规范,也是一种自定义类型2. 接口声明规范:(1)不包含成员变量(2)只包含属性、方法、索引器、事件(3)成员不能被实现(4…

SRS简介及简单demo

SRS介绍 SRS(Simple Realtimes Server)是一款开源的实时流媒体服务器,专注于解决直播、实时互动等场景的流媒体传输问题。SRS 的设计目标是 “简单、稳定、高效”,专门针对实时流媒体协议(如 RTMP、HLS、HTTP-FLV、WebRTC 等)进行优化,专注于解决 “低延迟、高并发” 的…

python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法

1.beatuifulSoup 基本用法 beautifulSoup(简称bs4)是python的一个第三方库,用于解析html和xml文档中提取数据的python库。它能够将复杂的文档转化为树形结构,方便快速定位和提取所需数据以及查找和修改,常常与爬虫框架…

Ubuntu共享文件夹权限设置

在Ubuntu中设置共享文件夹的权限(只读、读写、无权限),主要通过两种方式实现:‌文件系统权限‌和‌Samba共享配置‌。以下是详细步骤:‌一、文件系统权限设置(基础权限)‌1. ‌修改文件夹所有权…

小程序点击菜单栏实现样式动态切换

小程序点击菜单栏背景样式动态切换 前言:今天做一个小程序项目,要做一个菜单栏动态切换的功能,因为这种需求很常见,这次干脆记录一下,帮助别人的同时,自己下次也可以直接照搬使用。 效果截图如下&#xff1…

掌握工程化固件烧录,开启你的技术进阶之路-FPGA ISE(xilinx)

1、电脑需先行安装ISE14.7。若已完成安装,此步骤可略过;若尚未安装,在后续章节会介绍如何安装ISE,由于ISE14.7的安装程序体量庞大,可借助U盘进行传输。同时,电脑需预留至少30G的存储空间以用于安装该程序。…

Android 之 面试八股文

​1.Activity生命周期​​​​问题​​:描述Activity从启动到销毁的完整生命周期方法,并说明onSaveInstanceState()的调用时机。​​参考答案​​:onCreate()→ onStart()→ onResume()(活跃状态) → onPause()&#x…

暴力解决MySQL连接失败

本文涉及清空root密码完全重置MySQL权限彻底卸载并重装MySQL请务必在测试/本地环境操作,生产环境慎用!场景Spring Boot项目连接MySQL一直报Access denied for user rootlocalhost,改密码、换驱动都没用?步骤1:完全重置…

前端开发:CSS(1)—— 什么是CSS?

本文用于记录前端开发的学习过程。前面我们已经学习了html的编写,知道了Web开发的一些最基本的知识;在html的学习过程中,我们提到关于样式的设计和修改常需要使用CSS来实现。那么CSS到底是什么东西呢?它又如何来设计样式呢&#x…

数据结构(4)—栈和队列

一、概念1.栈只允许在栈顶位置入栈和出栈元素,链表可以在任意位置插入和删除元素,栈和队列只允许在指定位置插入和删除元素2.链表、栈和队列都是一种线性结构(一对一),栈和队列是一种特殊的表状结构二、栈1.基础概念先…

vue2.如何给一个页面设置动态的name。不同路由使用一样的组件。页面不刷新怎么办?

page里面detail.vue export default { name: detail, } vue2里面.vue的页面都会设置一个name,这个通常是写死的。不能在页面动态设置的。页面刷新缓存通常都是根据这个name来判断的。如果name写死。我几个页面都通用这一个页面的话,他也不刷新页面啊。 比…

浮动IP(Floating IP)的删除通常需要满足什么条件

浮动IP(Floating IP)的删除通常需要满足什么条件在云计算或网络环境中,浮动IP(Floating IP)的删除通常需要满足一定的条件,以确保操作不会影响现有业务或导致网络中断。以下是常见的可删除浮动IP的场景和条…

机器学习之随机森林(Random Forest)实战案例

一、算法基础 首先,来介绍一下算法的基础语法 class sklearn.ensemble.RandomForestClassifier(\ n_estimators’warn’,\ criterion’gini’,\max_depthNone, \ min_samples_split2,\ min_samples_leaf1, \ min_weight_fraction_leaf0.0, \ max_features’auto’…

《C语言》指针练习题--1

《C语言》指针练习题–1 1. 交换两个整数的值 题目描述: 编写一个C程序,定义一个函数swap,使用指针参数交换两个整数的值。在main函数中调用该函数并输出交换后的结果。 解题思路: 为了交换两个整数的值,可以通过指针传…

应急响应整理

目录 windows下 1. 检查账号安全 利用注册表实现用户隐藏 粘滞键后门 2 检查异常端口、进程 3. 检查启动项、计划任务、服务 4. 日志分析-Windows 常见事件类型、登录类型 Linux下 1. 账号安全 2. 历史命令 3. 检查异常端口 4. 检查异常进程 5. 检查开机启动项 …

一文读懂 C# 中的 Bitmap

一文读懂 C# 中的 Bitmap 一、Bitmap 到底是什么? 二、推荐使用场景 三、实战 Demo 基础用法:加载、创建和保存 进阶用法 缩放图片 裁剪图片 颜色调整(反色处理) 四、核心方法和属性说明 常用函数 常用属性 五、避坑指南、注意事项 六、总结与决策 一文读懂 C# 中的 Bitmap…

预约时间组件

效果图如何使用<template><view><button click"pickerTime(0)">预约时间0</button><button click"pickerTime(1)">预约时间1</button><button click"pickerTime(2)">预约时间2</button><but…

Android 开发 - Service、Camera、Layout Design 自定义设备类型和大小

一、Service 启动 1、基本介绍 &#xff08;1&#xff09;startService()其他组件通过调用 startService() 启动 Service 后&#xff0c;Service 可在后台无限期运行&#xff0c;即使启动 Service 的组件被销毁也不受影响&#xff0c;一般情况下 startService() 是执行单一操作…