研究KimiK3,我发现大模型正在学会“管理自己的计算”

发布时间:2026/7/31 9:03:35
研究KimiK3,我发现大模型正在学会“管理自己的计算” 第一次看到 Kimi K3 的参数规模时人的注意力很容易被几个数字带走2.8T 总参数896 个专家百万 Token 上下文每个 Token 只激活少量专家8 张顶级 GPU 可以完成模型加载和正确性验证。这些数字确实足够震撼。但如果只把 K3 理解成“又一个更大的模型”反而会错过它真正值得学习的部分。因为 K3 展示的并不是一条简单的路线参数越来越多模型自然越来越强。它真正解决的是四个完全不同的问题历史信息越来越长模型怎样记得住网络越来越深前面层的能力怎样不被淹没参数越来越多怎样避免每次都全部计算Agent 工作越来越久怎样不中断、不失忆、不把环境搞坏换句话说K3 的关键不是单纯扩大 Transformer而是重新设计了大模型内部的信息调度方式。如果把传统 Transformer 看成一台不断堆算力的机器那么 K3 更像是在给这台机器加上分层缓存选择性路由压缩记忆异步执行状态恢复专家调度系统。这篇文章不打算重复罗列 K3 的参数而是试图真正讲明白KDA、AttnRes、MoE 和 Agent Harness 到底分别解决了什么问题以及它们为什么必须同时出现。一、Transformer 真正遇到的瓶颈不只是算力不够传统 Transformer 有一个非常直接的工作方式。当模型需要理解一段文本时它会保留历史 Token 对应的 Key 和 Value。新 Token 到来后Query 再去历史记录中逐一检索。这很像一个没有索引压缩的档案系统过去发生过什么全部保存现在需要什么再从头查找。这种方式的优点是准确。某个变量名即使出现在几十万 Token 之前只要当前 Query 能够匹配到它模型理论上仍然可以直接取回相关 Value。但代价也非常明显。假设序列长度为 (L)标准 Attention 需要处理大量 Token 两两之间的关系训练复杂度近似为O(L^2)推理阶段虽然不需要重新计算所有历史关系但 KV Cache 会随着上下文持续增长。于是上下文越长模型越容易遇到三个问题KV Cache 占用越来越大每生成一个 Token需要读取的历史数据越来越多显存带宽逐渐成为比计算本身更严重的瓶颈。当上下文从 8K 增长到 128K问题还可以通过增加显存和优化 Kernel 缓解。但当目标变成数十万甚至百万 Token 时继续保存全部历史明细就开始变得不经济。KDA 的出发点正是改变这件事。二、KDA 不是“更便宜的 Attention”而是一套在线记忆系统理解 KDA首先要放弃一个常见误区KDA 只是把 Softmax 去掉然后把复杂度降成线性。如果只理解到这里几乎等于没有理解 KDA。KDA 更接近一个不断训练自己的小型记忆模型。每读入一个 Token它都会完成三件事根据当前 Key查看记忆中已经保存了什么判断当前记忆预测得是否正确只把预测错误的部分写回去。这与传统 Attention 的逻辑完全不同。传统 Attention 更像查数据库KDA 更像在实时训练一个 Key 到 Value 的映射模型。1. 最简单的线性记忆先考虑一个状态矩阵S_t\in\mathbb{R}^{d_k\times d_v}它可以被理解为一个从 Key 空间到 Value 空间的映射。当第 (t) 个 Token 到来时最朴素的写入方式是S_tS_{t-1}k_tv_t^\top读取时使用 Queryo_tS_t^\top q_t这套方法的优点是历史 Token 不需要逐条保存。无论上下文有多长历史信息都会被压缩进固定尺寸的状态矩阵 (S_t)。但这种简单累加很快会出现问题。假设模型先后看到了两条信息项目状态开发中 项目状态已延期如果两个“项目状态”拥有非常相似的 Key简单累加会把“开发中”和“已延期”都写进同一个方向。最后模型读出的可能不是最新状态而是两者混合后的结果。也就是说普通线性注意力会不断增加记忆却不知道如何修改记忆。Delta Rule 解决的正是这个问题。三、Delta Rule 最重要的不是写入而是覆盖错误记忆在写入新的 Value 之前Delta Rule 会先让当前状态做一次预测\hat v_tS_{t-1}^\top k_t这一步的意思是根据现在的记忆(k_t) 应该对应什么 Value然后计算预测误差e_tv_t-\hat v_t最后写入的不是完整的 (v_t)而是误差S_tS_{t-1}\beta_tk_te_t^\top展开后得到S_t S_{t-1} \beta_tk_t \left( v_t-S_{t-1}^\top k_t \right)^\top进一步整理S_t \left(I-\beta_tk_tk_t^\top\right)S_{t-1} \beta_tk_tv_t^\top这条公式初看很复杂但实际只做了两件事。第一步删除当前 Key 方向上的旧答案\left(I-\beta_tk_tk_t^\top\right)S_{t-1}其中 (k_tk_t^\top) 可以看成沿着当前 Key 方向形成的投影。这一项相当于告诉模型先把和当前 Key 相关的旧映射削弱。第二步写入新的 Key-Value 关系\beta_tk_tv_t^\top然后再把新的正确答案写入状态。因此Delta Rule 的本质并不是“记住更多”而是根据预测误差有选择地修正记忆。如果当前记忆已经能够正确预测 (v_t)那么误差接近 0本次更新就会很小。如果当前记忆完全错误模型才会进行较大的修改。这和机器学习中的梯度下降非常相似。实际上完全可以把状态矩阵 (S_t) 看成一个在推理过程中持续执行在线学习的小模型。这也是 KDA 最值得掌握的第一层思想Transformer 不一定只能通过显式 KV Cache 保存历史也可以在前向计算过程中不断训练一个临时记忆模型。四、KDA 的细粒度门控相当于给不同记忆设置不同保质期Delta Rule 能够纠错但还没有回答另一个问题一条信息应该保留多久自然语言中的信息并不具有相同的有效期。例如用户姓名长期有效 当前文件中期有效 上一条命令输出短期有效 刚才代码中的行号可能只在下一步有效如果所有信息都用相同速度衰减模型就会面临两种极端遗忘太快长期信息留不住遗忘太慢短期噪声清不掉。Gated DeltaNet 为状态增加了遗忘门S_t \alpha_t \left(I-\beta_tk_tk_t^\top\right)S_{t-1} \beta_tk_tv_t^\top其中 (\alpha_t) 决定旧状态保留多少。但一个标量门控意味着整个 Attention Head 中的所有特征都使用相同的遗忘速度。KDA 将它进一步细化为向量\boldsymbol{\alpha}_t\in[0,1]^{d_k}状态更新变成S_t \left(I-\beta_tk_tk_t^\top\right) \operatorname{Diag}(\boldsymbol{\alpha}_t) S_{t-1} \beta_tk_tv_t^\top这里的关键变化不是公式多了一个对角矩阵而是每个记忆通道都可以拥有自己的时间尺度。某些维度可以长期保存主题和身份信息某些维度可以快速跟踪最近动作还有一些维度专门用于清除局部噪声。这很像现代计算机系统中的多级缓存有些数据进入长期存储有些数据进入工作内存有些数据只存在于临时寄存器不同数据具有不同的淘汰策略。因此KDA 的门控并不是简单的“开或关”。它更像一套由模型自己学习的记忆生命周期管理系统。五、为什么 KDA 不需要像普通 Attention 那样显式保存位置传统 Attention 本身并不知道 Token 的顺序。如果不加入位置编码模型看到A 在 B 前面和B 在 A 前面可能缺乏区分顺序的依据。因此 Transformer 通常需要 RoPE 等位置编码。KDA 的情况有所不同。一条信息从第 (j) 个位置传播到第 (t) 个位置需要连续经过中间所有状态转移A_tA_{t-1}\cdots A_{j1}其中A_i \left(I-\beta_ik_ik_i^\top\right) \operatorname{Diag}(\boldsymbol{\alpha}_i)距离越远信息经历的衰减、覆盖和修正次数越多。因此KDA 天然包含三种信号信息出现的先后顺序信息距离当前 Token 的远近中间内容对这条记忆造成的影响。它不是像 RoPE 那样直接给 Token 加上一个旋转角度而是通过状态传播过程让位置影响自然进入记忆。可以把两者区别理解为RoPE显式告诉模型两个 Token 相距多远KDA让信息在传播过程中真实经历这段距离。这也是为什么混合架构中的部分 MLA 层可以不再承担全部位置建模任务。六、真正让 KDA 跑起来的不是公式而是 WY 表示法到这里KDA 在数学上已经很漂亮。但一个模型公式成立并不意味着它在 GPU 上一定高效。KDA 状态更新具有递归依赖S_tA_tS_{t-1}B_t计算 (S_t) 之前必须先获得 (S_{t-1})。这意味着如果严格按照公式逐 Token 执行整个过程依然是串行的。而 GPU 最不擅长的恰好就是大量细碎、连续依赖的小型计算。GPU 更喜欢的是大规模矩阵乘法规则的数据排列大批量并行任务可以交给 Tensor Core 的 GEMM。所以线性复杂度并不自动等于高速度。一个 (O(L)) 的算法如果每一步都需要启动小 Kernel、读取状态、等待同步最终完全可能跑不过经过高度优化的 (O(L^2)) Attention。WY 表示法的价值就是把递归公式重新翻译成 GPU 喜欢的语言。1. 先把序列拆成 Chunk假设将序列划分成长度为 (C) 的多个块[1,C],\quad[C1,2C],\quad\ldots执行方式由逐 Token 递归变成Chunk 之间传递状态Chunk 内部批量并行。也就是常说的\text{块间递归}\text{块内并行}Chunk 之间仍然有顺序关系但一个 Chunk 内部的多个低秩更新可以被合并。2. 把大量秩一更新压成矩阵运算KDA 中频繁出现I-\beta_tk_tk_t^\top其中 (k_tk_t^\top) 是秩一矩阵。连续多个 Token 会形成大量类似变换的乘积。WY 表示法能够把一系列低秩更新重新写成类似PD-KW^\top原本需要逐 Token 执行的操作可以被整理成几个大矩阵之间的乘法。于是状态更新可以从读取一个 Token 更新一次状态 等待完成 读取下一个 Token 再次更新变成收集一个 Chunk 构造若干矩阵 执行大规模 GEMM 一次完成 Chunk 内的大量计算这才真正利用了 GPU 的并行能力。所以 WY 表示法并没有改变 KDA 学习什么它改变的是 KDA 如何执行。一句话概括Delta Rule 决定模型怎样记忆WY 表示法决定这套记忆机制能不能高效运行。这是很多大模型论文中最容易被忽略的部分。一个架构最终能否落地往往并不取决于公式是否优雅而取决于公式能否被改写成少量大矩阵运算低通信开销规则的内存访问适合混合精度适合 Tensor Core。七、为什么 Kimi 没有彻底抛弃传统 Attention既然 KDA 可以压缩历史为什么还要保留 MLA原因很简单压缩一定意味着信息损失。KDA 把大量历史 Token 压进固定大小的状态矩阵。无论门控和更新机制多么先进固定维度的状态都不可能无损保存无限多条独立信息。当大量相似 Key 被写入时状态仍可能发生记忆碰撞旧信息覆盖精确字符串丢失远距离细节衰减多个相似实体相互干扰。传统 Attention 虽然成本高却拥有一种 KDA 很难完全替代的能力Query 可以直接访问某一个具体历史 Token。因此 Kimi 采用的是分层混合而不是非此即彼。一种典型的组合方式是3\text{ 层 KDA}1\text{ 层 MLA}这套结构中的职责非常清晰。KDA 负责大规模压缩历史保存近因和长期状态降低长上下文成本让大部分层不再依赖完整 KV Cache。MLA 负责精确内容寻址恢复被压缩后的细节直接访问全局 Token处理需要精确复制和匹配的任务。这就像一套计算机存储系统KDA 类似经过压缩的高速工作内存MLA 类似可以精确检索的长期存储索引。真正成熟的架构通常不是只使用一种机制而是让不同机制负责自己擅长的问题。八、AttnRes 解决的不是上下文长度而是“层越深信息越乱”KDA 解决的是 Token 序列方向的问题。但模型变深后还会出现另一类信息拥堵。传统 Transformer 的残差结构近似为x_{l1}x_lF_l(x_l)随着层数增加所有历史层的信息不断被累加进同一个残差流。这种结构的优点是容易训练梯度也更容易传播。但它存在一个隐含问题后面的层只能接收已经混合完成的结果无法重新选择某个早期层的表示。可以把传统残差流想象成一个不断开会的会议室。第 1 层说了一句话第 2 层在上面补充第 3 层继续补充。到了第 80 层所有人的内容已经混成一大段会议纪要。第 80 层无法直接说我现在只想重新听第 7 层和第 23 层的意见。AttnRes 做的事情就是让深层网络获得这种能力。它把前面不同层的输出看成一组可检索的表示h_1,h_2,\ldots,h_{l-1}当前层通过类似 Attention 的权重选择自己需要的历史层h_l\sum_{il}\alpha_{i\rightarrow l}h_i其中\alpha_{i\rightarrow l} \operatorname{Softmax} \left( q_l^\top k_i \right)这相当于把“模型深度”也变成一个可检索空间。传统残差是所有历史层默认相加。AttnRes 是当前层主动判断哪些历史层更重要。这带来了一个非常有意思的对称关系Attention 在 Token 维度选择信息AttnRes 在网络深度维度选择信息。所以 KDA 和 AttnRes 解决的是两个完全不同的方向\text{KDA横向管理时间和上下文}\text{AttnRes纵向管理层级和表征}这也是 K3 所谓重新设计 Transformer 扩展方式的核心之一。模型变强不一定只能增加层数还可以提高不同层之间的信息利用效率。九、2.8T 参数真正代表什么容量很大不代表每次全部工作K3 的另一个核心是超稀疏 MoE。MoE 最容易产生的误解是2.8T 参数就意味着每生成一个 Token 都要计算 2.8T 参数。实际上MoE 的设计恰恰是为了避免这件事。K3 拥有大量专家但每个 Token 只会被路由到少数专家。可以把它想象成一家拥有数百个专业部门的公司。当一个财务问题到来时不需要所有部门同时参与只需要调用财务专家表格专家合规专家少量共享专家。因此 MoE 追求的是\text{总容量很大}同时\text{单次激活规模可控}这就是总参数量与激活参数量必须分开理解的原因。1. MoE 节省的是计算不一定节省显存即使每个 Token 只激活少量专家全部专家的权重通常仍然需要被部署到设备或集群中。因此 MoE 面临三种不同成本计算成本每次只计算少数专家明显低于同规模 Dense 模型。权重存储成本大量专家权重仍然需要占据显存或内存。通信成本Token 需要被发送到专家所在的 GPU完成计算后再把结果返回。而第三项经常是实际部署中最麻烦的问题。2. MoE 真正的瓶颈往往是 All-to-All 通信假设不同专家部署在不同 GPU 上。Router 为某个 Token 选择专家后系统必须完成将 Token 表示发送到目标 GPU在目标专家上执行计算将结果发送回来按照路由权重重新合并。如果一个批次中的 Token 被分散到大量专家就会产生密集的跨卡通信。因此多张 GPU 能不能高效运行 MoE不只取决于总显存够不够还取决于GPU 间带宽网络拓扑All-to-All 实现专家放置策略Token 路由是否均匀是否存在热点专家。这也解释了为什么8 张 GPU 可以加载模型不等于 8 张 GPU 就能提供理想的生产吞吐。能够运行至少包含四个不同层次权重能够加载前向计算可以完成输出正确性可以验证并发、吞吐、延迟达到生产要求。前两项成立不代表后两项也成立。十、Stable LatentMoE 为什么要把专家计算放进更窄的空间普通 MoE 中Token 的完整隐藏状态会被发送到各个专家。隐藏维度越大跨 GPU 传输的数据量越大。Stable LatentMoE 的一个关键思路是将完整隐藏空间和专家处理空间分离。可以理解为\text{完整隐藏状态} \rightarrow \text{压缩到 Latent 空间} \rightarrow \text{专家计算} \rightarrow \text{映射回完整空间}这样一来专家之间传输和计算的数据宽度可以更小。它带来的价值不只是减少算力还包括降低专家通信量降低专家权重访存提高专家数量可扩展性缓解超稀疏 MoE 的部署压力。但专家越多、激活越稀疏路由越容易不稳定。例如大量 Token 可能集中选择少数热门专家导致某些 GPU 过载部分专家长期空闲通信拥堵吞吐下降专家专业化失败。因此 MoE 系统还必须配套负载均衡路由约束激活值控制数值稳定机制专家容量管理。K3 的价值不在于简单地把专家数量增加到 896而在于试图让极高稀疏度仍然保持可训练、可路由和可执行。十一、MXFP4 和 MXFP8低精度不是后期压缩而是训练阶段的共同设计当模型达到万亿参数级别时只靠稀疏激活仍然不够。权重体积、显存带宽和通信量依然极其庞大。这也是 MXFP4、MXFP8 和量化感知训练需要出现的原因。可以粗略理解为MXFP4使用更低精度表示部分模型权重MXFP8使用相对更高精度处理部分激活或计算量化感知训练在训练过程中让模型提前适应低精度误差。很多人把量化理解成模型训练完成后的“压缩包”。实际上超大模型中的低精度设计更像建筑阶段就确定的材料标准。如果先用高精度训练出模型再粗暴压到 4 bit可能出现权重分布被破坏离群值误差被放大专家路由发生偏移长序列状态误差不断累积输出质量明显下降。量化感知训练的意义是模型在训练时就知道未来要在低精度环境中运行并主动学会适应量化噪声。这体现了 K3 非常典型的系统设计思想模型结构、训练精度、Kernel 和部署硬件不能分开设计。真正能够大规模运行的模型从来不是论文公式完成之后再交给工程团队想办法部署。它必须从一开始就考虑参数如何存储激活如何表示状态使用什么精度哪些运算保留高精度哪些矩阵可以交给低精度 Tensor Core误差会不会沿长序列持续累积。十二、K3 最容易被低估的部分其实是 Agent Harness即使模型可以处理百万 Token也不代表它就能连续完成数小时的工程任务。这是理解 Agent 时最容易出现的误区上下文足够长Agent 就不会失忆。实际上一个长程任务的状态远远不止聊天记录。例如一个代码 Agent 正在开发系统它的真实状态可能包括已经修改的文件当前 Git 分支安装过的依赖启动中的服务数据库结构编译缓存环境变量运行失败的日志已完成的测试尚未完成的任务计划。这些信息并不全部存在于模型上下文中。因此一个真正的 Agent 状态应该写成\text{Agent State} \text{Model Context} \text{Environment State}模型上下文负责保存任务目标推理历史工具返回结果当前计划关键决策。环境状态负责保存文件进程数据软件依赖工作目录服务和网络状态。只保留前者Agent 可能还记得自己要做什么却发现文件和运行环境已经丢失。只保留后者环境虽然还在模型却不知道之前为什么这样修改。十三、为什么长程 Agent 必须有可恢复沙箱当 Agent 只执行一次查询时普通工具调用就够了。但当 Agent 连续工作数小时它一定会犯错。例如删除错误文件安装冲突依赖修改错误配置启动失控进程执行危险命令把原本能运行的项目改坏。如果系统没有检查点和恢复能力一次错误就可能让整个长程任务前功尽弃。因此真正的长程 Agent Harness 必须支持类似操作系统的能力Pause / Resume模型思考或等待推理结果时环境可以暂停减少闲置资源。Snapshot在关键步骤保存文件系统和运行环境状态。Rollback当后续尝试失败时回到最近的可靠状态。Fork复制当前环境让评估程序在副本中运行测试不污染原始工作空间。Checkpoint将长任务切分成多个可恢复阶段而不是一次性赌完整条轨迹成功。这时我们会发现Agent 已经不再只是“大模型加几个 API”。它实际上正在变成一个新的计算系统模型负责决策Harness 负责编排工具负责行动沙箱负责隔离Snapshot 负责恢复评估器负责判断结果是否正确。K3 的长程能力不能只归因于模型参数。没有相匹配的 Harness即使拿到相同权重真实任务表现也可能出现明显差异。十四、把 K3 的所有组件放在一起逻辑就清楚了K3 并不是把一堆新技术简单堆在一起。每个组件都在解决不同维度的信息爆炸问题。维度问题对应机制序列长度历史 Token 太多KDA精确检索压缩状态可能丢细节MLA网络深度历史层输出被混合AttnRes参数容量Dense 模型计算过高Stable LatentMoE权重体积万亿参数难以存储和传输MXFP4、MXFP8任务时长Agent 容易中断和失忆长程训练与 Harness环境连续性工具执行会改变外部世界Sandbox、Snapshot、Checkpoint从这个角度看K3 的架构主线可以被概括成四个词\text{压缩、选择、稀疏、恢复}KDA 压缩序列历史。AttnRes 选择历史层表示。MoE 稀疏激活专家参数。Harness 恢复长程任务状态。这四个机制背后的思想高度一致不让所有信息、所有参数和所有计算无差别地参与而是在每一步决定什么值得保留什么应该调用什么可以遗忘。十五、K3 对企业做 Agent 的真正启示企业通常很难直接训练一个 2.8T 模型但 K3 的很多思想并不要求拥有万亿参数。对于企业 Agent 平台最值得借鉴的是下面几件事。1. 不要把长上下文当成无限内存上下文越长噪声也越多。企业 Agent 应当区分当前任务工作记忆历史对话长期用户记忆外部知识库文件和环境状态。不是所有信息都应该直接塞进 Prompt。2. 建立分层信息检索可以参考 KDA 与 MLA 的组合思路高频、近期信息放在短期状态精确资料交给 RAG 和文件检索长期偏好进入持久化记忆环境变化通过工具实时读取。3. Harness 比 Prompt 更重要复杂 Agent 的稳定性主要取决于工具接口是否清晰状态是否结构化是否有超时和重试是否有任务检查点是否能判断工具执行成功是否支持失败恢复。一个超长系统提示词无法替代这些工程能力。4. 能执行不等于能交付Agent 输出了一段代码不代表任务完成。真正的完成条件应该来自外部验证测试是否通过文件是否生成服务是否启动数据是否正确写入页面是否能够访问业务规则是否满足。这也是长程 Agent 必须拥有评估器和验证闭环的原因。十六、关于 K3 官方案例需要区分三个证据层级对于芯片设计、编译器构建、科研复现和长时间自主工作等案例需要区分官方技术报告或演示第三方基准测试社区独立端到端复现。这三个层级不能混为一谈。评价此类复杂案例时应把官方演示、第三方基准与社区独立复现分开看待避免把不同证据层级混为一谈。同样8 张 MI355X 能够完成模型加载和正确性验证不等于已经证明该配置可以达到理想的企业生产吞吐。具体的并发能力、Token 吞吐、延迟、功耗和长期运行稳定性需要以实际部署测试为准。写在最后过去几年大模型的发展经常被概括成一句话参数越大能力越强。Kimi K3 展示了另一种更值得关注的方向。模型未来的竞争不只是比谁拥有更多参数而是比谁更会管理参数、记忆和计算。它需要知道哪些历史信息值得保留哪些旧映射应该被修正哪些中间层值得重新读取哪些专家应该被激活哪些计算可以使用低精度哪些任务状态必须被持久化哪些失败需要回滚并重新尝试。因此K3 最有价值的地方并不是 2.8T 这个数字。它真正表达的是大模型正在从一个被动执行矩阵乘法的网络逐渐变成一个能够主动分配记忆、路由能力、控制精度并管理任务状态的计算系统。当模型开始学习如何管理自己的计算扩展模型的方式也就不再只有“继续堆参数”这一条路。这可能才是 Kimi K3 真正值得研究的地方。