从研究到生产:在 Vertex 上使用 EAGLE-3 加速开源 LLM

TL;DR:推测性解码可提升 LLM 推理速度,但传统方法需要单独的低效草稿模型。Vertex AI 利用 EAGLE-3,在内部层添加了较小的草稿头(目标模型的 2-5%),从而简化了训练并实现了约 2 倍到 3 倍的解码速度提升。这篇博文概述了我们使用 SGLang 在 Vertex AI 上大规模进行数据清理、嵌入、训练和提供 EAGLE-3 的流水线。
阅读时间: 10 分钟
对于使用 LLM 的人来说,一次只能处理一个 token 的瓶颈是一个熟悉的挑战。标准自回归生成本质上是顺序的。这会创建一个经典的内存受限进程,该进程的速度不是由计算决定的,而是由每个步骤从内存中读取大量模型权重所需的时间决定的,从而导致 GPU 核心利用不足。

解决方案是推测解码。这种优化技术通过引入草稿机制,加快了大型 LLM(目标模型)一次生成一个 token 的缓慢顺序过程。

这种草稿机制可快速一次性提出多个下一个 token。然后,大型目标模型会在单个并行批次中验证这些提议。它会接受来自自身预测的最长匹配前缀,并从该新点继续生成。

但并非所有草稿机制都一样。传统的草稿-目标方法使用单独的较小 LLM 模型作为起草者,这意味着您必须托管和管理更多服务资源,从而产生额外费用。

流程图:使用草稿目标方法的示例。提示“旧金山是”会引导系统执行以下两个步骤:1. 草稿模型会生成一个连续的词法单元链(词法单元为:“a”“city”“in”),并且 2. 目标模型会验证并选择预期的草稿令牌(令牌为“a”“city”“in”,其中“in”令牌会被模型拒绝),否则会生成新令牌(令牌为“a”“city”“known”)。这两个步骤的结果会汇聚成最终输出“旧金山是一座以...而闻名的城市”。

点击即可放大图片

这正是 EAGLE-3(外推注意力引导学习)的用武之地。EAGLE-3 是一种更高级的方法。 它不会使用完全独立的模型,而是将极其轻量级的“草稿头”(仅占目标模型大小的 2-5%)直接附加到其内部层。此头在特征级和令牌级运行,从目标模型的隐藏状态提取特征,以推断和预测未来的令牌树。

结果如何呢?在消除训练和运行第二个模型的开销的同时,获得推测性解码的所有优势。

与训练和维护一个单独的、具有数十亿参数的草稿模型这一复杂且资源密集型任务相比,EAGLE-3 的方法效率更高。您只需训练一个轻量级“草稿头”(仅占目标模型大小的 2% 到 5%),该草稿头会作为一部分添加到现有模型中。这种更简单、更高效的训练流程可为 Llama 70B 等模型带来显著的 2 倍到 3 倍解码性能提升(具体取决于工作负载类型,例如多轮对话、代码、长上下文等)。

流程图:使用 EAGLE-3 方法的示例。提示“旧金山是”会引导到包含多个层的 EAGLE-3 目标模型。嵌入层流入解码器和隐藏层,然后流入 EAGLE-3 头。EAGLE-3 头部层拆分为两个令牌链(“a”“city”“in”和“a”“city”“known”),这两个令牌链会直接返回到嵌入层。经过验证的词法单元“a”“city”和“known”流入最终输出结果:“San Francisco is a city known”。

点击即可放大图片

不过,即使是这种简化的 EAGLE-3 方法,从纸面到可大规模投入生产的云服务,也需要经历一段真正的工程之旅。本文将分享我们的技术流水线、关键挑战以及我们在这一过程中学到的宝贵经验。

挑战 1:准备数据

EAGLE-3 头需要训练。显而易见的第一步是获取可公开访问的通用数据集。这些数据集中的大多数都存在挑战,包括:

  • 严格的使用条款:这些数据集是使用不允许将其用于开发与原始提供商竞争的模型的模型生成的。
  • PII 污染:其中一些数据集包含大量 PII,包括姓名、位置信息,甚至财务标识符。
  • 无法保证质量:某些数据集仅适用于一般“演示”用例,但无法最好地满足真实客户的专业工作负载需求。

无法直接使用这些数据。

课程 1:构建合成数据生成流水线

一种解决方案是构建合成数据生成流水线。我们会根据客户的使用情形选择合适的数据集,不仅要保证数据质量,还要确保数据集与客户的生产流量最匹配,以适应各种不同的工作负载。然后,您可以仅从这些数据集中提取用户提示,并应用严格的 DLP(数据泄露防护)和 PII 过滤。这些清理后的提示会应用聊天模板,对其进行分词,然后将其馈送到目标模型(例如Llama 3.3 70B)来收集其回答。

