几个月前,当我们发现 DeepSeek 基本上重新设计了整个 V4 模型架构,以使百万 token 的上下文变得极其廉价时,我们都惊得目瞪口呆。我们花了两期节目、总共50分钟的时间来拆解他们是如何创造出这样一部杰作的。因此,虽然我们当时认为这已经是迄今为止最激进优化的长上下文模型了,但几周前,我们迎来了 DeepSeek V4.1 Flash,这是他们最新的模型,拥有更加疯狂的建筑结构改进。

V4.1 Flash 不仅比 V4 Flash 大近两倍,参数量从2840亿增长到5520亿,而且其新架构还消除了多种减少 KV 缓存的方法,使其进一步降低了四倍。为了让你理解这有多令人印象深刻,DeepSeek 在过去9个月内将每个 token 的 KV 缓存大小压缩了54倍。这绝对令人难以置信。所以在今天的视频中,让我们来看看 DeepSeek 是如何降低前沿 AI 模型的成本的,以及他们想出了哪些疯狂的新技术来实现这一切。

但在深入探讨之前,我想分享一下我创办了一家名为 Nimbus Kernel 的公司,我们帮助贵公司升级和维护自己的本地 AI 服务器。例如,如果你的公司已经拥有自己的私有 AI 服务器,并且正在使用开源堆栈来运行模型,那么你可能没有充分利用这些 GPU 的价值,因为留出了大量的潜在速度和吞吐量。我们要做的是为特定模型(如 DeepSeek V4.1 Flash)构建定制的 GPU 优化方案。

因此,如果你希望你的 AI 能够同时处理更多人并保持快速运行,甚至在50人或500人使用时更快,请在 nimbuskernel.com 预约免费审计,我们将评估如何提供帮助。不管怎样,回到视频内容。到现在为止,我想很明显 DeepSeek 并没有追求基准测试的最先进地位,而是对实际运行 LLMs(大型语言模型)进行了极致的优化。

你可以从性能提升中看到这一点,回顾起来这并不疯狂。但是当你开始仔细研究他们创建和实施的所有创新时,特别是相对于模型大小的每百万 token 成本来看,他们确实在建立一种其他实验室无法企及的巨大优势。如果你站在企业的角度考虑问题,如果一个模型能以40倍更低的成本提供90%的质量,你很可能选择这个选项,对吧?

为了再吹捧一下,在 Terminal Bench 2.1 上,它的成本仅为 OPUS 5 的5%,为 GT 5.6 Soul 的8%,为 Kim K3 的8%,同时击败了这三者。这就是 DeepSeek 的优势所在。这是一个更难竞争的领域,因为优化比最大化基准测试要难得多。在这个新的 V4.1 Flash 模型中,他们的主要主题基本上是如何使模型更大,同时使其内存占用小得多。

这是一个优化问题,旨在专门降低重型智能体(agentic)使用 LLMs 的成本。由于目前大多数 LM 的工作负载都是反复读取包含工具输出和代码库的巨大历史记录,DeepSeek 基本上全力以赴地优化了在巨大上下文中注意力机制昂贵的问题。虽然他们当前的稀疏注意力方法已经使注意力变得更便宜,但另一个问题开始出现:模型仍然必须存储、移动和重新加载大量的 KV 缓存。

简要回顾一下 KV 缓存与注意力的关系:当 LM(语言模型)生成一个 token 时,每个注意力层都需要之前 token 的缓存键和值。键基本上帮助它确定哪些过去的信息是相关的,而值包含它实际检索的信息。但是每次生成一个 token 时重新计算所有这些表示将是极其浪费的。所以模型保存了它们。这种保存的状态就是 KV 缓存。

token 越多,KV 就越多;层数越多,KV 也越多。因此在100万个 token 时,敌人不再仅仅是计算速度。那个 KV 缓存的延迟和成本追了上来,你需要一次性计算并移动比注意力最初设计要多10到100倍的 token。所有的预填充计算、HBM(高带宽内存)、SSD 和带宽现在都需要适应这一点,这得益于我们如何使用智能体工具,或者说模型目前是如何被服务的。

