Files
llm-atlas/research/K3_ATTNRES_REDUCED_AUDIT.md
T
2026-07-30 07:35:29 +08:00

585 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Kimi K3 第四轮:Attention Residuals 缩小版独立机制实验审计
> 协议:`llm-atlas-k3-attnres-reduced-v1`
>
> 预注册:`research/K3_ATTNRES_REDUCED_PROTOCOL.md`
>
> 数据清单:`experiments/k3/attnres/manifest.json`
>
> 执行日期:2026-07-30
>
> 执行设备:NVIDIA GeForce RTX 5090;PyTorch `2.11.0+cu128`
## 0. 先说结论
这一轮没有伪装成“跑通了 K3”。它做的是一个刻意缩小、从零训练、可公开复查的
Attention Residuals(AttnRes)机制实验:
```text
3 个结构
× 3 个预先冻结的初始化 seed
× 每格 2,000 steps
× 每步 32 × 256 target bytes
= 9 个正式训练格,147,456,000 target bytes
```
三个结构共享完全相同的 16 个 Transformer blocks、32 个残差子层、初始公共参数、
训练窗口、优化器与验证集。唯一设计变量是“前面产生的 residual states 怎样供下一层读取”:
```text
Baseline:只读上一残差状态
Full AttnRes:对全部历史残差状态做按维 softmax 混合
Block AttnRes:每 4 个残差子层形成一个局部块,块间再混合
```
在冻结的 64 个验证窗口上,最终 bits per byte(BPC,越低越好)为:
| seed | Baseline | Full | Block | Full − Base | Block − Base |
|---:|---:|---:|---:|---:|---:|
| 2026073001 | 2.00054 | 1.98454 | 1.94788 | −0.01600 | −0.05266 |
| 2026073002 | 1.99844 | 1.98523 | 1.95709 | −0.01321 | −0.04135 |
| 2026073003 | 1.99842 | 1.98392 | 1.96503 | −0.01450 | −0.03339 |
| 三 seed 均值 | 1.99913 | 1.98457 | 1.95667 | **−0.01457** | **−0.04247** |
按照看结果前冻结的判据——三个 seed 同为负,并且均值不高于 `−0.010 BPC`——Full 与
Block 都得到:
> **directional support in this reduced protocol**
中文应该读成:
> 在这套缩小训练合同中,允许子层重新读取更早的残差状态,方向一致地改善了验证 BPC。
它**不应该**读成:
- 已复现 AttnRes 论文的大模型收益;
- 已运行 Kimi K3 checkpoint;
- 已证明 Block 一般优于 Full;
- 已得到同参数、同 FLOPs 或同 wall time 的优势;
- 三个 seed 可以支持总体显著性、置信区间或 scaling-law 外推。
本轮还有一个同样重要的反结果:预注册的“16 个 Transformer blocks 的核心参数梯度 RMS
变异系数”在本实验中,Baseline 为 `0.3447`,Full 为 `0.5087`,Block 为 `0.6306`。
在这个定义和尺度下,AttnRes **没有**表现出更均匀的跨深度梯度。这个结果与论文的大模型
梯度叙述不能直接对齐,网站必须把它作为边界而不是藏起来。
---
## 1. 为什么不是直接跑 K3
### 1.1 公开 checkpoint 的未决形状冲突
第三轮工件审计在 K3 第一层 KDA 中发现:
| 官方工件 | `A_log` 所要求或实际给出的形状 |
|---|---|
| `config.json` | `num_heads = 96` |
| Hugging Face remote code | 按 `num_heads` 构造,即 `[96]` |
| FlashKDA kernel API | `[H]`,K3 中应为 `[96]` |
| checkpoint safetensors header | `[128]` |
本轮再次检查了当前官方 Hugging Face / GitHub 工件,并额外检查当前 vLLM 与 SGLang
Kimi K3 loader。两者都按 local head 维构造和切分 `A_log`,没有公开 `128 → 96` 的转换规则。
因此,以下做法都会越过证据:
```text
裁掉最后 32 个值
把 128 强行 reshape 成别的语义
把 128 解释成 head_dim
绕过 loader 后把输出叫作“K3 forward”
```
在 Moonshot 给出转换合同、修订权重,或一个官方 loader 明确处理这 32 个额外值之前,
本站不制造“真实 K3 前向结果”。
### 1.2 为什么缩小版仍有价值
不能诚实执行 1.56 TB checkpoint,不等于只能停在架构示意图。AttnRes 的核心问题可以被
缩成一个更小、但仍可被证伪的问题:
> 在相同 Transformer 主干、相同输入窗口与相同初始化下,把“固定单位 residual
> connection”替换成“学习的历史 residual 混合”,短预算训练是否出现一致方向?
这个问题不依赖 KDA、MLA、MoE、MXFP4、视觉塔或完整 K3 参数。它只检验 AttnRes
的局部机制方向,并且可以把全部代码、清单、聚合指标和复现哈希开源。
---
## 2. 先冻结什么
首版协议在正式结果产生前冻结以下项目:
- 数据仓库、revision、config、split 拼接规则与 byte tokenizer;
- 模型层数、宽度、head 数、FFN 宽度、位置编码、RMSNorm 与激活函数;
- Baseline / Full / Block 的精确定义;
- 三个初始化 seed;
- 每格训练步数、batch、context 与总 target bytes;
- AdamW、学习率曲线、weight decay、gradient clipping;
- 验证步、固定验证窗口与主指标;
- 主对比、方向判据和“不能宣称什么”;
- 深度 RMS、混合权重与梯度诊断;
- smoke 与正式独立进程 replay 合同。
正式协议不是从本轮曲线倒推的。关键提交顺序为:
```text
9039de1 research: preregister reduced AttnRes study
e361753 research: lock reduced AttnRes model contract
f998720 research: add reduced AttnRes runner
1f20f81 research: freeze reduced AttnRes corpus
```
### 2.1 一次被公开保留的预训练故障
第一次 smoke 在 step 0 的验证 forward 后停止:
```text
RuntimeError:
view size is not compatible with input tensor's size and stride
```
原因是切片后的 target tensor 不连续,而 loss 路径用了 `.view()`。当时:
- 尚未执行一个 optimizer step;
- 没有正式结果文件;
- 没有任何条件的训练或最终 BPC 可供选择。
修复仅把 `.view()` 改为语义等价且支持非连续输入的 `.reshape()`:
```text
5f49906 fix: flatten noncontiguous AttnRes targets
```
随后三个结构分别完成两次独立 smoke,冻结字段逐字段 exact。这个故障不改变实验设计,
但应留在审计链中,避免“第一次就完美运行”的虚假叙事。
---
## 3. 数据合同:文本怎样变成 byte 任务
### 3.1 固定数据源
| 项目 | 固定值 |
|---|---|
| repository | `Salesforce/wikitext` |
| revision | `b08601e04326c79dfdd32d625aee71d232d685c3` |
| config | `wikitext-2-raw-v1` |
| 行处理 | `(text or "") + "\n"` |
| 编码 | UTF-8 |
| tokenizer | byte ID `0..255` |
| vocabulary | 256 |
拼接后的 split:
| split | bytes | SHA-256 |
|---|---:|---|
| train | 10,951,563 | `0ca7d3e74dbe44564ea5942b85232f1bbcb525c9cd481cd5d28a87ee90e7e9b4` |
| validation | 1,148,008 | `a42356f6a8ff1d25daf25ec9db49e10a537c265581b61c74604bb63231dee719` |
| test | 1,292,014 | `bfe9eb16ab9987fb88bde4ea9a30a00f2a45db01dfc14bad78d05325789c4f12` |
这里的 byte tokenizer 不是为了追求最佳语言模型性能,而是为了移除另一个潜在变量:
不同 BPE 模型、词表和 normalization。BPC 也因此可以直接比较,而不受 tokenization
长度变化影响。
### 3.2 无状态窗口计划
训练窗口不靠进程内 RNG 顺序产生。对每个:
```text
architecture + seed + step + batch row
```
协议用 SHA-256 派生 train start offset。三种结构在同一 seed 下使用相同窗口;结构名不进入
窗口选择的有效随机盐。冻结计划包含 192,000 个起点,SHA-256 为:
```text
81521a70ec61f3717968f160cb711e50c5f52a665a6961538d339360cb695f48
```
固定 64 个验证窗口 tensor hash:
```text
5f71fda757fc75010ed16e7636bc394c69f55b34a3713b3b5a7ef8e03eae3c20
```
固定 16 个诊断窗口 hash:
```text
d970af9b0c656c9826f369b5fe6e3869a6f6cfeccfa5a922fe94ed1d24b86818
```
---
## 4. 模型合同:只改变 residual 读取拓扑
### 4.1 公共主干
| 项目 | 值 |
|---|---:|
| Transformer blocks | 16 |
| residual sublayers | 32(每 block attention + FFN) |
| model width | 192 |
| attention heads | 6 |
| head dimension | 32 |
| SwiGLU hidden | 768 |
| context | 256 bytes |
| dropout | 0 |
| position | learned absolute embedding |
| norm | pre-RMSNorm + final RMSNorm |
| attention softmax | causal, float32 |
| embedding / LM head | tied |
Attention projection 与 SwiGLU 都不使用 bias。三个结构的公共 core 参数均为
`9,541,824`,每个 seed 的公共参数初始化哈希在三种结构间 exact。
### 4.2 Baseline
普通 residual 子层:
```text
x_(l+1) = x_l + F_l(RMSNorm(x_l))
```
它只保留一个随深度持续累积的 residual stream。
### 4.3 Full AttnRes
第 `l` 个子层先对从 embedding 到当前深度的全部 residual states 做学习混合:
```text
α_l = softmax(q_l · RMSNorm(states))
x̃_l = Σ_i α_(l,i) state_i
state_(l+1) = F_l(RMSNorm(x̃_l))
```
`q_l` 是按 hidden dimension 学习的 pseudoquery,初始化为 0,所以初始 softmax 为均匀
读取。最后还有一个 output mixer,把 33 个可见 sources 混成 LM head 的输入。
### 4.4 Block AttnRes
32 个 residual sublayers 被分成 8 块,每块 4 层:
```text
块内:新 branch state 做普通局部累加
块边界:对历史块状态做学习混合,产生下一块输入
```
它保留“可以回读历史”的机制,同时把 Full 随深度增长的状态集合限制在块级。
### 4.5 参数公平与计算不公平
| 结构 | core | mixer | total | 相对 Baseline mixer overhead |
|---|---:|---:|---:|---:|
| Baseline | 9,541,824 | 0 | 9,541,824 | 0 |
| Full | 9,541,824 | 12,672 | 9,554,496 | 0.1328% |
| Block | 9,541,824 | 12,672 | 9,554,496 | 0.1328% |
这是近似同参数,不是同 FLOPs。当前教学实现用 PyTorch eager 保存和混合历史 states,
没有使用论文的大模型优化 kernel,所以它适合机制观察,不适合推断生产吞吐。
---
## 5. 训练与主指标
### 5.1 每格预算
```text
2,000 steps
× batch 32
× context 256 target bytes
= 16,384,000 target bytes / run
```
优化器:
```text
AdamW β=(0.9, 0.95), ε=1e-8
peak LR=3e-4, min LR=3e-5
100-step warmup + cosine decay
weight decay=0.1 for ndim>=2
global grad clip=1.0
BF16 autocast
```
验证发生在 `0, 100, 250, 500, 1000, 1500, 2000` steps。主指标只使用 step 2000
的固定验证 BPC;曲线用于帮助理解,不用于重新选择终点。
### 5.2 判据为什么这么保守
只有三个 seed,不能可靠估计总体方差或给出有意义的 population confidence interval。
所以预注册不用 p-value,而只问两个简单问题:
```text
三个 paired deltas 是否同方向?
mean delta 是否至少达到 0.010 BPC?
```
如果答案都是“是”,只写作本协议内的 directional support / concern。它是一道防止
夸大结论的阈值,不是一个通用显著性标准。
### 5.3 正式结果
Full 的三组配对差:
```text
−0.015996
−0.013207
−0.014498
mean = −0.014567 BPC
```
Block 的三组配对差:
```text
−0.052660
−0.041349
−0.033388
mean = −0.042466 BPC
```
两组都满足预注册的方向支持规则。Block 相对 Full 的均值差为 `−0.027898 BPC`,三个
seed 也同为负;但“Block − Full”不是预注册主判据,而且本实现的计算图与优化效率不同,
所以它只适合描述,不升级成一般性排名。
---
## 6. 它花了多少计算与显存
排除每次前 20 个计时 warmup steps 后,三个 seed 的均值:
| 结构 | mean step | 相对 Baseline | peak allocated | 相对 Baseline |
|---|---:|---:|---:|---:|
| Baseline | 21.62 ms | 1.00× | 3.04 GB | 1.00× |
| Full | 146.81 ms | 6.79× | 14.26 GB | 4.70× |
| Block | 54.63 ms | 2.53× | 6.52 GB | 2.15× |
这张表应该怎样读:
- Full 在教学实现中为每层保留并读取更多历史 states,因此最贵;
- Block 把可见历史限制在块级,成本明显下降;
- 时间与显存是“这份 PyTorch eager 实现 + RTX 5090”的观测;
- 不能把 6.79× / 2.53× 外推到论文 kernel、K3 训练系统或生产推理;
- BPC 改善不能被写成同 FLOPs 改善。
---
## 7. 看 residual stream:Block 为什么呈现锯齿
Baseline 的 stream-state RMS 从平均 `0.0661` 增到 `0.2110`:普通 residual
connection 把分支输出一路累积。
Block 的前 12 个 partial-state RMS 是:
```text
0.0334 0.0598 0.0967 0.1181
0.0509 0.0569 0.0745 0.0815
0.0532 0.0581 0.1079 0.1158
```
每四个值形成一个局部块:
```text
块内:逐层累积,RMS 通常上升
块间:重新从历史块状态混合,partial stream 被重置
```
所以曲线不是训练不稳定造成的随机锯齿,而是 Block 拓扑的直接几何痕迹。完整 32 点向量、
三个 seed 的 min / mean / max 均进入公开 JSON。
Full 的 layer-input RMS 则从 `0.0544` 降到 `0.00866`。这不等于信息“消失”:
每层输入是多个经过 RMSNorm 的历史 states 的学习加权和,混合可以通过方向抵消改变
合成向量的 RMS。只看单个标量不能判断信息保留量。
---
## 8. mixer 权重:一个事后但有解释力的观察
Full 在第 31 个 residual sublayer 的 branch-output RMS 平均达到 `1.4964`,是 32 层中
最大值。但最终 output mixer 给这个 source 的平均权重只有:
```text
observed = 0.002794
uniform = 1 / 33 = 0.030303
ratio = 0.0922× uniform
```
一个直观解释是:输出混合器学会了压低这个幅值突增的 source,而不是被迫把它以单位
residual 权重传到输出。
必须同时保留两个限制:
1. “最大 spike 对应低权重”是看完完整 trace 后挑出的描述;
2. 它不是预注册 endpoint,不能作为独立确认性证据。
网站会明确标注 **post-hoc descriptive callout**,并展示完整深度权重图,让读者看到它
不是从被隐藏的其他 source 中挑出的孤立数字。
---
## 9. 梯度结果没有复现论文叙述
预注册诊断对每个 Transformer block 的公共 core 参数计算 gradient RMS,再求 16 个
block 间的 coefficient of variation:
| 结构 | seed 1 | seed 2 | seed 3 | mean CV |
|---|---:|---:|---:|---:|
| Baseline | 0.3537 | 0.3409 | 0.3396 | **0.3447** |
| Full | 0.4890 | 0.5100 | 0.5272 | **0.5087** |
| Block | 0.6622 | 0.6849 | 0.5448 | **0.6306** |
CV 越低,按这个特定定义才越均匀。因此本轮观察是:
```text
Baseline < Full < Block
```
这和 AttnRes 论文在大模型训练中报告的、更平坦的跨深度梯度幅值叙述不是同一个结果。
合理边界包括:
- 本实验只有 width 192、16 blocks、2,000 steps;
- 本指标是“按 block 汇总的核心参数 gradient RMS”;
- 论文图可能观察 activation / residual-output gradients,聚合对象并不相同;
- byte-level WikiText-2 与论文的大规模训练数据、优化器状态和训练阶段不同。
正确表述是:
> 本缩小实验的主 BPC 对比支持 AttnRes 的方向,但预注册的核心参数梯度均匀性指标不支持
> 论文式叙述;这提示该解释可能依赖尺度、指标定义或训练阶段,需要后续专门实验。
不正确的做法是改换一个看起来更漂亮的梯度统计后,只展示新指标。
---
## 10. 复现链
### 10.1 smoke
三个结构各执行两次独立的 20-step smoke。以下字段对每个结构都 exact:
```text
manifest
model
optimizer
hashes
evaluations
training_history
diagnostic
environment
```
### 10.2 正式独立进程 replay
预先指定:
```text
architecture = block
seed = 2026073001
steps = 2000
```
正式格与 fresh-process replay 的最终 BPC 都是:
```text
1.947877975922777
```
上面的八组冻结字段全部 exact。计时不要求 exact,实际也不相等,因为 wall time 受系统
调度影响。
| 文件 | SHA-256 |
|---|---|
| formal block / seed 1 | `5df870369d9a86ccb4ba4191fbd1d6f3642893dd47a60f8f6d1143006bdfbdaf` |
| fresh replay | `e74d3323e5fe31378bb8aad7a8efa2fb91995cd7224c158cf03006466cdea2a7` |
### 10.3 公开产物
| 产物 | 内容 | SHA-256 |
|---|---|---|
| `src/data/k3-attnres-reduced.json` | 9 个完整 run + 聚合 + 复现记录 | `44f8622654d32485f8d6e698c02ba1365ddffb10cbd73db0294136d0bd93ce88` |
| `src/data/k3-attnres-reduced-compact.json` | 网站所需完整曲线与诊断 | `44864d48eddb2ae5887fba4b74f63b5a3d6a23497886ee307decf5b4f45d9faf` |
| `experiments/k3/attnres/reproduction.json` | smoke、初始化与 replay audit | `545543b7e4a970ca3bc0e6246610a32fb53ec3d9546a98e0f17f38d7121918a2` |
聚合器在同一批只读 run 文件上再次运行后,三个文件 SHA-256 全部不变。
---
## 11. 证据等级
### A. 本轮可直接主张
- 冻结协议下 9 个训练格的最终 BPC 与完整验证曲线;
- Full / Block 相对 Baseline 的三 seed 配对方向;
- 当前实现的参数量、实测 step time 与 peak allocated memory;
- 固定诊断窗口上的 residual RMS、mixer 权重与参数梯度统计;
- smoke 与指定正式格的独立进程 exact replay;
- 数据、窗口、初始化和产物 SHA-256。
### B. 只能作为机制解释
- Block 的四层锯齿与块边界重混合一致;
- Full mixer 可能通过降低权重抑制高 RMS source;
- Full / Block 的短预算优势可能来自更灵活的深度路由。
这些解释与观测相容,但不是唯一因果解释。
### C. 本轮明确不主张
- K3 checkpoint 已成功 forward 或训练;
- 论文表格、Figure 4–8 或 paper-scale scaling 已复现;
- AttnRes 在任意模型、数据和预算上都降低 loss;
- Block 一般优于 Full;
- 梯度在 AttnRes 中更均匀;
- 同 FLOPs、同 wall time 或生产系统的性价比优势;
- 三个 seed 支持总体统计显著性。
---
## 12. 下一步
这个实验把“能运行的独立机制 probe”完成了,但真实 K3 仍有两道门:
1. `A_log [128]` 的官方转换或权重修订;
2. 能加载完整或官方切分 K3 的受支持执行环境。
AttnRes 本身的下一轮也不应只增加 seed。优先级更高的是:
- 对齐论文实际使用的 activation / output-gradient 诊断定义;
- 增加 depth 与训练预算,检验梯度结论是否随尺度翻转;
- 做 mixer 计算的优化实现,再讨论同 wall-time 或近似同-FLOP 对比;
- 冻结一个更强 tokenizer / corpus 后检查 byte-level 结论是否保持;
- 将 Block size 作为预注册变量,而不是看完结果后挑 4。
---
## 13. 一手来源
- [Kimi K3 Technical Report](https://arxiv.org/abs/2607.24653)
- [Kimi K3 official checkpoint](https://huggingface.co/moonshotai/Kimi-K3)
- [Kimi K3 official code repository](https://github.com/MoonshotAI/Kimi-K3)
- [Attention Residuals](https://arxiv.org/abs/2603.15031)
- [Official Attention Residuals implementation](https://github.com/MoonshotAI/Attention-Residuals)
- [WikiText dataset repository](https://huggingface.co/datasets/Salesforce/wikitext)
- [vLLM Kimi K3 implementation](https://github.com/vllm-project/vllm)
- [SGLang Kimi K3 implementation](https://github.com/sgl-project/sglang)
Grok CLI 在协议冻结前只承担一次对抗式方法审阅:它提出锁定参数容量、残差拓扑、数据顺序、
指标定义和复现合同的检查项。所有论文事实和实验结论仍由一手来源、冻结代码与本地运行产物
支持;Grok 输出不作为证据来源。
---
## 14. 发布与回归证据
- 功能源提交:`4ce780d`;
- 不可变镜像:`docker.k1412.top/wuyang/llm-atlas:20260729T233142Z-4ce780d`;
- OCI index digest:`sha256:6e89f802f07fd8dacb55a734f58b5e6d8cbe143d03b9b11cde87cc3c4f25f582`;
- NAS:Compose Manager project `llm-atlas`,`12010 → 8080`,容器 `healthy`、0 次重启;
- 代理:NPM host `31`,certificate `41`,forward `100.94.16.3:12010`;
- 公网:21 / 21 页面路由返回 200,HTTP → HTTPS 301,HTTPS/2 health 200;
- 静态资产:gzip 与 `public, max-age=604800, immutable` 保持生效;
- 门户:`LLM ATLAS` / `projects` / order `180`;
- 回归:冻结数据检查、Astro 零诊断、站内引用检查、AttnRes 专项与 K3 全量生产 Chrome
全部通过;桌面与 390px 移动端零文档级溢出、零运行时异常;
- 回滚镜像:`20260729T221654Z-975ed3d`。