【生成式AI导论 2024】第16讲:可以加速所有语言模型生成速度的神奇外挂 — Speculative Decoding

Speculative Decoding加速语言模型生成技术解析

媒体详情

上传日期
2025-06-09 21:31
来源
https://www.youtube.com/watch?v=MAbGgsWKrg8
处理状态
已完成
转录状态
已完成
Latest LLM Model
gemini-2.5-pro-preview-06-05

转录

下载为TXT
speaker 1: 接下来呢我想跟大家分享一个语言模型生成的新的技术,叫做speculative的decoding。 哦,虽然我们说语言模型往往生成的时候不一定需要生成非常长的结果,所以用auto regressing也许就够了。 但是很多时候当你要生成长篇大论的时候,你也会觉得等待的时间非常的漫长。 有一个方法叫做speculative decoding,它可以加快任何的语言模型生成的速度。 这个方法跟你使使用的模型没有关系,这个方法不需要对模型做任何训练,它是一个神奇的外挂。 这个神奇的外挂可以加到任何语言模型上面,那个语言模型生成的速度就突然加快。 所非常神奇的方法值得跟大家介绍一下啊,那这个上面这个图呢是来自于下面这个连接了。 那这个的图就是要对比一下说拉马就3B的模型在没有speculative decline的时候,它生成的速度跟加上speculative decoding这个外挂之后它生成的速度。 你可以发现说speculative decoding它生成的速度大概可以到原来的两倍甚至到3倍左右。 那今天我们看到这个four生出来的结果生出来的结果搞不好它已经有用ecudec这种技术来加快原有语言模型生成的速度也说不定好,所以我们就来认识一下speculative decoding这个技术吧。 那speculative这个字的意思呢是猜测或投机的意思。 那speculative decoding这个方法的核心概念是什么呢? 我们说auto regressive model,它的痛点就是需要按部就班,循序渐进。 第一个token没生成之前,我们没办法生第二个token。 Speculative decoding核心的想法就是这个非常神奇。 我们能不能够找一个预言家,这个预言家他能够做的事情就是可以预判预言模型接下来的生成。 如果今天预言家他可以根据输入直接预判,说预言模型等一下就是会产生黄色的这个token,你就可以一次把输入跟输入加上黄色的token都丢给语言模型,让他做平行的预算,一次就可以产生两个token,就可以跳过over regression,他一定要升第一个token才能升第二个token。 这个问题先叫样预言家预测接下来要输出什么,你就可以直接让第二个token跟第二个token同时被产生出来。 那如果可以让第一个第二个to同时被产生出来,有什么样的好处呢? 你的好处就是你的速度马上就变成原来的两倍了。 你本来只能一次升一个token,一个第一个token升完才能够就要等着才能够生下一个token。 现在一次可以生两个token,生成的速度就变成原来的两倍。 那讲的更具体一点,整个speculative decline的运作方法是这个样子的。 当这个当这个输入蓝色的这个输入进来的时候,先赶快给预言家看。 然后预言家呢快速预测说接下来语言模型会先生红色的头肯,再生黄色的头肯。 那我们这边假设预言家的速度奇快无比,他做预言的时间是几乎可以忽略不计的。 而接下来呢预言家已经说接下来会生红色的token跟生黄色的token了。 所以呢我们就可以同时把输入输入加上红色的token,输入加上红色的token,加黄色的token,一次全部丢给语言模型。 让他直接预测自己接下来三步会产生什么样的东西。 好,他可以预测自己下一步会产生什么,他已经知道自己下一步会产生什么,这是预言家说的,加知道自己下下步要产生什么,预言家已经预测下一步跟下下步会产生什么,所语言模型可以直接预测下下下步会产生什么,所以下一步下下步跟下下下步这三步可以同时被生成出来。 那外人其实不知道里面有没有预言家,从外人的观点来看就是哇一次吐出三个偷Ken,速度变成原来的三倍。 本来一次只吐一个偷Ken,现在一次可以吐出三个偷Ken。 最以我们从外人看的这角度看,这个语言模型速度就变成原来的三倍。 讲到这边你一定会有一个很大的困惑,预言家如果这么厉害都可以预言,预言模型会输出什么? 那还要预言模型干嘛? 都叫预言家生成就好啦,直接用预言家生成就好了,干嘛还需要语言模型生成呢? 所以这边的问题就是预言家有可能会犯错,但是我们来看看如果预言家犯错的话会发生什么样的状况。 好,那我们现在假设预言家没有办法精准的预测语言模型的输出,他又不是语言模型,所以他有可能会预测错。 所以第一个token会生成红色的,是预测对的。 但第二个token他猜是灰色的这是错的,语言模型不会生出灰色的token。 好,但是没有关系,我们还不知道语言模型会生出什么,所以我们先相信语言家,把输入丢给语言模型,把输入加红色的token丢给语言模型,把输入加红色的token加灰色的token丢给语言模型。 所以语言模型同时输出三个token,但我们知道说预言家的第二个输出是错的,这个灰色的token是错的。 所以语言模型所输出的第三个token,绿色的这个token是不可信的。 因为输入本来就已经是错的啦,所以输出当然也不是对的。 但是就算是语就算是预言家犯了一个错误,就算是预言家的第二个token是错的。 语言模型只有前两个token是对的,你还是可以一次输出前两个token你还是有状哦,原来只能一次输出一个token,现在变成一次输出两个token,你还是有赚速度还是变成原来的两倍。 那这边问题在这边你可能会有的问题是,我们怎么知道预言家犯了错误呢? 我们怎么知道预言家他输出的是错的? 所以语言模型第三个输出的token不可信,不应该被当做最后的输出,只有第一个跟第二个token可以被输出呢? 怎么知道预言家是错的呢? 你就看语言模型真正输出的结果,再去比对预言家的输出,你就知道预言家是不是对的哦,所以在这些token被输入语言模型之前,我们不知道预言家做的怎么样。 但是当语言模型产生它的token之后,你就可以去跟预言家做比对哦,语言模型下一个token是红色的,下下个token是黄色的啊,你就知道预言家的下下个token是错的。 所以如果输入有下下个token,那输出就不要理他了,输出就有可能是错的。 只把肯定是对的部分拿出来给使用者来看,就算部分有错,预言就算预言家部分有错,最终速度上还是有赚到。 好,但是假设预言家烂到不行,他输出来的结果通通都是错的呢。 假设预言家很烂,很不幸的,他的预测完全都是错的哦。 所以当你把输入给预言模型,输入加预言家预测的下一个token,还有输入加预言家预测的下一个token跟下下个token都丢给预言模型的时候,只要有预言家的输出都不可信,只有这个结果是对的,那你至少可以输出一个token。 当你可以输出一个token的时候,整体来讲你几乎可以说是不赚不赔。 因为本来一样的时间你也只能够输出一个token啊,现在只是变成没有预言家的状态而已,那当然你还是损失一些东西啦。 那损失的是什么? 损失的就是首先你要等预言家预言哦,所以这是一些时间的浪费。 但是我们这边假设预言家就是要奇快无比,所以我们可以忽略预言家所耗费的时间。 当然你还有另外的损失,就是运算资源无谓的耗损。 你在这个地方的输入,它的输出,你在这个地方输入预言家的呃预言家预言的一个token,然后得到输出。 这边输入预言家预言的两个token得到的输出这些运算都是白费了,没用,没派上没派上用场。 但没关系,假设你真正在意的是时间,这边就是这个有这个方法,就是假设你不在意运算资源,真正在意的是时间,你就是用了运算资源来换取了你的时间。 好,那这个接下来的问题就是谁可以来担任预言家呢? 那我们来想一下预言家的特性,预言家的特性就是要超快快到它的产生的速度几乎可以忽略。 然后再来就是他偶尔犯错没有关系,因为最糟的状况就是他的输出全部都是错的,也就是不得不失而已。 好,所以谁可以来担任预言家呢? 也许auto regremodel可以来担任这个预言家。 记得我们讲auto regremodel时候说说它的特性,就是生成快,所有的所有的输出都是同时生成的,而且它生成的速度很快。 那坏处就是它容易犯错,它生成的品质不好。 那犯错没有关系,预言家是可以犯错的,所以auto regremodel正好可以来担任这个预言家。 如果用auto regressive model来担任预言家,那speculative decoding也可以看成是一个auto regressive model跟auto regressive model的结合。 那另外呢你还可以把你的模型做压缩,以后来作为预言家,大家知道说这种大模型有很多压缩的方式。 比如说你可以对模型的参数进行量化,或你可以对一个呃对模型做knowledge stination,总之有很多不同的技术可以把模型变小。 那模型变小以后啊,当然跑起来就快了。 那你会遇到的问题就是模型做过压缩以后,往往脑袋就不好使了,很容易说出奇怪的错误答案。 但没有关系,反正这个小模型压缩后的模型脑袋不好使也没关系,他跑得快,所以他可以来担任预言家。 他犯错也没有关系,反正最后我们是看最终预言模型的输出,然后再来就是预言家一定要是一个语言模型吗? 其实不一定,要是语言模型才能担任预言家。 哦,这边有一篇paper,它是使用一个搜寻引擎来担任预言家。 就假设现在的输入是语言模型,你就去某一个资料库里面啊再送谷当例子啊,但也不一定要是Google了,就用一个资料库里面去搜寻,看看语言模型后面都接些什么样的句子。 我发现在资料库里面说语言模型后面可以接,经常使用在许多自然语言处理方面的应用,把这个句子直接贴出来,这个就是语言家的输出。 但这边是假设说忽略搜寻资料库的速度非常快快到几乎可以忽略。 那你就可以拿一个搜寻引擎来当做这个预言家。 再来就是一定只能有一个预言家吗? 其实可以同时有多个预言家,每个人都产生他的预言,最后再看谁的预言最对谁就可以最多的帮助到语言模型的输出哦,所以预言家可以不止有一个啊。 在这个投影片上假设有两个预言家,两个预言家各自预测预言模型接下来会说什么,然后再把他们预测的结果拿去让语言模型生成接下来产生的token。 那因为预言家一呢他有犯一些错误,他产生出来结果跟语言模型实际上产生的结果不一样。 那我们就不要用预言家的预言家一的输出,我们就只看预言模型采用预言家二的时候,我们就只看预言模型采用预言家二的输出,当做输入的时候所产生的结果。 所以总之你可以用多个预言家来强化这个预言正确的机会。 哎,预言越正确,预测正确的token越多,你节省的时间就越多。 好,总之这边呢就是跟大家介绍一个新的技术,叫做speculative decoding啊,这个想法引入了一个预言家,先去预判语言模型接下来的输出会是什么。 那可以大幅加快速度,这个方法对所有的语言模型都适用,而且不需要训练,不需要去改动。 你原来的语言模型它是一个外挂,挂上去你原来的语言模型的速度就加快了。 好,那这个部分就是我今天想跟大家分享的内容,然后我们就先暂停个三分钟,然后让助教来换场一下。