这就是 V4.1 的视角开始变得有趣的地方,因为在 V4 中,他们通过将多个 token 压缩为更少的 KV 条目来使用 CSA(压缩稀疏注意力),然后使用稀疏索引器来决定哪些被压缩的内存片段实际上值得读取。因此,为了应对上下文长度的增加,已经发生了大量的压缩。然而,V4.1 Flash 论文指出的一点是,KV 缓存也随着模型深度和模型大小而增长。

因为如果你想拥有一个更大的模型,深度是增加规模最直接的选择之一。所以在 OS(可能是指其他参数或结构)相等的情况下,从12层增加到120层意味着可能存储大约10倍于每层的特定 KV 状态。即使你激进地压缩上下文本身,剩余的任何 KV 仍然会在网络的深度上被放大,这就引出了一个问题:如果一层已经创建了有用的全局内存表示,下一层真的需要从头开始构建一个全新的吗?

DeepSeek 发现至少对于某些层来说,答案是否定的。这基本上就是压缩稀疏注意力2(CSA2)背后的理念:他们不仅沿着 token 维度进行压缩,还开始沿层维度进行压缩。他们通过将注意力层分为三种不同的模式来实现这一点:全量(Full)、重新索引(Reindex)和重用(Reuse)。

一个全量层像往常一样执行所有操作。它生成全局 KV,生成分组索引器 K,运行稀疏索引器,并选择自己的前 K 个内存条目。对于那些需要快速回顾稀疏注意力的人来说,稀疏索引器基本上是一个用于 KV 缓存的廉价搜索引擎。它对缓存的全局 KV 条目进行评分,选择前 K 个最相关的条目,注意力只读取这些选定的条目。

接下来是重新索引模式(Reindex mode)。该层将使用上一层已经创建的全局 KV,但它可能对哪些信息重要持有不同意见。因此它重用之前的主要 KV 和索引器 K,但生成自己的查询并做出全新的前 K 个选择。最后是重用模式(Reuse mode)。这种模式重用了所有内容,包括主要 KV、前 K 个索引,甚至不需要再次运行索引器。它只是对上一层的内容执行注意力机制。

层已经选定。在CSA 2架构重组的基础上,V4.1 Flash还去除了V4版本中混合注意力机制的混乱局面,这种混乱原本交织在滑动窗口注意力(SWA)、高稀疏注意力(HCA)和CSA之间。他们的主要改动是完全弃用了HCA,因此全局分支现在纯粹由CSA 2构成,从而形成了更简单的CSA与SWA混合结构。但即便经过CSA 2大幅削减了跨层所需的KV缓存量,仍然存在另一个巨大的效率低下问题。

因为无论你的注意力机制压缩得多么紧凑,在预填充阶段,模型仍然必须将所有输入标记通过网络处理完毕,才能生成第一个令牌。想象一下,你给一个拥有40层的标准Transformer模型输入一百万个标记的提示词。这一百万个标记仍然必须逐层通过,从第1层一直传到第40层。对于智能体操作而言,这相当痛苦,因为如今的模型不断调用工具、读取文件、获取搜索结果、浏览代码库,然后将所有这些内容重新添加回上下文。

这意味着模型反复花费大量计算资源仅仅用于“阅读”。在推理方面,大多数前沿实验室和推理提供商已经将在预填充和解码阶段的工作分离到不同的GPU集群中,因为这两种工作负载的需求截然不同:预填充更依赖计算能力,而解码则更受限于内存带宽。因此,DeepSeek也采用了同样的做法,但在架构上引入了名为CED(因果编码器-解码器架构)的新概念。

实际上,CED背后的核心思想并非起源于DeepSeek,而是受到2024年发表的一篇名为《You Only Cache Once》(YOLO)的论文启发。YOLO指出,在标准的Transformer中,每一层都会生成并存储自己的全局KV缓存。因此,如果你有40层模型,你实际上是在保留40个不同版本的记忆。为了解决这种重复性,他们提出了一种称为解码器架构的解决方案:模型的下半部分是一个自回归解码器。

