大家好,欢迎收看本期节目。今天我们要探讨的是MTP(多令牌预测),它的核心目标是让大语言模型运行得飞快。回想过去,曾有一种叫做“投机解码草稿模型”的技术。其工作原理是:首先有一个包含所有张量和权重的主模型,然后搭配一个较小的辅助草稿模型。两者协同工作:主模型先运行,接着草稿模型向前推测几个回合,最后由主模型对草稿模型的猜测进行双重检查。如果猜对了就继续;若错了,则需重新计算以确保正确性。虽然这套机制在Llama等大型模型上表现尚可,但存在明显缺陷:它需要同时加载主模型和草稿模型,导致内存占用翻倍;此外,提示词处理过程也被重复执行两次,且与开源模型(OE)的兼容性较差,整体体验非常笨重。

如今,新一代技术如D Flash、MTP和Eagle 3应运而生,本期我们将重点介绍MTP。其最大优势在于无需运行第二次提示词处理流程。实际上,MTP只是主模型顶层的一个额外层,且该层是与主模型一同训练的。因此,它生成的预测通常非常精准巧妙。使用MTP时,我们能在极低的内存开销下实现约两倍的速度的提升。目前我们在Qwen和Gemma模型上进行了测试,本期将使用Qwen 3.6版本。界面上有一个醒目的横幅提示查看兼容的投机解码器,你可以在此下载相关组件。我准备了未量化版本、9位量化版以及4位量化版,通过大量测试来展示它们之间的速度差异。

为了开始演示,我目前处于调试模式运行,因此实际发布版本的速度可能会快10%左右。首先测试Qwen 3.67B模型,在不启用投机解码的情况下生成10,000个令牌,速度为每秒17个令牌,内存占用28.3GB。接着加入MTP投机解码层后,速度跃升至每秒29个令牌。你可能会想:“这只是写故事的基础测试吧?”别急,接下来我们将使用超过30,000令牌上下文窗口的复杂提示词。数据显示,从17提升至29个令牌/秒正是得益于MTP解码器。若使用9位量化的投机解码器,速度进一步微升至30个令牌/秒。

关于内存方面,使用9位量化投机解码器时占用29.3GB,而未使用时为28.36GB,额外消耗近1GB内存。这是该技术的主要缺点之一。未量化的投机解码器速度为29.5个令牌/秒,而4位版本则达到30.08个令牌/秒。有趣的是,最快的反而是9位量化版本。关键在于:当你使用9位量化的主模型并搭配同精度(9位)的投机解码器时,性能最佳。因为如果草稿模型猜对了令牌,主模型会直接接受,无需重新计算。反之,若用未量化解码器搭配4位主模型,由于精度不匹配导致的“脑损伤”效应,其输出可能与主模型的预期不符,从而导致速度低于直接使用4位解码器的情况。

如果你想尝试MTP版本,只需前往Hugging Face搜索“Qwen 3.6 MTP”,即可找到所有相关模型。其中9位版本仅477MB,完整未量化版为850MB。相对于巨大的性能提升而言,这点额外的内存开销微不足道。下载后系统会自动检测MTP层,并提供下拉菜单供你选择具体版本。之所以这样设计,是因为未来我们将支持D Flash和Eagle等多种技术,允许用户灵活选择想要的投机解码器。现在让我们进入更复杂的测试环节,因为单纯写故事太容易预测了。

接下来我将切换任务:生成一个基于WebGL的实时照片级真实人脸渲染代码。未量化的9位模型认为这就是人脸的样子,但结果显然不对——那看起来像个倒置的杯子。尽管生成质量存疑,但它以每秒16.9个令牌的速度产出了2,379个令牌,内存占用维持在29.5GB。启用未量化的投机解码器后,我们生成了约2,800个令牌,速度飙升至每秒33个。这实现了超过两倍的提速,且正在输出代码。需要注意的是,生成代码的质量依然100%可靠,因为主模型始终在验证草稿模型的每一个令牌。

虽然最终生成的代码内容会因随机种子不同而有所差异,但质量不受影响。所谓“种子”,是指随机数生成器的初始化值。由于草稿模型与主模型并行运行,系统请求的随机数比单独运行主模型时更多,导致生成路径在决策树中略有不同。但所有输出均经过主模型的严格验证,因此质量依然有保障。接下来我们将使用更高级的提示词来进一步验证这一点。这就是照片级渲染的实际效果展示,尽管视觉结果有待商榷,但技术层面的速度提升是确凿无疑的。

当你运行推测解码器时,生成的现实人脸看起来是这样的。我们可以看到这里的效果,嗯,渲染确实非常漂亮。这只是一个27B的模型,也许Qwen 3.7能解决这个问题。但在我看来,这根本不像一张人脸。Quinny,让我们切换到Q9版本的推测解码器吧。我们看到它生成了2600个词元,速度为每秒34个词元。所以我们的速度提高了1个词元/秒。嗯,如果我们从每秒16个提升到17个,那确实是个不错的飞跃。但我们是从33提升到34,提升幅度不算大。不过这个Q9版本使用了更少的内存,同时提供了更好的词元生成速度,这很好。我喜欢这种配置的感觉。