这种方法可提供目标生成的数据,这些数据不仅合规且干净,而且与模型的实际输出分布高度匹配。这非常适合训练选秀热门人选。

线性流程图,描绘了合成数据生成流水线。用户提示是从原始数据中提取的,经过清理和过滤。使用聊天模板和分词器对清理后的提示进行分词。然后,系统会使用已分词的提示与目标模型结合生成回答,目标模型会返回生成的回答词元。

点击即可放大图片

难题 2:设计训练流水线

另一个关键决策是如何向 EAGLE-3 头提供训练数据。您有两条不同的途径:在线训练(即“即时生成”嵌入)和离线训练(即“在训练之前生成”嵌入)。

在本例中,我们选择了离线训练方法,因为与在线训练相比,它所需的硬件少得多。此过程涉及在训练 EAGLE-3 头之前预先计算所有特征和嵌入内容。我们将它们保存到 GCS,然后它们会成为轻量级 EAGLE-3 头的训练数据。获得数据后,训练本身会很快。鉴于 EAGLE-3 头部的尺寸非常小,使用原始数据集进行初始训练大约需要在一台主机上花费一天时间。不过,随着数据集规模的扩大,训练时间也相应增加,现在需要几天时间。

线性流程图,描绘了训练流水线。系统会使用分词后的提示和生成的回答令牌,通过目标模型生成特征和嵌入内容,然后返回令牌和特征。这些令牌和特征用于训练具有 Draft 模型的 EAGLE 头,该模型会返回训练后的 EAGLE 头。

点击即可放大图片

此过程让我们学到了两点不可忽视的经验,您需要牢记在心。

第 2 课:聊天模板不是可选的