它使用高效的因果注意力机制处理序列,并生成提示词的上下文表示。然后,YOLO基于这个下半部分的输出创建一个共享的全局KV缓存,而上半部分则成为交叉解码器。在交叉解码器中,每一层都有自己的查询(Query),但所有这些都 attends 到同一个共享的KV缓存上。因此,与其让每一层都拥有自己的巨大KV缓存,YOLO基本上只创建一次全局记忆并让大家复用。

这就是“你只需缓存一次”名称的由来。虽然YOLO称这种架构为解码器架构,但它仍然像正常的自回归语言模型一样进行训练和使用。其命名可能与编码器-解码器架构相似,容易让人联想到原始的注意力机制联系,但之所以称为“解码器”,是因为存在两种不同类型的解码器。下半部分被称为自回归解码器,因为它使用因果自注意力处理序列并构建共享的全局KV。

上半部分被称为交叉解码器,因为每个上层生成自己的查询,并交叉 attends 到由下半部分创建的KV中。这样做还有一个更酷的后果:如果上半部分只需要底部产生的KV,那么在预填充阶段,你实际上根本不需要让提示词通过上半部分。你可以将巨大的提示词输入自回归解码器,生成共享的全局记忆后就直接停止。

这意味着YOLO基本上催生了这样一个理念:预填充和解码阶段不一定需要使用相同规模的模型。当你的输入可能长达一百万个标记时,这是一个非常好的想法。DeepSeek采用了这一概念,但将其调整为兼容V4现有架构的形式。不同于YOLO将下半部分称为自回归解码器,DeepSeek将其称为因果编码器(Causal Encoder)。

此外,不同于YOLO让上半部分共享完全相同的全局KV缓存,DeepSeek允许每个解码器层从最终的编码器表示中推导出自己的全局KV。在功能上,YOLO对KV缓存共享的处理更为激进,而DeepSeek的因果编码器在第一部分模型处理后仍会给出一个最终的表示。但它没有将其转化为所有人都必须共享的一个KV缓存,而是让每个解码器层获得该最终表示的学习投影。

在第20层之后的每一层都可以从那个最终表示中进行投影,并通过其特定层的权重获得不同的结果。但这为什么可行呢?他们的理由是:这是一个巨大的学习表示,反映了模型当前对标记的了解程度。因为在经过20层Transformer处理后,每个标记的表示都已经经历了相当深度的上下文处理,基本上成为了一个丰富的公共信息源。

注意力机制使用的键(Key)和值(Value)基本上是该来源的不同学习视图。键用于确定该信息如何被表示,以便未来的查询能够与之匹配;而值则决定在获得注意力时应该返回什么。因此,通常当你想要第35层的KV信息时,每一个历史提示标记都必须物理地穿过从第21层到第35层的每一层,然后第35层将该新的隐藏状态投影为其KV。

DeepSeek在此质疑:为了创建全局记忆库,所有这些非线性计算是否真的必要?因此,他们切断了中间所有的顺序过程,直接使用隐藏状态,然后将其投影到第35层以获取KV信息。然而,如果你记得之前的内容,DeepSeek实际上并不是每次都为了每一层生成完全独立的巨大KV缓存。CSA 2已经允许相邻的三层通过三种不同模式共享全局KV。

因此,只有真正需要创建新全局KV的解码器层才会直接使用其自身特定层的投影从最终的编码器状态中推导出来。至于决定某一层使用哪种模式,DeepSeek基本上将模式硬编码到了层布局中。在编码器部分,在前两个仅使用滑动窗口注意力(SWA)的层之后,剩余的18层被分为六层的组。每组包含一个完整层和五个复用层。

在解码器部分,20层被分为四层的组。第一组以一个完整层开始,后跟三个复用层;而后续的各组则从一个重新索引的层(reindex layer)开始,后跟三个复用层。因此,将所有内容整合在一起,你基本上会同时获得两个层面的节省:首先,CED避免了为了生成解码器全局KV而让预填充过程穿过模型的上半部分。相反,它直接从编码器推导该KV。

