diff --git a/PROGRESS.md b/PROGRESS.md index e1ea4a6..e26d7ed 100644 --- a/PROGRESS.md +++ b/PROGRESS.md @@ -7,11 +7,12 @@ | 工作流 | 状态 | 完成度 | 下一检查点 | |---|---:|---:|---| | 研究框架与规范 | 进行中 | 72% | 给 125 篇索引补充逐篇精读层级 | -| 网站设计系统 | 进行中 | 86% | 打印样式与更多通用可视化组件 | +| 网站设计系统 | 进行中 | 89% | 打印样式与更多通用可视化组件 | | Kimi K3 深读 | 进行中 | 55% | 扩写 scaling / infra 逐图笔记 | | Transformer 基础 | 进行中 | 52% | 矩阵形状动画与手算练习 | -| DeepSeek 专题 | 进行中 | 54% | MLA 与 GRPO 完整公式推导 | -| 引用与事实检查 | 进行中 | 48% | 自动化外链复查与来源等级扩展 | +| DeepSeek 专题 | 进行中 | 61% | GRPO 完整公式与训练轨迹推导 | +| 长上下文专题 | 完成首版 | 72% | 真实模型配置、内核细节与失败案例 | +| 引用与事实检查 | 进行中 | 54% | 自动化外链复查与来源等级扩展 | | 开源仓库 | 已完成首版 | 100% | 持续提交研究与网站迭代 | | k1412 部署 | 已完成首版 | 100% | 每轮发布保留不可变镜像与回滚点 | @@ -26,17 +27,19 @@ - [x] 使用 Grok CLI 检索并形成约 95 篇一手论文的补充路线,主代理已回查关键来源。 - [x] 完成首批 125 篇关键论文索引,覆盖 12 个专题与 Kimi/DeepSeek 聚光主线。 - [x] 完成可检索、可按专题筛选的论文库页面。 -- [x] 完成 K3、Transformer 基础与 DeepSeek 三篇首版长文。 -- [x] 完成 K3 三轴架构、Self-Attention 实验与 DeepSeek 谱系三张原创交互图。 -- [x] Astro 类型检查、生产构建、7 个内部路由和桌面/移动端视觉检查通过。 +- [x] 完成 K3、Transformer 基础、DeepSeek 谱系与长上下文四篇首版长文。 +- [x] 完成 K3 三轴架构、Self-Attention 实验、DeepSeek 谱系与长上下文成本实验室四张原创交互图。 +- [x] 完成长上下文首版:五张成本账、26 篇一手论文、10+ 机制图与 8 策略交互实验室。 +- [x] 核验 FlashAttention、DeepSeek-V2/V3.2/V4、Kimi Linear/K3 等六份论文原文,并建立长上下文研究账本。 +- [x] Astro 类型检查、生产构建、8 个内部路由和桌面/移动端视觉检查通过。 - [x] 创建 `wuyang/llm-atlas` 公开仓库,匿名 API 确认 `private: false`。 -- [x] 本地生产镜像通过健康检查与全部 7 个页面路由烟雾测试。 +- [x] 本地生产镜像通过健康检查与全部 8 个页面路由烟雾测试。 - [x] 通过 Unraid Compose Manager、Nginx Proxy Manager 与 HTTPS 发布首版。 ## 正在进行 -- [ ] 长上下文 / 高效注意力专题深度正文。 - [ ] MoE 路由模拟器与通信成本账本。 +- [ ] 长上下文专题的真实模型配置对比、内核细节与失败案例二轮深化。 ## 研究账本 @@ -49,6 +52,8 @@ | 2026-07-28 | 首批论文库收录 125 篇,按问题与专题多标签组织 | 论文库承担发现入口,专题正文承担深度精读与机制复核 | | 2026-07-28 | 源码公开到 `git.k1412.top/wuyang/llm-atlas` | 路线、进度、研究方法和内容变更均可追踪 | | 2026-07-28 | 站点使用不可变镜像与 Compose Manager 部署 | 每次发布保留明确版本、健康检查和回滚点 | +| 2026-07-28 | 长上下文按计算、缓存、位置、状态容量、系统五张账单组织 | 避免把 FlashAttention、位置外推和“记住更久”混成同一个问题 | +| 2026-07-28 | 交互缓存数字统一标记为教学估算 | 展示增长规律,不冒充任一模型的真实线上显存基准 | ## 未决问题 diff --git a/README.md b/README.md index ea0ce0d..89ab38f 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,8 @@ - 证据与写作规范:[research/METHODOLOGY.md](./research/METHODOLOGY.md) 首个里程碑包含 16 专题学习地图、125 篇关键论文索引、Kimi K3 完整导读、 -Transformer 基础、DeepSeek 技术谱系,以及三张原创交互可视化。其余专题按进度账本持续扩建。 +Transformer 基础、DeepSeek 技术谱系、长上下文与高效注意力深度专题,以及四张原创交互可视化。 +其余专题按进度账本持续扩建。 ## 本地开发 diff --git a/ROADMAP.md b/ROADMAP.md index 81bece4..6d88eea 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -49,6 +49,9 @@ Conditional Computation → Sparsely-Gated MoE → GShard/Switch → DeepSeekMoE 稀疏注意力、线性注意力、FlashAttention、MQA/GQA、MLA、状态空间模型、Delta Rule、Kimi Linear/KDA、混合注意力与 1M 上下文。 +首版已发布:以“计算、缓存、位置、状态容量、系统”五张账单串起 2019–2026 的 26 篇一手论文, +包含 10+ 张原创机制图和 Full MHA / Flash / GQA / MLA / DSA / KDA / K3 / DeepSeek-V4 交互比较实验。 + ### 08. 大规模训练系统 数据/张量/流水线/序列/上下文/专家并行,ZeRO,Megatron,通信重叠,容错;对比 DeepSeek DualPipe/DeepEP 与 K3 MoonEP。 diff --git a/research/LONG_CONTEXT_RESEARCH.md b/research/LONG_CONTEXT_RESEARCH.md new file mode 100644 index 0000000..96f5949 --- /dev/null +++ b/research/LONG_CONTEXT_RESEARCH.md @@ -0,0 +1,99 @@ +# 长上下文与高效注意力:研究账本 + +最后核验:2026-07-28 + +## 研究问题 + +“上下文窗口变长”至少包含五个彼此独立的问题: + +1. **二次计算**:标准 softmax attention 的配对计算随序列长度平方增长。 +2. **KV Cache**:自回归推理需要为历史 Token 保存逐层 K/V,缓存宽度和序列长度共同决定显存。 +3. **位置外推**:能接受更长输入不等于能在训练长度之外正确使用位置。 +4. **有限状态表达**:线性注意力或 SSM 用固定状态压缩历史,获得常数缓存,也因此存在容量上限。 +5. **系统实现**:单算子变快以后,跨设备序列切分、状态传递、前缀缓存和请求调度仍可能成为瓶颈。 + +正文必须分别记账,不能把“更省显存”“更少 FLOPs”“更快墙钟时间”和“更强长程检索”混成一个“高效”。 + +## 已核验的一手来源 + +本地只读研究缓存位于 `research/sources/long-context/`,PDF 与抽取文本不进入 Git。 + +| 论文 | 本地原文 | 本轮核验重点 | +|---|---:|---| +| FlashAttention (2205.14135) | 34 页 | exact attention;减少 HBM IO;仍有二次算术,反向重算甚至增加 FLOPs | +| DeepSeek-V2 (2405.04434) | 52 页 | MLA 低秩联合 KV 压缩、权重吸收、decoupled RoPE、缓存维度 | +| Gated DeltaNet (2412.06464) | 22 页 | delta rule 与 scalar gate 的组合 | +| Kimi Linear (2510.26692) | 28 页 | KDA、3:1 KDA/MLA、NoPE、混合比例消融、1M 解码实验 | +| DeepSeek-V3.2 (2512.02556) | 23 页 | Lightning Indexer、top-k=2048、两阶段稀疏训练 | +| DeepSeek-V4 (2606.19348) | 58 页 | CSA/HCA、压缩率、top-k、局部窗口、Partial RoPE、1M 成本 | +| Kimi K3 (2607.24653) | 47 页 | 69 KDA + 24 Gated MLA、NoPE、1M curriculum、FlashKDA/KCP/服务 | + +辅助检索使用 Grok CLI Headless 模式扩大覆盖;正文数字只采纳上述论文、arXiv 元数据或作者官方仓库能够回查的内容。 + +## 关键事实与边界 + +### FlashAttention + +- 它是 **IO-aware exact attention**,不是近似注意力。 +- 它不把完整 `N × N` attention matrix 写入 HBM,使用分块和 online softmax 在 SRAM 中累计。 +- 理论 attention 算术仍为二次;论文明确说明反向重算会增加 FLOPs。 +- 论文报告的 `7.6×` 是 GPT-2 上 attention kernel 的加速,不应写成所有模型端到端都快 7.6×。 +- 同文端到端数字包括 GPT-2 约 `3×`、Long Range Arena 约 `2.4×`,必须带实验语境。 + +### MQA / GQA / MLA + +- MQA/GQA 缩小 **KV 头数**,历史 Token 数仍是 `L`。 +- MLA 为每个 Token 缓存联合低秩 latent `c_t^KV`,内容 K/V 的 up-projection 可分别吸收到 Query 与输出投影。 +- 如果直接对内容 Key 使用 RoPE,位置相关旋转矩阵会阻断权重吸收。因此 DeepSeek-V2 用单独的 RoPE Query/共享 Key 分支。 +- DeepSeek-V2 的缓存为每层每 Token `(d_c + d_h^R)` 个元素;报告配置为 `d_c=512`、`d_h^R=64`。 +- `KV Cache −93.3%` 与 `最大生成吞吐 5.76×` 是相对 DeepSeek 67B 的整模型报告数字,不是 MLA 对所有 MHA 的普适常数。 + +### 线性注意力、Delta Rule 与 KDA + +- 核化线性注意力把历史压进固定矩阵状态,解码缓存不再随 `L` 增长。 +- 固定状态不是无损的全历史表;精确检索和多关系绑定会受有限容量约束。 +- Delta Rule 先擦除状态中与当前 Key 对齐的旧预测,再写入 Key—Value 关系。 +- Gated DeltaNet 加入遗忘 gate;KDA 进一步把 gate 细化到 Key 通道。 +- Kimi Linear 的原文消融支持 `3 KDA : 1 MLA`:训练/验证 PPL 为 `9.23 / 5.65`,优于测试的 `0:1、1:1、7:1、15:1`。 +- Kimi Linear 报告同时区分了约 `2.3×` 的单请求 1M 解码加速和通过缓存节省扩大 batch 后最高约 `6.3×` 的理论吞吐;正文不可混写。 + +### DeepSeek Sparse / Compressed Attention + +- DeepSeek-V3.2 的 DSA 用 Lightning Indexer 为主 MLA 选择历史 Token;主 attention 每 Query 选择 `2048` 个 KV。 +- Indexer 先在 dense attention 下单独训练 `2.1B` Token,再与主模型稀疏续训 `943.7B` Token。 +- V3.2 窗口是 `128K`,不是 `1M`。 +- DeepSeek-V4 的 CSA 先每 `m=4` 个历史条目压成一个,再稀疏选择;V4-Flash top-k 为 `512`,V4-Pro 为 `1024`。 +- HCA 每 `m'=128` 个条目压成一个,不再做稀疏选择。 +- 两者都增加 `128` Token 的未压缩滑窗分支,并只在向量末 `64` 维使用 Partial RoPE。 +- V4-Pro 为 `61` 层、`1.6T/49B activated`;V4-Flash 为 `43` 层、`284B/13B activated`。 +- 在 1M 语境下,报告给出 V4-Pro 相对 V3.2 的单 Token FLOPs `27%`、KV Cache `10%`;V4-Flash 分别为 `10%` 和 `7%`。 + +### Kimi K3 + +- K3 的 93 个主干层由 `69 KDA + 24 Gated MLA` 构成;基本节奏是三层 KDA 后一层 MLA,并以 MLA 收尾。 +- 全部 MLA 使用 NoPE。位置和近因偏置主要由 KDA 的递归 gate/decay 提供,MLA 专注全局内容寻址。 +- 上下文 curriculum:预训练从 `8K → 64K`,cooldown 从 `256K → 1M`。 +- KDA 用固定大小状态替代增长 KV;24 个 MLA 层仍保留随长度增长的压缩缓存,所以 K3 不是“完全无 KV Cache”。 +- 系统侧必须同时阅读 FlashKDA、KDA Context Parallelism、混合 KDA/MLA prefix cache、外置 KV Pool 和 cache-aware scheduling。 + +## 因果主线 + +```text +全连接注意力 +├─ 计算太重:局部/稀疏 → Flash(IO) → DSA → CSA/HCA +├─ 缓存太宽:MQA → GQA → MLA +├─ 位置外推:相对位置 → RoPE/ALiBi → PI/YaRN → NoPE+递归位置 +├─ 历史太长:线性 attention → fast weight → DeltaNet/GDN → KDA +└─ 单卡装不下:Transformer-XL → Ring/Context Parallel → KCP/服务缓存 + +汇流: +Kimi K3 = 3×固定状态 KDA + 1×NoPE 全局 MLA + KDA 系统协同 +DeepSeek-V4 = CSA 压缩后稀疏 + HCA 重压缩后稠密 + 局部窗口 +``` + +## 正文的证据标注 + +- `论文事实`:公式、结构或数字可在对应原文定位。 +- `教学估算`:用统一假设计算的 KV/状态大小,不等于作者报告的生产显存。 +- `机制推断`:从公开结构推出的代价或能力边界,必须明确写“推断”。 +- `未知`:训练数据配比、未公开 kernel 细节和线上集群参数不猜测。 diff --git a/src/components/ContextStrategyLab.astro b/src/components/ContextStrategyLab.astro new file mode 100644 index 0000000..0fa203b --- /dev/null +++ b/src/components/ContextStrategyLab.astro @@ -0,0 +1,981 @@ +--- +const strategies = [ + { + id: "mha", + label: "Full MHA", + kicker: "全连接 · 全缓存", + summary: "每个 Query 精确比较全部历史 Token;每层为每个历史 Token 保存所有 KV 头。", + solves: "表达力基线", + leaves: "二次计算 + 最宽 KV", + }, + { + id: "flash", + label: "Flash", + kicker: "全连接 · IO 优化", + summary: "连接关系与 Full MHA 完全相同,只是不再把完整注意力矩阵写进 HBM。", + solves: "显存读写与中间矩阵", + leaves: "理论 FLOPs 仍为二次", + }, + { + id: "gqa", + label: "GQA", + kicker: "全连接 · 共享 KV", + summary: "Query 头仍可很多,但一组 Query 共享一组 K/V;历史条目不减少,缓存宽度变窄。", + solves: "KV 头数", + leaves: "序列仍逐 Token 增长", + }, + { + id: "mla", + label: "MLA", + kicker: "全连接 · 潜变量 KV", + summary: "每个历史 Token 只缓存低维联合 latent;通过权重吸收避免在解码时展开完整多头 K/V。", + solves: "每 Token KV 宽度", + leaves: "全局两两计算仍在", + }, + { + id: "dsa", + label: "DSA", + kicker: "索引 · Top-k 稀疏", + summary: "轻量 Indexer 从全部 latent KV 中选出少量候选,再让主注意力只读这些候选。", + solves: "主注意力连接数", + leaves: "仍需索引和保存历史 latent", + }, + { + id: "kda", + label: "KDA", + kicker: "递推 · 固定状态", + summary: "历史被持续写入固定矩阵状态;Delta Rule 擦除旧关联,通道 gate 控制遗忘。", + solves: "长度相关 KV 与二次配对", + leaves: "有限状态容量", + }, + { + id: "k3", + label: "K3 Hybrid", + kicker: "3×KDA + 1×MLA", + summary: "三层用固定状态做廉价混合,每四层用一次 NoPE MLA 重新获得全局内容寻址。", + solves: "效率与全局表达折中", + leaves: "MLA 层仍有增长缓存", + }, + { + id: "v4", + label: "V4 Hybrid", + kicker: "CSA ↔ HCA", + summary: "CSA 先 4:1 压缩再 Top-k;HCA 128:1 重压缩后读全部,并都保留局部滑窗。", + solves: "序列维缓存与连接数", + leaves: "压缩有损且系统复杂", + }, +]; + +const size = 20; +const matrix = Array.from({ length: size * size }, (_, index) => ({ + row: Math.floor(index / size), + col: index % size, +})); + +const contexts = [ + { label: "4K", value: 4096 }, + { label: "32K", value: 32768 }, + { label: "128K", value: 131072 }, + { label: "1M", value: 1048576 }, +]; +--- + +
+
+
+