在训练指令调优模型时,我们发现当聊天模板不正确时,EAGLE-3 的性能可能会有很大差异。您必须应用目标模型的特定聊天模板(例如,在生成特征和嵌入之前,请先对 Llama 3 进行 token 化。如果您只是连接原始文本,则嵌入内容会不正确,并且您的头会学习预测错误的分布。

第 3 课:注意遮罩

在训练期间,模型会同时接收提示和回答表示形式。但 EAGLE-3 头应该只学习预测回答表示。您必须在损失函数中手动遮盖提示部分。如果您这样做,模型头会浪费容量来学习预测已给出的提示,从而导致性能下降。

显示损失掩码示例的图表。“San Francisco is a city known”这一短语分为两部分:已知令牌(“San”“Francisco”“is”),在损失掩码中以零表示;需要预测的令牌(“a”“city”“known”),在损失掩码中以 1 表示。

点击即可放大图片

挑战 3:提供服务和扩缩

在训练好 EAGLE-3 头部后,我们进入了提供阶段。此阶段带来了巨大的规模化挑战。以下是我们总结出的关键经验。

第 4 课:服务框架至关重要

通过与 SGLang 团队密切合作,我们成功将 EAGLE-3 投入生产,并实现了最佳性能。从技术角度来看,这是因为 SGLang 实现了一个关键的树注意力内核。此特殊内核至关重要,因为 EAGLE-3 会生成一个可能的“草稿树”(而不仅仅是一个简单的链),而 SGLang 的内核专门设计用于在单个步骤中并行验证所有这些分支路径。否则,您将错失提升效果的机会。

第 5 课:不要让 CPU 成为 GPU 的瓶颈

即使使用 EAGLE-3 加速 LLM 后,您也可能会遇到另一个性能瓶颈:CPU。当 GPU 运行 LLM 推理时,未优化的软件会在 CPU 开销(例如内核启动和元数据簿记)上浪费大量时间。在正常的同步调度程序中,GPU 运行一个步骤(例如 Draft),然后在 CPU 执行其簿记并启动下一个 Verify 步骤时处于空闲状态。这些同步气泡会累积起来,浪费大量宝贵的 GPU 时间。

正常同步调度器的示例。每个步骤按顺序呈现,并显示每个步骤所花费的时间:草稿 (10 毫秒)、验证 (15 毫秒)、扩展 (10 毫秒)、同步 CPU (5 毫秒)、草稿 (10 毫秒) 和验证 (15 毫秒)。“同步 CPU”步骤以不同颜色突出显示,表示在 CPU 开销上花费的未优化时间。

点击即可放大图片

我们通过使用 SGLang 的零开销重叠调度器解决了这个问题。此调度程序专门针对推测性解码的多步草稿 -> 验证 -> 草稿扩展工作流进行了调整。关键在于重叠计算。当 GPU 忙于运行当前的验证步骤时,CPU 已经并行工作,为下一个草稿草稿扩展步骤启动内核。这可确保 GPU 的下一个作业始终处于就绪状态,从而消除空闲气泡。为此,我们使用 FutureMap(一种智能数据结构,可让 CPU 在 GPU 仍在工作时准备下一批数据)。

零开销重叠调度器示例。大多数步骤和时间都与上图相同,但“同步 CPU”步骤被一个较小的步骤取代,该步骤表示写入和读取步骤同时发生,每个步骤需要 0.1 毫秒才能完成。

点击即可放大图片

通过消除这种 CPU 开销,重叠调度器可全面提升 10% 到 20% 的速度。这证明,出色的模型只是成功的一半;您还需要能够跟上节奏的运行时。

基准测试结果

这段旅程是否值得?当然可以。

我们使用 SGLang 和 Llama 4 Scout 17B Instruct 对训练后的 EAGLE-3 头与非推测性基准进行了基准比较。我们的基准比较结果显示,根据工作负载类型的不同,解码延迟缩短了 2 倍到 3 倍,吞吐量也显著提升

如需查看完整详情,请使用我们的全面笔记本自行进行基准比较。

指标 1:每个输出 token 的中位时间 (TPOT)

折线图,描绘了每个输出 token 的时间 (TPOT) 与并发性之间的关系,并注明了数值越低越好。Y 轴表示以毫秒为单位的中位 TPOT,而 X 轴表示最大并发数。该图显示了两条线,分别代表基准结果和 EAGLE 的结果,其中基准结果始终高于 EAGLE 的结果。两条线都从图表的左下角附近开始,并随着最大并发数的增加而呈上升趋势,其中基准结果在图表边缘附近呈现更明显的上升趋势。

点击即可放大图片

此图表显示了 EAGLE-3 更好的延迟时间性能。每个输出令牌的时间 (TPOT) 图表显示,在所有测试的并发级别下,EAGLE-3 加速模型(绿线)始终比基准模型(蓝线)实现了更低的(更快的)延迟时间。

指标 2:输出吞吐量

折线图,描绘了令牌吞吐量与并发性之间的关系,并注明了值越高越好。Y 轴表示每秒令牌数吞吐量,而 X 轴表示最大并发数。该图表显示了两条线,分别代表基准结果和 EAGLE 的结果。EAGLE 结果得分始终高于基准结果。两条线均从左下角开始,并随着最大并发数的增加而向上变化,其中 EAGLE 结果的变化率比基准结果更平稳、更显著。

点击即可放大图片

此图表进一步突显了 EAGLE-3 的吞吐量优势。“令牌吞吐量与并发性”图表清楚地表明,EAGLE-3 加速模型(绿线)始终大幅优于基准模型(蓝线)。

虽然对于更大的模型,类似的观察结果也成立,但值得注意的是,与其他性能指标相比,第一个 token 的时间 (TTFT) 可能会增加。此外,这些性能因任务而异,如以下示例所示:

条形图,比较了基准模型与使用 Vertex AI 训练的 EAGLE-3 加速模型在各个类别中的输出速度。在所有类别(代码、聊天、长上下文、数学和多语言)中,EAGLE-3 模型的输出速度都远高于基准模型。

点击即可放大图片

结论:现在轮到您了

EAGLE-3 不仅仅是一个研究概念,更是一种可用于生产环境的模式,可将解码延迟时间缩短一半。但要实现大规模应用,需要付出真正的工程努力。如需为用户可靠地部署此技术,您必须:

  1. 构建合规的合成数据流水线。
  2. 正确处理聊天模板和损失掩码,并在大规模数据集上训练模型。

在 Vertex AI 上,我们已经为您简化了整个流程,提供了一个经过优化的容器和基础设施,旨在扩缩基于 LLM 的应用。如需开始使用,请参阅以下资源:

感谢您的阅读

欢迎您就 Vertex AI 向我们提供反馈和提出问题。

致谢

我们要向 SGLang 团队(尤其是 Ying Sheng、Lianmin Zheng、Yineng Zhang、Xinyuan Tong、Liangsheng Yin)以及 SGLang/SpecForge 团队(尤其是 Shenggui Li、Yikai Zhu)表示衷心的感谢,感谢他们在整个项目过程中提供的宝贵支持。 他们慷慨的帮助和深入的技术见解对本项目的成功至关重要。