直接来自最终的编码器表示。随后,借助CSA2架构,一旦某个解码器层生成了该KV缓存,接下来的几个层就未必需要再生成一份副本。这种组合使得DeepSeek的方法更为激进,并专门针对V4.1进行了优化。此外,DeepSeek V4.1的情况也更为复杂。它在每一层仍保留了滑动窗口注意力分支,因此每个解码器层实际上拥有两种不同类型的记忆:一种是由编码器表示产生并通过CSA2共享的全局记忆,另一种是来自解码器层自身隐藏状态的局部近期记忆。

在此需要澄清一个重要点:CSA2的KV共享仅适用于全局注意力分支,并不意味着滑动窗口注意力的KV在各层间被共享。每一层仍保留其自身的局部SWA KV,因为这种局部记忆是由该层的实际隐藏状态产生的。因此,即使有5个CSA2层共享相同的全局KV,它们仍然可以拥有五个不同的滑动窗口KV缓存。此外,SWA仅保留最近的128个token。因此,与随整个百万token上下文增长的全局KV不同,运行时SWA缓存实际上受限于该固定窗口。

但由于它保持未压缩且层特定,这并非没有成本,特别是在跨多个会话持久化这些状态时。如果不共享SWA KV缓存,是否意味着我们仍需将提示词通过那些解码器层?棘手之处在于这128个token的窗口会随深度累积。第40层的SWAT状态依赖于第39层,而后者又依赖于更早的局部窗口,依此类推。因此,DeepSeek基本上切断了这一依赖链,仅通过每个解码器层替换最后的128个token。

这正是他们所谓的“SWA有界重放”发挥作用的地方。因此,与其将100万个token通过所有40层,不如让前20层处理这100万token,而剩余20层仅处理128个token。这意味着完整的预填充成本大致变为:整个提示词通过模型的一半,加上128个token通过其余层。在百万token上下文下,这128个token的重放几乎可以忽略不计。因此整体预填充时间仍大致减半。

虽然由于仅运行128个token,重建的状态在技术上是近似的,但DeepSeek表示质量影响微乎其微。有界重放还带来了另一个巨大的好处:DeepSeek基本意识到SWA KV不再值得像长期记忆那样对待。在V4中,当缓存前缀以供重用时,SSD上的持久化缓存同时存储了全局KV和SWA KV。

令人惊讶的是,尽管SWA仅覆盖小的局部窗口,但这些未压缩的逐层SWAT状态仍占持久化KV存储的近一半。此外,这两种缓存的生命周期完全不同:如果相同的长前缀被重用,全局KV可能在数小时或数天后仍有用;但SWA KV仅对当前活跃会话的局部状态有用,通常只有几分钟。

因此在V4.1中,DeepSeek完全停止将SWA KV放入长期持久化缓存。相反,它们将其临时保存在一个更小的主机内存池中。一旦过期或被驱逐,便使用有界重放重新重建最后的128个token。与此同时,全局KV可以保留在如SSD这样的持久化存储中。这使得持久化KV的减少非常显著:CSA2结合FP4已将全局KV压缩至V4大小的四分之一左右。

但将SWA KV从持久化存储中移除几乎使缓存再减半。在V4时期,大约一半的持久化KV足迹来自SWA,另一半来自全局KV。因此,V4.1首先通过CSA2和FP4将那一半的全局KV压缩至原始大小的四分之一,使全局KV本身降至每token约890字节,在HBM存储上节省了75%。

随后从持久化存储中移除SWA那一半,理论上可使SSD存储节省87.5%。这也造成了该5520亿参数模型实际运行方式的一种奇怪不对称性。V4.1仍是MoE模型,显然不会为每个token激活所有5520亿参数。但在预填充期间,由于CED机制,输入令牌仅需遍历20层编码器,因此DeepSeek仅激活约80亿参数。

一旦模型开始生成,每个新令牌都必须经过编码器和解码器,使激活参数量增至160亿。因此尽管总模型大小几乎是V4 Flash的两倍,但执行大部分繁重输入读取的模型部分实际上非常小。这对智能体而言是极大的利好,因为它们可能需阅读数十万token仅为了生成几千个。