最新摘要 (详细摘要)

生成于 2025-06-09 21:36

【生成式AI导论 2024】第16讲:可以加速所有语言模型生成速度的神奇外挂 — Speculative Decoding

讲座日期: 2024年5月18日

概览/核心摘要 (Executive Summary)

本讲座详细介绍了一种名为Speculative Decoding(推测解码)的语言模型生成加速技术。该技术的核心思想是引入一个快速的“预言家”(Prophet)模型,在主语言模型(LLM)生成下一个词元(token)之前,提前预测出未来可能的一系列词元。随后,主语言模型可以并行地验证这些预测,从而打破传统自回归(Autoregressive)模型一次只能生成一个词元的瓶颈,实现生成速度的大幅提升,通常可达2至3倍

该技术最显著的特点是其通用性和非侵入性,讲者称之为“一个神奇的外挂”,因为它无需对现有语言模型进行任何修改或重新训练,可以直接应用于任何LLM。即使“预言家”的预测出现错误,该机制也具备完善的容错能力:系统会比对主模型的实际输出与“预言家”的预测,仅采纳到第一个错误点为止的正确序列,后续错误的预测及基于它们的计算结果则被丢弃。在最坏情况下(“预言家”的预测完全错误),其生成速度会回退到与原始模型相当的水平,但代价是浪费了用于并行验证的计算资源。因此,该技术本质上是“用运算资源来换取时间”。讲座还探讨了多种可担任“预言家”角色的方案,包括非自回归模型、压缩后的小模型、搜索引擎,甚至可以组合多个“预言家”以提高预测准确率。