INTERACTIVE / ATTENTION STRATEGY LAB

+

“支持长上下文”到底改了哪一笔账?

+
+

+ 上半区看信息连接,下半区看缓存。切换方法时,注意“连接变少”和“缓存变窄”不是一回事。 +

+
+ +
+ {strategies.map((strategy, index) => ( + + ))} +
+ +
+
+
+ 01 / INFORMATION ACCESS + FULL MHA · 因果全连接 +
+ +
+
QUERY
+
+ {matrix.map(({ row, col }) => ( + + ))} +
+ FIXED STATE + St + 历史被压进固定矩阵,不再保留逐 Token 地址 +
+
+
HISTORICAL KEY / VALUE
+
+ + + +
+
主算子直接读取
+
压缩/全局补充路径
+
局部窗口
+
+
+ +
+ {strategies.map((strategy, index) => ( + + ))} +
+ 怎样读这张图 +

+ 横轴是可被读取的历史,纵轴是当前 Query。图只画 20 个位置,展示的是连接模式,不代表论文真实头数或窗口大小。 +

+
+
+
+ +
+
+
+

02 / CACHE BUDGET

+

把上下文拖到一百万 Token

+

+ 统一教学模型:64 层、64 个 Query 头、head dim 128、BF16、GQA 8 个 KV 头、MLA latent 576。 + 数字用于比较增长规律,不是任何具体模型的线上显存报告。 +

+
+ +
+
+ CONTEXT LENGTH + 4K + 4,096 tokens +
+ +
+ {contexts.map((context) => {context.label})} +
+
+
+ +
+
+ 当前策略估算缓存 + 8.00 GB + 逐 Token、逐层、全头 K/V +
+
+ 每 Query 直接读取 + 4,096 + 全部历史位置 +
+
+ 随长度增长 + 线性 KV + 注意力计算仍是二次 +
+
+ +
+ {strategies.map((strategy) => ( +
+ {strategy.label} +
+ +
+ ))} +
+ +
+ ESTIMATE, NOT BENCHMARK +

+ KDA 行只计算固定递推状态;K3 行按 3:1 层比叠加 KDA 状态与 MLA latent; + V4 行用 1:1 CSA/HCA、4×/128×压缩和 128 局部窗口做结构估算,未计 Indexer、未压缩尾部、分页和框架开销。 +

+
+
+ + +
+ + diff --git a/src/components/SiteFooter.astro b/src/components/SiteFooter.astro index dad26e7..62b7b12 100644 --- a/src/components/SiteFooter.astro +++ b/src/components/SiteFooter.astro @@ -5,6 +5,7 @@