而且,尽管上下文从4000增加到100万token,单令牌解码计算量仅从约20增至25加权GFLOPS。这些是我认为在此次发布中他们所做工作中最值得关注的重大新组件。至此,百万token上下文已不再是模型的可怕之处。因此DeepSeek开始将注意力转向架构中仍在浪费内存、带宽和计算力的其他方面。

这引出了DeepSeek在V4.1中改进的其他组件,此前已实现过。首先是MHC(多头关注压缩),我曾为此制作视频。简而言之,V4.1特有的更改称为“单次通过图像C”。这基本上消除了迫使GPU多次触碰残差流的令人烦恼的依赖关系。这种新实现相比原始实现将内存流量削减了约一半。

此次他们还实际实现了Engram(记忆模块)。DeepSeek此前引入Engram旨在分离需要记忆的昂贵Transformer计算信息。我也曾制作视频介绍,但直到V4.1才将其整合进模型中。他们添加了拥有1960亿参数的Engram,分为两个模块。因此从技术上讲,模型总共存储约5520亿加1960亿等于7480亿参数。

但这些额外的1960亿参数是通过哈希Engram查找表稀疏访问的条件记忆,而非为每个token激活的另外1960亿密集参数。

Engram 大幅增加了模型的内存容量,但其每个 token 的计算量仍让人感觉像是一个拥有 5200 亿参数的模型。最后是 Spark,我也做过关于 DSpark 的视频。简而言之,他们让 Spark 实现了更快的解码速度,而无需将草稿模型烘焙到主干预训练本身中。但架构的革新并不仅限于文本方面。

V4.1 的另一项重大变化是 DeepSeek 终于使模型原生支持多模态。他们从头开始训练自己的视觉编码器 DeepSeek ViT,然后在将特征输入语言模型之前,使用 3x3 像素和洗牌操作压缩视觉特征。这使得视觉 token 的数量减少了九倍,同时仍支持约 1344x1344 分辨率的图像。为了帮助

你理解我刚才讨论的一切,让我们 walkthrough 他们构建的整体模型架构。从底部开始,我们有文本和图像两个输入进入模型并合并为嵌入层。然后它经过两层纯滑动窗口注意力机制,从 Engram 中获取记忆信息。接着进入 CSA2 fold 和 reuse 阶段,比例为 1:5,并重复三次。因此总共有 18 层,加上因果编码器组件的另外两层,共计 20 层。这里的数字“2”意味着大约每两个 token 被压缩成一个主 KV 条目,且每个 CSA2 都伴随滑动窗口注意力。此前他们仍在使用 DeepSeek……

那么到目前为止,所有输出的就是编码器隐藏状态,其余层都使用这一状态。SWA 边界重放直接在此隐藏状态下运行,而不是从解码器层顺序获取信息。因此,在预填充阶段,只需因果编码器组件运行;而解码器组件需要两者都运行,导致激活参数为 80 亿而非 160 亿。至于解码器中的具体层,第一层是 CSA2 fold,然后是三层 CSA2 reuse 进入一层到三层的重新索引和重用,重复四次。数字“1”意味着主 KV 没有 token 维度的压缩,这可能是为了在解码器已经在层间积极重用编码器派生的全局 KV 时(至少在我的解读中),保留完整的 token 级分辨率。

即使有 CSA2 reuse,重新索引层仍必须扫描整个百万 token 的上下文。因此 DeepSeek 添加了一个分层稀疏索引器,以避免使该搜索再次变得昂贵。第一层全量扫描所有内容并构建一个多达约 16,000 个位置的候选池。随后的重新索引层仅在该池中搜索它们各自的前 512 名。这也加起来共 20 层,并传递给 Spark,这就是模型架构的全部内容。

在训练方面也有一些有趣的改变。首先,DeepSeek 并没有先训练一个正常的密集注意力模型然后再将其转换为这种稀疏架构。V4.1 直接从零开始使用稀疏注意力进行训练,上下文长度为 64,000,完全没有密集注意力的预热。然后一旦训练达到约 3.4 万亿 token,他们直接将上下文扩展到 100 万,并最终在 4.5 万亿多模态 token 上完成预训练。因此 CSA2、CED 和稀疏检索行为并非事后添加,模型实际上是从头开始学习这些机制的。