这就是它认为人脸应该长这样的样子。再次强调,非常逼真,而且这是一次完美的生成。如果你调整一下使用的种子值,可能也能得到类似的生成结果。所以你可以进入这里的推理设置,滚动到底部,修改种子值,这有助于你得到不同的生成效果。但我们现在的速度是每秒34个词元。这就是你想要达到的核心目标。为了看看效果,我们来看看最小的那个版本,这是MTP的Q4量化版。它将生成3000多个词元,并且使用的内存最少,因为Q4版本实际上只有265兆字节。所以它的额外内存开销非常小。我可能会上传那个版本,因为也许有些人的网络带宽有限,或者他们的设备内存紧张。所以拥有最少的额外兆字节占用会很好。我们来运行一下那个版本,看看它看起来怎么样。

我不知道Quinny认为人类的脸应该长什么样,但我确实很喜欢这个结果。如果这不是为了生成人脸的话,这大概是最好的一个了。它在动画效果上表现出色,简直太棒了。这是一次华丽的生成结果。干得不错。这是最低量化版本的结果。现在,我们要让挑战变得更难一些。我们将提升难度,开始在3D中制作《Flappy Bird》(小鸟飞行游戏)。首先,这是在没有使用任何推测解码的情况下。我们在禁用思考模式的状态下生成了2600个词元,内存占用约为29.7吉字节。我们点击播放,它只是一个基本的立方体。我们已经见过无数次了,这没什么印象深刻的吧?但再次强调,使用Q版本的推测解码器后,我们的速度提升到了每秒36.8个词元。我们从17跳升到了36.8。我想Quinny可能在这个拍翅膀鸟类的练习中经过训练了。尽管这个生成结果本身并不那么令人印象深刻,它只是一个下落的立方体,但依然挺酷的。

如果我们升级到9位量化版本,速度是每秒37个词元。再次强调,生成结果类似的是4位量化版本,也是每秒37个词元。但我们想看看在启用思考模式时效果如何,因为这才是该模型擅长的地方。所以,在启用思考模式下,它以每秒17个词元的速度生成了6000个词元。这花费了我们300多秒,也就是将近5分钟来生成这个《Flappy Bird》场景。而启用MTP后,它以每秒34个词元的速度生成了8000个词元。这相当于将速度翻倍了。所以这就是为什么你听到很多关于MTP(多词元预测)的讨论,它只是将速度翻倍了。这太棒了。让我们看看两者的质量如何。这里我们得到了《Flappy Bird》游戏,那真是令人惊叹。会有一个管道穿过来。是的,就是这样。砰!太棒了。

而在MTP版本中,再次强调,两者都是完美的生成结果,只是种子值不同。这就是为什么你会得到略有不同的结果。一般来说你可以获得不同的结果哦,这个游戏真让人上瘾,我不得不退出了。如果你将温度设置得较高或为零,通常可以得到不同的结果。我喜欢把温度保持在零,因为这对我来说通常是生成语法准确代码的最佳设置。但你的体验可能因人而异。所以这里是每秒34个词元。使用Q9量化,再次强调,是每秒34个词元。而MTP的Q9量化版本达到了每秒35个词元,速度更高了。而在Q4版本中,我们得到了最高的35.6个词元/秒,额外内存占用最少,仅增加250兆字节RAM,并且产生了最快的推理速度。所以让我们点击播放吧。

再次强调,我们在这里得到了一个漂亮的3D《Flappy Bird》游戏。这真是太美了,这是一个华丽的结果。所以,我们从每秒17个词元提升到了每秒35个词元,而且质量依然非常精美。但我们目前使用的这些提示语其实非常简单,那个1、2、3、4、5、6个单词的提示。非常基础。让我们看看当我们做点超级复杂的事情时会发生什么。我现在给出的这个提示语包含了很多行代码,算是个比较庞大的提示了。我给了它一些代码并要求添加一个宇宙飞船。所以让我们看看这会带来什么结果。这是MTP的Q4版本,我们的速度是每秒35.98个词元。而我们要对比的基准线是每秒16.8个词元。所以,在基准线下,它生成了6000个词元;而Q4版本以每秒35的速度生成了5000个词元。我们选择基准线来看看,实际上基准线在处理这个提示时遇到了困难。所以我认为Quinny可能没有针对这种情况进行过训练,我们只是这次运气不好罢了。