Speculative Decoding技术简介与优势

Speculative Decoding是一种旨在解决自回归语言模型生成速度慢这一痛点的先进技术。传统模型必须按顺序逐个生成词元,而该技术通过并行化处理显著加快了这一过程。

  • 核心优势:

    • 通用性: 可应用于任何语言模型,无需修改模型本身或进行额外训练。讲者形容其为“一个神奇的外挂”
    • 显著提速: 能够将模型的生成速度提升至原来的2到3倍。讲者以Llama 3B模型为例,展示了使用该技术前后的速度对比。
    • 非侵入性: 直接附加在现有模型上,不改变其原始架构。
  • 背景推测: 讲者推测,当前一些生成速度极快的模型可能已经应用了类似Speculative Decoding的技术来优化其性能。

核心工作原理:引入“预言家”机制

Speculative Decoding的核心在于引入一个“预言家”(Prophet)来打破自回归模型的“按部就班”。

  1. 预测阶段: 当接收到输入时,一个速度极快(其计算时间被假设为可忽略不计)的“预言家”会立刻预测出主模型接下来可能生成的多个词元。

    • 例如,对于输入(蓝色),“预言家”预测后续会生成红色词元,然后是黄色词元。
  2. 并行验证: 系统将多个可能的输入序列同时提供给主语言模型进行并行计算。

    • 输入1: 原始输入
    • 输入2: 原始输入 + 预言家预测的第一个词元(红色)
    • 输入3: 原始输入 + 预言家预测的第一、二个词元(红色+黄色)
  3. 并行生成: 主语言模型一次性处理这些输入,并行地计算出每个序列的下一个词元。从外部观察者的角度来看,模型似乎一次性“吐出”了多个词元,从而实现了速度的倍增。