当一个实验室成功从头训练稀疏注意力而不依赖密集注意力时,这通常意味着该注意力机制是稳定且有前景的。后训练部分则转向了一个相当迷人的方向,因为 DeepSeek 明确表示这里基本上没有新的后训练算法。相反,他们说几乎所有的改进都来自于扩展模型所训练的数据规模(即数据),而不是发明另一种强化学习目标。

我确实明白这是如何发生的,因为 DeepSeek 已经拥有最强且最稳定的后训练配方之一,批不变性使得强化学习过程更加可预测。此外还有多层在线策略蒸馏,他们现在将其大规模应用于 V4.1 的学习中,V4.1 从跨不同领域的超过 40 个专用教师模型中学习。这也表明 DeepSeek 目前认为,在改进数据上花费更多的时间和金钱比继续发明新的后训练算法更值得。

特别是在这篇论文中,他们强调自动化合成和强化学习数据的环境构建,归根结底就是“垃圾进,垃圾出”。但这同时也暗示当前的后训练范式在一段时间内可能会变得不那么有趣。虽然公平地说,我们最近才得到 MLPD(多层策略蒸馏),所以这种范式存在的时间也不长。

但有一件他们之前未明确提及的微小额外工作,那就是模型合并(Model Merging)。我也做过关于模型合并的视频。在强化学习期间,他们跨不同的脚手架和配置从单独的运行中合并检查点,结合来自不同优化路径的改进,并使用该合并模型来初始化下一次强化学习运行。因此,模型合并被用于在成功的强化学习运行中持续累积改进。

最后在非常结束时,他们在不同的领域和训练阶段运行大规模在线策略蒸馏,将所有教师专家合并到一个模型中。另一方面,推理力度(Reasoning Effort)也有一次升级,不再仅仅是像 V4 那样的“思考高”和“思考最大”模式。V4.1 Flash 的推理力度是一个从 1 到 100 的值,较低的力度会获得更强的 token 惩罚,较高的力度则允许逐步花费更多的计算资源。

因此,与其训练几个孤立的推理模式,模型学习了一条平滑的成本质量曲线。面向公众的低、高和最大设置基本上就是同一尺度上的力度值 50、75 和 100。好了,这就是 V4.1 Flash 在其技术报告中提出的大多数重大发展的总结。51 页的技术报告中有更多细节,但其中一些太深奥或需要更多的上下文才能解释清楚,比如去缩放、多模态 MoE 平衡以及其他基础设施改进。

如果你想了解更多,一定要查阅他们的论文。如果今天了解 DeepSeek 的新架构让你想更深入地了解 LLMs,我的平台 Intuitive Ai.academy 可能就是你开始的最佳地点。该平台专注于帮助你建立对 LLMs 背后关键概念的直观理解,从基础一直到高级主题。

比如混合专家模型和模型优化。我们不想用令人望而生畏的数学公式轰炸你,而是要确保你先充分理解更高层面的逻辑,这样当你接触到技术细节时,它们才会显得合理且易于理解。

此外,我们最近新增了一个测验系统,在每一章结束后测试你的理解程度,并配合每周排行榜,让学习过程更具竞争性。我们还刚刚发布了一章关于直观拆解线性注意力的内容,深入探讨了基莫克3和昆恩模型所基于的最新前沿概念之一。

因此,如果你在工作中使用大型语言模型、正打算转行进入这一领域,或者希望投身于大语言模型研究,请通过描述栏中的链接查看相关内容。使用我们的限时优惠码“back to school”,即可享受年费会员五折优惠。

感谢大家观看。特别鸣谢 Spam Match、Chris Loo、Degan、Robert Zaviasa、Proof 和 Enu、DX Research Group、Alex Leo、Halawani 以及许多通过 Patreon 或 YouTube 支持我的朋友们。如果你还没有关注,请在 Twitter 上关注我,我们下期再见。