但Q4版本使用了MTP(这里字幕误写为NTP,根据上下文应为MTP),我们实际上在屏幕上得到了一个宇宙飞船。所以有时候你给它一个提示,它可能会出错。你可以改变种子值,稍微调整一下温度,然后它就会生成一个漂亮的结果。但让我们让它变得更复杂一些。我要加入更多元素,我将做一个3D城市模拟器。这个生成过程“轰”地一下完成了,生成了15000个词元。所以你知道的什么?我拿了那个生成结果,并让它变得更长一些。我说:“你能把我变成一个可玩的角色吗?让我可以用键盘和鼠标控制,以便我能在城市中移动?”然后它又生成了另外18000个词元。所以,总共我们拥有了35000个词元的上下文窗口。

在禁用MTP的情况下,速度是每秒16.4个词元,内存占用为34.2吉字节。而启用MTP后,它在拥有34000个词元上下文窗口的情况下生成了17000个词元。让我们看看两者之间的区别,再次强调这是一个庞大的提示语。它需要在巨大的上下文窗口之后预测词元。所以这里是像DFlash等其他解决方案失败的地方。例如,DFlash通常是在2000到4000个词元左右进行训练的。所以如果你尝试用它处理超过这个数量的内容,它就开始崩溃了,因为它实际上并没有针对如此大的上下文窗口进行过训练。而这里是35000个词元。让我们看看效果如何。

MTP关闭状态下,我们生成了这个3D模拟器行走场景。我们得到了一个城市,鼠标在移动,我们可以上下跳跃。那辆车差点撞到我。现在,那个时间滑块有用吗?是的,时间滑块有效了。这是一次非常漂亮的生成结果(MTP禁用状态)。

我们点击了播放按钮。不幸的是,程序实际上报了一个运行时错误,但它还是生成了17,000个词元。不过让我们看看Q9 MTP的表现,那个只生成了8,000个词元。所以稍微少了一点。但再次强调,我们确实有城市场景,天空也在移动,不过我们要把它降级到Q4 MTP。那个版本生成了17,000个词元,速度是每秒32个词元。我们再次点击播放按钮开始运行。

同样地,我们又得到了和第一轮一样好的生成结果。我们可以上下跳跃,可以四处走动,可以快速奔跑,甚至可以环顾四周。为了向大家展示这一点,我们在中间两次的生成中确实运气不好,那只是由于种子被链式处理导致的。有时候你需要用不同的种子多次运行这些结果。

我的意思是,如果你查看Mistral 3.5,他们针对Claude和Kimi有一些惊人的结果。很多人都在问:“他们的样本量运行了多少次才能从中挑选出最好的生成?”这就是上一个视频评论中的怀疑所在,但诚实地说,情况确实如此。所以Q4版本产生的结果和未启用MTP的版本一样出色。

因此是18,000个词元,那是每秒16个词元,对比于32个词元。而且它只多用了250兆内存。为了向大家展示,如果你看提示词处理速度,那么未启用MTP时是每秒395个词元来处理那16,000多个提示词。而启用MTP后,又是每秒400个词元。处理相同数量的提示词,因为MTP的好处在于它不需要你在单独的草稿模型上运行提示词处理。那个草稿模型实际上是主模型层的一部分。

现在为了更硬核一点,实际上又运行了这个3D模拟器几轮,总共我们得到了58,000个词元大小的上下文窗口。所以未启用MTP时,我花了超过1,000秒来生成这个结果。它是21,000个词元的生成量。它将非常类似于我们刚才看到的,除了这个将是第三人称视角。我刚被车撞了。刚被撞飞了。然后看,那个的时间段不起作用。

但再次启用MTP后,它生成了21,000个词元,58,000个词元的窗口。同样地,我们得到了相同类型的最终质量结果。即使使用4位版本的MTP,它也生成了21,000个词元,速度为每秒29.96个词元。让我们看看我们得到的生成结果,同样的城市,完全相同的生成内容。所以必须说这个MTP技术做得非常棒。它看起来非常好。

如果你也想跟着玩,只需确保启用推测解码器并选择你想使用的MTP版本。希望你会只有一个选项而不需要挑选。但是的,情况就是这样。这同样适用于Gemma和DeepSeek。所以使用DeepSeek版本我们可以看到它正在生成1,000个词元,使用的是MoE版本。这是35B A3B模型。那个很快,一般来说未启用MTP时是每秒47.5个词元。

然而如果你启用MTP,速度会跳到每秒76.5个词元,你甚至可以使用量化版本的NTP以减少内存使用。那个是每秒74个词元。所以你在密集模型和MoE模型上都能获得性能提升。MoE模型本身已经很快了,但从每秒47个词元跳到每秒76个词元。那是一个很大的飞跃。那大约是50%的跳跃。

而在密集版本中,我们从17跳到了30多,那大约是2倍的跳跃。所以请告诉我你们对MTP推测解码情况的看法。而且你肯定在期待Eagle 3和D Flash吧。你知道,在我年轻的时候,我们管它叫DiX,但现在流行的是D Flashing。希望你们觉得这个视频有用并享受了节目。