关键问题:如何处理“预言家”的错误?

“预言家”并非永远正确,该技术设计了一套稳健的机制来应对其预测错误。

  • 如何判断错误?

    • 当主语言模型完成并行计算后,系统会将其实际生成的词元与“预言家”的预测词元进行逐一比对。
    • 例如,如果主模型在第一步生成了红色词元(与预言家一致),但在第二步生成了黄色词元(而预言家预测的是灰色词元),那么系统就识别出预言家的第二个预测是错误的。
  • 错误发生后的处理

    • 采纳正确部分: 系统会接受并输出所有在第一个错误点之前的、被验证为正确的词元序列。
    • 丢弃错误部分: 从第一个不匹配的词元开始,所有后续的预测以及基于这些错误预测所产生的计算结果都会被丢弃。
    • 收益分析: 即使“预言家”只猜对了一个词元,生成速度也比原来快了一倍,因此“你还是有赚”
  • 最坏情况:预测完全错误

    • 如果“预言家”的所有预测都是错误的,系统将只采纳主模型基于原始输入生成的那一个正确词元。
    • 时间成本: 在这种情况下,生成速度回退到与未使用该技术的原始模型相当的水平,讲者称之为“不赚不赔”
    • 资源成本: 虽然时间上没有损失,但用于验证错误预测的并行计算资源被浪费了。这体现了该技术的核心权衡:“用了运算资源来换取了你的时间。”

“预言家”的角色选择与实现方式

一个合格的“预言家”需要具备两个核心特质:生成速度超快,且允许犯错。基于此,讲者提出了几种可行的方案:

  • 1. 非自回归模型 (Non-Autoregressive Model)

    • 特点: 生成速度快,所有输出同时生成,但生成质量通常不高、容易犯错。
    • 契合度: 其特性与“预言家”的需求完美匹配,可看作是自回归与非自回归模型的有效结合。
  • 2. 压缩后的小模型 (Compressed Small Models)

    • 方法: 通过模型量化(quantization)或知识蒸馏(knowledge distillation)等技术,将大模型压缩成一个更小、更快的版本。
    • 特点: 压缩后的模型虽然运行速度快,但准确性会下降(“脑袋不好使”),这对于需要犯错容忍度的“预言家”角色而言是可以接受的。
  • 3. 搜索引擎 (Search Engine)

    • 方法: 将当前输入作为查询,在大型数据库中搜索常见的后续文本,并将搜索结果作为预测。
    • 前提: 此方法假设搜索引擎的查询速度极快,几乎可以忽略不计。
  • 4. 多个预言家 (Multiple Prophets)

    • 方法: 可以同时使用多个不同的“预言家”,让它们各自生成预测。
    • 优势: 系统可以选择其中最准确的预测序列进行验证,从而增加预测正确的词元数量,最大化时间节省。预测越正确,节省的时间就越多。