# 大规模 LLM 训练系统研究账本 最后核验:2026-07-29 章节状态:一手证据账本 v1;页面与交互实验室待实现 ## 研究问题 训练系统不是“把模型分到很多 GPU 上”这么简单。它要同时回答九个互相牵制的问题: 1. 模型状态怎样放得下; 2. 激活怎样留到反向; 3. 一层矩阵怎样拆; 4. 多层流水线怎样少等; 5. 通信到底搬什么、搬多少、多久搬一次; 6. MoE 的 Token 怎样去往专家; 7. 长序列怎样跨设备; 8. 低精度与优化器状态怎样维持数值稳定; 9. 训练、rollout、环境和故障怎样组成可恢复的系统。 教学主线固定为: > 单卡训练先撞上容量墙 > → 数据并行扩大吞吐,却复制所有模型状态 > → Tensor / Pipeline Parallel 把单个模型切开 > → ZeRO / FSDP 把数据并行中的冗余状态切开 > → 3D 并行把不同通信频率映射到不同网络层级 > → Sequence / Context Parallel 再切长序列 > → MoE 用 Expert Parallel 扩容量,却把 All-to-All 和负载不均放上关键路径 > → 调度、重计算、低精度、卸载与通信重叠成为一体化问题 > → DeepSeek-V3 用 DualPipe、拓扑感知 All-to-All 和 FP8 协同 > → Kimi K2 选择内存更稳的 interleaved 1F1B,K2.5 解耦视觉编码器 > → K3 用 MoonEP、统一激活管理、Pipeline ZeRO-2、远端激活和 P2P Muon 支撑 2.8T 预训练 > → 百万 Token Agentic RL 又把 KV、权重、梯度缓冲、沙箱与长尾轨迹放进同一张时间—内存账。 --- ## 0. 先统一量纲 ### 0.1 五种资源不能混写 | 量纲 | 问题 | 常用单位 | 不能推出什么 | |---|---|---|---| | 算术量 | 一步理论上做多少乘加 | FLOP / step、FLOP / token | 不能直接推出 wall time | | 容量 | 某一时刻要驻留多少状态 | byte / GPU | 不能直接推出数据搬运速度 | | 带宽 | 大消息每秒能搬多少 | GB/s、Gbps | 不能解释小消息启动延迟 | | 延迟 | 一次同步、launch、P2P 等多久 | µs、ms、s | 不能替代大消息带宽模型 | | 利用率 | 峰值硬件有多少变成有效训练 | MFU、HFU、pipeline utilization | 不同论文口径未必相同 | ### 0.2 本章统一符号 | 符号 | 含义 | |---|---| | `P` | 模型参数个数;MoE 场景必须注明 total 还是 activated | | `T` | 训练 Token 数 | | `B` | batch 相关数量;出现时注明 global / micro | | `S` | 序列长度,或在 MoonEP 原文语境中每 rank 的本地序列长度 | | `H` | hidden dimension | | `L` | Transformer 层数 | | `M` | 一次 collective 的逻辑消息大小 | | `n` | collective 参与 rank 数 | | `m` | 一个 pipeline batch 的 micro-batch 数 | | `p` | pipeline stage 数 | | `v` | 每设备 virtual pipeline chunks 数 | | `E` | routed expert 总数 | | `K` | 每 Token 选择的 routed expert 数 | | `R` | expert-parallel size | | `b` | 每元素字节数 | ### 0.3 “GPU 总数等于并行度连乘”只在特定 mesh 定义下成立 只有当多个并行轴被定义为**互相正交的设备网格维度**时,才可以写: ```text world_size = axis_1 × axis_2 × … × axis_k ``` 不能不加说明地写成: ```text world_size = DP × TP × PP × EP × CP ``` 原因: - EP 可能只作用于 MoE 层,dense attention 又使用另一套 group; - expert data parallel 与普通 data parallel 的定义可能不同; - Megatron sequence parallel 通常与 TP 共用 process group,不是新增独立乘数; - context parallel 可以是独立轴,也可以与其他序列切分组合; - 同一 rank 同时属于多个通信 group,group 数量不等于互相独立的 mesh 轴数量。 章节中的 topology lab 必须先定义设备坐标和 group membership,再计算 world size。 --- ## 1. L1:模型状态内存账 ### 1.1 为什么“参数 2 字节”不等于“训练每参数 2 字节” ZeRO 论文用 FP16/FP32 mixed-precision Adam 作具体例子。每个参数的持久模型状态为: | 状态 | 精度 | bytes / parameter | |---|---:|---:| | 前反向使用的参数 | FP16 | 2 | | 梯度 | FP16 | 2 | | optimizer master parameter | FP32 | 4 | | Adam momentum | FP32 | 4 | | Adam variance | FP32 | 4 | | 合计 | — | **16** | 因此原论文的基线是: ```text M_model-state = 16P bytes ``` 这是一个**指定配方的字节账**,不是所有 Adam、BF16、FP8 或 fused optimizer 的宇宙常数。实际系统还可能有: - FP32 gradient accumulation buffer; - EMA 参数; - flat / fusion buffer; - quantization scale; - allocator fragmentation; - 通信临时 buffer; - Muon 等不同优化器的矩阵状态。 ### 1.2 ZeRO 三阶段到底切什么 令数据并行度为 `N_d`,沿用 ZeRO 原论文的 mixed-precision Adam 口径: | 阶段 | 分片对象 | 每 rank 模型状态近似 | |---|---|---:| | 普通 DP | 无 | `16P` | | ZeRO-1 | optimizer states | `4P + 12P/N_d` | | ZeRO-2 | optimizer + gradients | `2P + 14P/N_d` | | ZeRO-3 | optimizer + gradients + parameters | `16P/N_d` | 这里的 “1/2/3” 不是性能等级,而是逐步增加分片对象。 ### 1.3 ZeRO 没有凭空消灭状态 ZeRO 把“每张卡长期复制完整状态”改成: - 只保留本 rank 负责的 shard; - 在某层真正需要参数时再 gather; - 梯度产生后 reduce-scatter 到 owner; - 用生命周期管理及时释放临时完整参数。 因此收益是容量,代价是更细粒度的通信、prefetch、buffer 与调度复杂度。 ### 1.4 ZeRO 论文的通信口径 ZeRO 论文把一个 `P` 元素张量的 reduce-scatter 与 all-gather 各近似计为 `P` 的数据移动: - 普通 DP AllReduce:`2P`; - ZeRO-2:gradient reduce-scatter `P` + updated parameter all-gather `P` = `2P`; - ZeRO-3:forward 参数 all-gather `P` + backward 参数 all-gather `P` + gradient reduce-scatter `P` = `3P`。 所以 ZeRO-3 在这个口径下相对普通 DP 是最多 `1.5×` 通信量,而 ZeRO-1/2 不增加总量。 严格的 ring 算法每 rank 单向发送量应带 `(n-1)/n`: ```text ReduceScatter sent/rank = (n-1)/n × M AllGather sent/rank = (n-1)/n × M Ring AllReduce sent/rank = 2(n-1)/n × M ``` “论文近似体积”“每 rank 发送量”“发送+接收总字节”必须标出统计口径,不能直接横比。 ### 1.5 FSDP 是实现语境,不是另一套物理定律 PyTorch FSDP 的 FULL_SHARD 与 ZeRO-3 在核心目标上相近:参数、梯度和 optimizer state 都按 data-parallel rank 分片,并按执行顺序 all-gather / reduce-scatter。工程差异集中在: - wrapping / flat parameter 边界; - prefetch 时机; - state-dict 与 checkpoint 语义; - mixed precision 与 CPU offload; - 与模型结构、编译器和其他并行方式的组合。 课程不把 “FSDP vs ZeRO” 教成简单优劣榜。 --- ## 2. L2:激活内存账 ### 2.1 激活为什么与模型状态不同 参数主要随 `P` 增长;训练激活主要随: ```text micro_batch × sequence × hidden × layers × saved_tensors ``` 增长。标准注意力若保存完整 attention matrix,还会出现与 `S²` 相关的中间量。 这解释了两个常见现象: - 参数能放下,不代表长序列激活能放下; - 增大 DP 不会自动切开同一样本的激活。 ### 2.2 四种激活策略是一张“保留位置”账 | 策略 | forward 后把信息放哪里 | backward 前做什么 | 主要代价 | |---|---|---|---| | 保留 | GPU HBM | 直接读取 | 容量 | | 重计算 | 不保留或只留 checkpoint | 重跑部分 forward | FLOPs / latency | | 压缩 | GPU 或 CPU 的低精度表示 | 解压/转换 | 精度风险、cast | | 卸载 | CPU / 远端 GPU / NVMe | prefetch / onload | PCIe / RDMA / 存储带宽 | 这些策略可以按 tensor 粒度组合,不是互斥按钮。 ### 2.3 Checkpointing 的历史节点 Chen 等人在 2016 年给出系统化计算—内存交换: - 对 `n` 层网络,用分段 checkpoint 可把 feature-map memory 从 `O(n)` 降到 `O(√n)`; - 文中 practical algorithm 的计算开销约为一次额外 forward,即总 forward 计算约翻倍; - 递归方案理论上可到 `O(log n)` 内存,但带来更多重计算。 这条结论是复杂度结果,不等于任意 Transformer 实现都获得同一比例。 ### 2.4 选择性重计算:不要重跑昂贵的 GEMM 2022 年 `Reducing Activation Recomputation` 把两个机制结合: 1. **Megatron sequence parallel**:对 TP 区域中原先复制的 LayerNorm / Dropout 等激活沿 sequence 分片; 2. **selective recomputation**:优先重计算 memory-heavy、compute-light 的 attention 中间量,而不是整个 Transformer layer。 论文在其模型与硬件设置中报告: - activation memory 减少约 `5×`; - 相比 full recomputation,执行时间 overhead 减少超过 `90%`; - full activation recomputation 在其实测训练中有 `30–40%` execution-time overhead。 这些数字只用于说明该实验的量级,不能当作所有模型固定收益。 ### 2.5 FlashAttention 解决的是 IO 与显式 `S²` 中间矩阵 FlashAttention 用 tiling 和在线 softmax 在 SRAM/HBM 层级重排计算: - 不把完整 `S×S` attention matrix 写回 HBM; - attention 的结果仍是精确值,不是稀疏近似; - 标准 dense attention 的算术复杂度仍含 `S²`; - 它不消灭 LayerNorm、MLP、残差等其他训练激活。 所以“FlashAttention 把注意力变成线性复杂度”是错误说法。 --- ## 3. L3:计算划分账 ### 3.1 Data Parallel:切样本 每个 rank: - 持有一份模型; - 处理不同 micro-batch; - backward 后聚合梯度; - 同步更新得到等价参数。 适合: - 单个模型副本放得下; - global batch 允许扩大; - 每步计算足以摊薄一次梯度 collective。 主要通信频率:每个 optimizer step。 ### 3.2 Tensor Parallel:切一层矩阵 Megatron-LM 的核心做法是让一组 GPU 共同执行同一 Transformer 层: - MLP 第一矩阵按输出维切,GeLU 可在本地执行; - 第二矩阵按输入维切,之后聚合; - attention heads / projections 也按兼容方向切; - 通过列并行与行并行组合,把同步点压到少数 collective。 优点: - 同一层参数、GEMM 与部分激活被切开; - 单个 layer 太宽时仍可运行。 代价: - 每层、每个 micro-batch 都通信; - 小 GEMM 会降低算术效率; - 因频率高,TP 通常放在 NVLink / NVSwitch 域内。 ### 3.3 Pipeline Parallel:切层 把连续 layer 段放到不同 stage,只在相邻 stage 间传 activation / activation gradient。 优点: - 跨 stage 通信是点到点; - 单次传输相对 TP 可更粗粒度; - 适合跨节点。 代价: - warmup / cooldown 气泡; - stage 划分不均; - 前部 stage 常驻留更多激活; - micro-batch 太小会伤 GEMM,太大又减少 `m`、增大气泡。 ### 3.4 3D Parallel 的核心不是“乘起来”,而是按频率放拓扑 Megatron 2021 的 PTD-P 组合: - TP:高频 layer 内 collective,优先节点内; - PP:相邻 stage P2P,可跨节点; - DP:每 batch 聚合梯度,可使用更大范围网络。 这是一条“通信频率—网络层级匹配”原则,不是固定唯一配置。 ### 3.5 自动并行分支 Mesh TensorFlow、GSPMD、Alpa 等工作把人工选择的 sharding / resharding 表达为: - 逻辑 device mesh; - tensor dimension 到 mesh axis 的映射; - 跨 operator 的 sharding propagation; - 代价模型与自动搜索。 它们没有消除通信,而是系统化寻找“在哪里切、何时重分片”。 --- ## 4. L4:流水线气泡账 ### 4.1 GPipe:先所有 forward,再所有 backward 设: - `p` 个 pipeline stages; - `m` 个 micro-batches; - 一个 stage 处理一次 micro-batch 的 forward / backward 时间分别为 `F`、`B`; - stages 理想平衡且忽略通信。 GPipe 的 flush bubble 时间为: ```text t_bubble = (p - 1)(F + B) t_ideal = m(F + B) bubble / ideal = (p - 1) / m utilization = m / (m + p - 1) ``` 所以 `m ≫ p` 才能摊薄气泡。GPipe 原论文经验上观察到 `M ≥ 4K` 时气泡在其设置中接近可忽略;它不是通用阈值。 ### 4.2 1F1B:主要先省激活,不自动消除 flush PipeDream-Flush / non-interleaved 1F1B: 1. warmup 注入若干 forward; 2. steady state 交替一个 forward、一个 backward; 3. cooldown 排空剩余 backward; 4. flush 边界后再做同步 optimizer update。 相较 GPipe: - flush bubble 的基本规模仍由 `p-1` 决定; - outstanding backward 的 micro-batch 数受 `p` 限制,而不是必须保留全部 `m`; - 因而 activation memory 显著降低。 原始 PipeDream 用异步流水与 weight stashing 处理权重版本;课程必须把它与保持严格同步语义的 PipeDream-Flush / 1F1B 区分。 ### 4.3 Interleaved 1F1B:用 virtual chunks 缩短 bubble 单元 每设备持有 `v` 个非连续 model chunks: - 单个 chunk 的 `F/B` 时间约缩为原来的 `1/v`; - 理想条件下 bubble 约缩小 `v` 倍; - 但相邻 virtual chunks 增加 pipeline messages; - `m` 还需满足相应 divisibility 约束。 ### 4.4 Zero Bubble:先拆 backward Zero Bubble Pipeline Parallelism 把 backward 拆为: - `B` / input-gradient:前一 stage 继续反传所必需,处于关键依赖链; - `W` / weight-gradient:只需在 optimizer step 前完成,可被延后填进空隙。 这让 scheduler 能用 `W` 填充原本的 bubble。论文同时: - 构造手工 schedule; - 用给定模型配置与内存限制搜索 schedule; - 处理 optimizer synchronization,保持同步训练语义。 论文报告在其设置下,相近内存时相对 1F1B 吞吐最高提升 23%,放宽内存时最高 31%;这不是任意 PP 配置的保证。 ### 4.5 Bidirectional pipeline:Chimera 到 DualPipe Chimera 从 pipeline 两端同时注入相反方向的 micro-batches,利用双向 pipeline 减少 bubble。 DeepSeek-V3 的 DualPipe 进一步针对重 MoE 通信: - 把 chunk 拆成 attention、dispatch、MLP、combine; - backward 再拆 input-gradient 与 weight-gradient; - 把一对 forward / backward chunk 的计算与通信重排; - 双向注入 micro-batches; - 手工分配通信与计算使用的 SM。 V3 Table 2 的边界必须保留: - DualPipe 需要两份模型参数; - peak activation memory 相对表中 1F1B 多一个 stage-normalized 单位; - 只有在通信能被相邻计算覆盖时,通信才从关键路径上近似消失; - “near-zero all-to-all overhead” 不表示传输字节为零。 --- ## 5. L5:Collective 通信账 ### 5.1 先问四个问题 任何“通信量”结论都要注明: 1. 逻辑 tensor 多大; 2. 统计每 rank 发送、接收,还是全网 aggregate; 3. 使用什么 collective 算法与拓扑; 4. 每 layer / micro-batch / optimizer step 调用多少次。 ### 5.2 α–β 教学模型 ```text time ≈ α × rounds + β × bytes_on_critical_path ``` - `α`:每轮启动、同步、协议延迟; - `β`:每字节传输时间,即带宽倒数; - 小消息更容易被 `α` 支配; - 大消息更容易被 `βM` 支配; - 拥塞、拓扑、kernel contention 与 overlap 会让真实时间偏离简单式。 ### 5.3 四种 collective 的语义 | Collective | 每 rank 输入 | 每 rank 输出 | 训练常见位置 | |---|---|---|---| | AllReduce | 完整 tensor | 聚合后的完整 tensor | DP 梯度、TP 部分输出 | | ReduceScatter | 完整 tensor | 聚合后的 `1/n` shard | ZeRO/FSDP 梯度 | | AllGather | `1/n` shard | 完整 tensor | ZeRO/FSDP 参数、sequence/TP | | All-to-All | 给每个 peer 的不同 shard | 来自各 peer 的 shard | MoE dispatch、Ulysses | P2P send/recv 则常用于 pipeline stage 邻接传输与 Ring Attention。 ### 5.4 “总量相同”也可能快慢不同 同样约 `2M` 的数据: - 一个大 AllReduce; - 多层小 AllReduce; - 先 ReduceScatter 再延迟 AllGather; - 与 GEMM 重叠的 All-to-All; 会因调用次数、依赖位置、拓扑与 overlap 得到完全不同的 wall time。 --- ## 6. L6:MoE / Expert Parallel 账 ### 6.1 两次 All-to-All 典型 MoE layer: ```text router → dispatch All-to-All → local expert GEMM → combine All-to-All → weighted sum ``` 近似 payload 与下列量成正比: ```text tokens × top_k × routed_width × bytes ``` 还要计入: - capacity / padding; - expert metadata 与 routing indices; - 负载不均导致的最大 rank makespan; - 跨节点与节点内的不同带宽; - redundant expert 的权重与梯度同步; - dispatch / combine 是否 zero-copy。 ### 6.2 从 GShard 到 DeepSpeed-MoE / Tutel / MegaBlocks - **GShard**:把 Transformer MoE 与大规模自动分片结合,建立 top-2 gating 与 expert parallel 的关键范式。 - **DeepSpeed-MoE**:组合 data / expert / tensor parallel,并面向训练与推理优化 MoE 系统。 - **Tutel**:让 parallelism 和 kernel 在运行时自适应不同 MoE 配置与硬件。 - **MegaBlocks**:用 block-sparse kernel 处理动态 expert token 数,避免固定 capacity 导致的 padding 或 dropping;“dropless”仍需承受真实不均衡计算。 ### 6.3 DeepEP 的位置 DeepEP 是 DeepSeek 开源的 expert-parallel 通信库,提供: - 高吞吐 dispatch / combine; - 低延迟模式; - 面向 NVLink 与 RDMA 的通信 kernel; - 与计算重叠所需的 hook / buffer 设计。 它优化搬运路径,但不单独解决 router 造成的每 rank 总 Token 不均。 ### 6.4 MoonEP:从“尽量均衡”变成“存在性保证” K3 §5.2.1 定义: - `E`:experts; - `R`:EP ranks; - 每个 rank 本地有 `S` 个 Token; - 每 Token 选 `K` 个专家; - 全部 expert assignments 为 `S×K×R`; - 完美 rank balance 要求每 rank 最终恰好收到 `S×K` 个 assignments。 MoonEP 对当前 micro-batch、当前 layer 的 router output 在线规划 redundant experts: - forward 前 prefetch 远端冗余 expert; - backward 后把冗余 expert gradient reduce 回 home rank; - GPU heuristic planner 以离线 ILP 解作参考; - 始终遵守每 rank `E/R` 个 redundant-expert slots 的上界。 K3 Appendix E 的证明结构: 1. 反复选一个 underloaded rank 和一个 overloaded rank; 2. 从 overloaded rank 搬 Token,精确填满 underloaded rank; 3. 每个 rank 最多被填一次,因此其 remote tokens 最多来自一个 source rank; 4. source rank 本地最多有 `E/R` 个 experts; 5. 所以每 rank 冗余 experts 不超过 `E/R`; 6. 构造极端 routing 可达到 `ceil(E(R-1)/R²) ≈ E/R`,说明一般上界近似 tight。 ### 6.5 完美 rank balance 仍不等于 kernel 完美 balance K3 明确保留第二层问题: - 每 rank 的 assignment 总数相同; - 但 rank 内各 expert 的 Token 数仍可偏斜; - 固定顺序 GEMM 会让 SM worker makespan 不同; - MoonEP 另用 workload-aware expert-GEMM scheduler,并离线 autotune 代价模型系数。 ### 6.6 MoonEP 的静态 shape 与 buffer 边界 K3 报告称: - 每 rank 固定接收 `S×K` assignments,因此 layer computation shape 可预知; - 消除 conventional dynamic expert count 引起的逐层 host-device shape sync; - fused permute/unpermute 直接把 Token 写到远端 expert-grouped position; - 在报告定义的 worst-case imbalance 与 copy-free 路径下,DeepEP buffer 需 `S×K×R`,MoonEP 固定为 `S×K`。 这是 K3 指定比较条件下的 buffer 上界,不应外推为所有 DeepEP 配置的常态占用。 --- ## 7. L7:长上下文状态与 Context Parallel ### 7.1 “Sequence Parallel”有至少两种常见含义 1. **Megatron sequence parallel** 与 TP 绑定,把 TP 区域间原本复制的 element-wise activation 沿 sequence 分片;用 AllGather / ReduceScatter 替代 AllReduce,通信量近似不变,主要省激活。 2. **长上下文 attention sequence/context parallel** 把一个样本的 Q/K/V 序列切到多 rank,共同完成全局 attention;典型为 Ulysses、Ring Attention、USP。 正文首次出现 SP 时必须注明是哪一种。 ### 7.2 Ulysses:sequence shard ↔ head shard 每个 rank 初始持有长度 `S/n` 的 Q/K/V: 1. attention 前 All-to-All; 2. 每 rank 改为持有完整 sequence、但只持有部分 heads; 3. 本地用标准 attention kernel 计算这些 heads; 4. 再一次 All-to-All,把输出转回 sequence shard。 论文给出的每 layer、每 link 教学通信量为: ```text QKV all-to-all: 3SH/n output all-to-all: SH/n total: 4SH/n ``` 当 `S` 与 `n` 同比例增加时,该口径保持常量。 边界: - Ulysses degree 受 attention / KV head 数可切分性限制; - GQA / MQA 的 KV heads 少时尤其明显; - All-to-All 需要较强拓扑。 ### 7.3 Ring Attention:固定 Q,轮转 KV 每 rank: - 保留本地 Q block; - 用本地或收到的 K/V block 更新在线 softmax; - 同时把 K/V 发给下一 rank、从上一 rank 接收; - 轮转完成后得到本地 Q 对全局 K/V 的精确 attention。 收益: - sequence、Q/K/V 与输出均分片; - P2P 易映射到 ring / 跨节点链路; - 通信可与 block attention 重叠。 边界: - block 变小会降低 GEMM / fused attention 效率; - causal mask 下简单连续切分会产生计算不均; - overlap 只有在 block compute 足以覆盖 P2P 时成立。 ### 7.4 USP:用二维 mesh 组合 Ulysses 与 Ring USP 把一个 sequence-parallel group 看作二维网格: - 一轴执行 Ulysses All-to-All; - 另一轴执行 Ring P2P; - 两轴乘积等于总 sequence-parallel degree。 这样可以: - 把 Ulysses 轴限制在 head 数以内; - 把高带宽域用于 All-to-All; - 把较慢跨域链路用于可重叠的 P2P; - 用首尾配对的 token reorder 平衡 causal triangular work。 ### 7.5 K3 KDA Context Parallel K3 的 KDA 是 recurrent linear attention 分支,不能照搬 softmax attention CP: - 每 rank 先对本地 tokens 计算 fixed-size transition / state fragments; - rank-level update 可结合; - 用 prefix scan 恢复每 rank 的 incoming state; - K3 实现用一次 all-gather 交换固定尺寸的 fragments; - 通信对象不随完整历史 KV 线性增长; - 本地 token compute 随 CP 近似线性切分。 K3 仍对 MLA / multimodal encoder 使用其他 CP 机制,不能把 KCP 当成全模型唯一 CP。 --- ## 8. L8:数值、低精度与优化器系统账 ### 8.1 Mixed Precision 的三个经典机制 2017 Mixed Precision Training 提出并验证: - FP32 master weights; - loss scaling,减少小梯度在 FP16 下变成零; - FP16 乘法、FP32 accumulation。 低精度不是简单把 dtype 改小,而是对 storage、GEMM input、accumulation、reduction 与 update 分别选精度。 ### 8.2 DeepSeek-V3 FP8 是细粒度 mixed precision V3 报告中: - 主要 compute-intensive GEMM 使用 FP8; - 某些敏感操作保留 BF16 / FP32; - tile-wise / block-wise scaling 处理动态范围; - Wgrad 使用 FP8,使部分 backward 所需 activation 可按 FP8 存; - 对累加精度采取额外实现补偿; - 通过与 BF16 baseline 的训练曲线比较验证稳定性。 因此不能简写成“整个模型状态与所有计算都是 FP8”。 ### 8.3 K2:FP8 只存 activation,不做 FP8 compute Kimi K2 明确: - MoE up-projection 与 SwiGLU 的部分输入压到 FP8-E4M3; - 使用 `1×128` tile 与 FP32 scale; - 初步研究观察到计算精度风险,因此没有把 FP8 用于 compute; - 剩余 activation 继续 CPU offload。 这与 DeepSeek-V3 的 FP8 training framework 是不同选择。 ### 8.4 Muon 增加了新的完整矩阵需求 K3 使用 Per-Head Muon。分布式 optimizer 虽把参数按 DP rank 分片,Newton–Schulz orthogonalization 却需要完整矩阵。 K3 对 naive all-gather 的改造: - rank 只向 owner ranks P2P 获取自己负责更新的参数 shards; - 不在每 rank 建立全参数 buffer; - 减少内存和通信量; - 以 model-chunk buffer 为粒度 pipeline 通信与 orthogonalization。 这说明优化器算法会反向改变通信图。 --- ## 9. L9:可靠性、弹性与 Agentic RL 系统账 ### 9.1 Checkpoint 不只是“多久保存一次” 完整恢复链包括: - model / optimizer / scheduler; - RNG states; - data-loader cursor 与 shuffle; - distributed sharding metadata; - rollout / environment state; - 是否能在不同 world size 下 reshard。 checkpoint 间隔是: ```text 正常训练 I/O 开销 vs 故障后重算损失 ``` 的权衡。 ### 9.2 K2:同机训练/推理与 checkpoint engine K2 的 RL 使用 co-located architecture: - training engine 与 inference engine 共用 workers; - 一方运行时,另一方释放或 offload GPU state; - 独立 checkpoint engine 处理不同 sharding 之间的参数转换; - 每个 checkpoint worker 先拿到本地参数,再广播完整参数集; - inference worker 只取需要的 shard; - 按参数 pipeline,降低峰值内存; - K2 报告其 1T 模型一次完整参数更新少于 30 秒。 报告也承认广播量高于理论最优,但用额外传输换取训练/推理引擎解耦与更简单的同步。 ### 9.3 K2.5:多模态和 Agent rollout 都是系统问题 **Decoupled Encoder Process:** 1. 全局 batch 的视觉 forward 先按 image / patch load 分到所有 GPU; 2. 丢弃中间视觉 activation,只保留最终输出并 gather 到 PP stage 0; 3. backbone 按成熟 text pipeline 完成 forward/backward; 4. 重新计算 vision forward,再做 vision backward。 K2.5 报告在其设置下达到 text-only training 约 90% 的多模态训练效率。 **Agentic RL:** - 每个 agent task 是独立异步 coroutine; - Rollout Manager 支持最高 100,000 concurrent agent tasks; - environment pool、LLM gateway、logprob 记录与监控共同参与。 ### 9.4 K3 预训练:统一 activation manager 每个为 backward 保存的 tensor 都绑定可插拔 storage backend: - recomputation; - block-wise FP8 quantization; - local offload; - remote offload。 K3 的实现边界: - 策略在 tensor 粒度组合; - function-granularity recomputation 支持跨层; - GPU allocation 统一在主 compute stream 的单一 memory pool; - layer-granularity prefetch 与计算重叠; - element-wise operators 使用 recomputation; - 大部分 activation 组合 block-wise FP8 与 offload / remote-offload。 ### 9.5 K3:MoE、AttnRes、PP rank 内存与 gradients - **MoE**:改写 permuted probability gradient 的依赖,减少必须保存的 forward output;group GEMM input 在 backward 前通过重做 dispatch 恢复,并把通信与部分 GEMM backward 重叠。 - **Block AttnRes**:block representation 在边界 layer 生成一次并共享;AttnRes 内部 checkpoint;跨 PP stage 只增量传新 blocks。 - **remote activation**:interleaved 1F1B 的前部 PP ranks activation 更多,K3 用 Mooncake Transfer Engine 把 activation 远程放到其他 PP rank memory,平衡容量。 - **Pipeline ZeRO-2**:gradients 在 DP ranks 分片后存 CPU;GPU 保留 double grad buffer,reduce 后累加进 CPU shards。 ### 9.6 K3:把 ViT 放进 pipeline bubble K2.5 DEP 先把 vision encoder 与 text backbone 解耦;K3 再细分: - 最前若干 ViT forward 同步执行; - 其余 forward 填入 text pipeline bubbles; - backward 同理; - dynamic CP 沿 patch 切大图,并用 sub-CP groups 平衡多个大图; - K3 报告称大部分 ViT compute 因而被隐藏在 PP bubbles。 “隐藏”仍依赖 bubble 是否足够、视觉负载与 stage 调度,不等于视觉编码器零成本。 ### 9.7 K3 百万 Token RL:外置 KV 与自动节流 K3 采用 co-located RL,把每个 1M-context experiment 控制在几百张 GPU 内,并用 partial rollout 缓解超长轨迹尾部。 **External KV pool 是 write-back,不是 write-through:** - active decode blocks 留在 GPU; - reusable idle prefix 仅在 GPU eviction 时写入 CPU DRAM; - 下次复用前 prefetch; - KDA states 与 MLA KV blocks 绑定生命周期; - rollout 阶段为外部 KV 腾 DRAM:training iteration 后把 model / optimizer states offload 到 NVMe; - rollout 完成后释放 pool,避免与训练争资源。 **Auto-throttling:** - 读取 active requests; - queued requests; - KV utilization; - 动态限制进入 inference engine 的请求数; - 早期上下文短时提高并发,后期 KV 压力上升时降并发。 ### 9.8 K3:gradient buffer 复用 reference 等 forward-only model: - 常驻 CPU; - 需要时把权重 materialize 到 policy model 的 FP32 gradient-buffer storage; - 真正 backward 前该 buffer 会被真实梯度覆盖,因此生命周期不冲突; - Pipeline ZeRO-2 下每 GPU 只保留两个 VPP chunks 的 gradient buffers; - 一个 slot 当前计算,另一个 slot prefetch 下一 chunk。 ### 9.9 AgentENV:环境状态也是训练状态 K3 报告的 AgentENV: - 以 Firecracker microVM 提供比普通 container 更强的隔离和更接近真实系统的能力; - incremental checkpoint / resume 最低报告 133 ms / 49 ms; - paused sandbox 不消耗 memory / CPU; - 推理等待在报告场景可占 sandbox lifetime 最高 98%; - 支持 pause/resume、fork、snapshot; - 使用 OverlayBD、custom ublk、storage sharing 与 P2P; - real workloads 中 memory overcommit 最高 6.5×; - K3 训练/评估累计创建 51,219,741 个 sandboxes,跨 1,505,678 images。 这些数值是 K3 团队报告的生产统计,不是通用 microVM benchmark。 --- ## 10. DeepSeek 训练系统谱系 ### DeepSeek-V2:少 activated parameters 改变并行选择 原报告配置: - 16-way zero-bubble PP; - 8-way EP; - ZeRO-1 DP; - 不使用 TP; - 共享专家 compute 与 EP All-to-All overlap; - 自定义 communication、routing 与 fused kernels。 不使用 TP 的原因是该模型 activated parameters 较少,加上部分 operator recomputation 后 activation 可放下;这是特定架构与硬件配置的选择,不是“MoE 永远不需要 TP”。 ### DeepSeek-V3:通信、调度、路由和 FP8 协同 原报告训练集群与并行: - 2048 NVIDIA H800; - 节点内 8 GPU,经 NVLink / NVSwitch; - 节点间 InfiniBand; - 16-way PP; - 64-way EP,跨 8 nodes; - ZeRO-1 DP; - 不使用 TP。 关键系统机制: 1. DualPipe 双向调度; 2. forward/backward 内重排 attention / dispatch / MLP / combine; 3. backward 拆 input-gradient / weight-gradient; 4. communication kernels 使用专门 SM,并与 compute stream overlap; 5. node-limited routing:每 Token 最多去 4 个节点; 6. IB 先送到目标节点同 local-index GPU,再经 NVLink 转给 expert owner; 7. FP8 mixed-precision framework 降低 compute 与 activation storage 压力; 8. selective recomputation、CPU EMA、共享 embedding/head 继续省内存。 原报告称在其集群上只需 20 个 SM 即可充分利用 IB / NVLink 带宽;这是 V3 具体 kernel、拓扑与 workload 的测量,不是硬件常数。 ### DeepSeek-V4:长上下文使系统账再改变 DeepSeek-V4 的百万 Token 架构把注意力进一步改为压缩/稀疏与 recurrent components。对训练系统的含义: - context parallel 传输对象不再只有 full K/V; - recurrent state、稀疏 block 与 dense component 有不同生命周期; - 不能拿标准 MHA 的 CP 通信式直接估计完整 V4; - 页面只引用 V4 报告明确给出的机制与配置,不从架构图反推未披露集群数字。 --- ## 11. Kimi K2 → K2.5 → K3 系统谱系 ### K2:优先保持可复用配置 K2 原报告: - H800 cluster; - 节点内 NVLink / NVSwitch; - 节点间 `8×400 Gbps RoCE`; - 16-way PP with virtual stages; - 16-way EP; - ZeRO-1 DP; - 可运行在任意 32 的倍数个节点上; - 1T 模型 BF16 parameters + FP32 gradient accumulation buffer 约 6 TB,跨 256 GPU; - 各 GPU 约 30 GB 用于 states,剩余给 activations。 K2 明确没有沿用 DualPipe: - DualPipe 会让 parameters + gradients 的内存翻倍; - 需要增加 PP 或 EP 补容量; - 更大 PP 增加 bubble,更大 EP 增加通信/均衡成本; - K2 改用多 warmup micro-batches 的 interleaved 1F1B 覆盖 EP communication; - weight-gradient 与 PP communication 并行。 这是很重要的反例:更新的调度算法不一定适合更大 total-parameter MoE。 ### K2 activation ladder 按从便宜到昂贵的顺序: 1. LayerNorm、SwiGLU、MLA up-projection selective recomputation; 2. MoE down-projection recomputation; 3. insensitive activations 压到 FP8-E4M3; 4. 其余 activations CPU offload; 5. offload previous forward micro-batch 与 prefetch next backward micro-batch 同时进行。 ### K2.5:先解耦 ViT,再复用 K2 主干 - 主干继续 16 PP / virtual stages、16 EP、ZeRO-1; - selective recompute + FP8 activation storage + CPU streaming; - DEP 把可变视觉 workload 从 PP stage 0 的关键路径拆出; - agentic RL 把 rollout 作为异步 task graph 管理。 ### K3:为 2.8T 与 1M agentic RL 重构执行层 预训练并行: - PP with virtual stages; - EP; - ZeRO-1 DP; - Pipeline ZeRO-2 gradient sharding; - Context Parallel; - MoonEP; - dynamic multimodal CP。 相对 K2/K2.5 的系统增量: - MoonEP 对 EP rank load 给出可行性保证; - unified activation manager 把重计算、量化与多级卸载统一; - remote PP activation balancing; - Pipeline ZeRO-2 CPU gradient shards; - P2P Muon orthogonalization; - ViT compute 填 pipeline bubbles; - 1M RL external KV write-back pool; - request auto-throttling; - policy gradient buffer 复用; - AgentENV microVM 生命周期。 --- ## 12. 关键论文与一手实现阅读链 本专题首版目标为 30+ 个一手节点。PDF/text 只存本地忽略目录;公开仓库只提交账本和 canonical URL。 | 年份 | 来源 | 它改变了哪张账 | |---:|---|---| | 2012 | [Large Scale Distributed Deep Networks](https://arxiv.org/abs/1206.5533) | DistBelief、参数服务器与早期分布式训练 | | 2014 | [One Weird Trick for Parallelizing CNNs](https://arxiv.org/abs/1404.5997) | 数据/模型并行的通信直觉 | | 2016 | [Training Deep Nets with Sublinear Memory Cost](https://arxiv.org/abs/1604.06174) | activation checkpointing | | 2017 | [Mixed Precision Training](https://arxiv.org/abs/1710.03740) | master weights、loss scaling、FP32 accumulation | | 2018 | [PipeDream](https://arxiv.org/abs/1806.03377) | 1F1B、异步 pipeline、weight stashing | | 2018 | [Mesh-TensorFlow](https://arxiv.org/abs/1811.02084) | tensor layout 到 device mesh | | 2019 | [GPipe](https://arxiv.org/abs/1811.06965) | synchronous micro-batch pipeline | | 2019 | [Megatron-LM](https://arxiv.org/abs/1909.08053) | Transformer tensor parallel | | 2019 | [ZeRO](https://arxiv.org/abs/1910.02054) | optimizer / gradient / parameter sharding | | 2020 | [GShard](https://arxiv.org/abs/2006.16668) | MoE expert parallel 与自动分片 | | 2021 | [3D Megatron-LM](https://arxiv.org/abs/2104.04473) | TP + PP + DP 与 interleaved schedule | | 2021 | [ZeRO-Infinity](https://arxiv.org/abs/2104.07857) | GPU / CPU / NVMe heterogeneous memory | | 2021 | [GSPMD](https://arxiv.org/abs/2105.04663) | general sharding propagation | | 2021 | [Chimera](https://arxiv.org/abs/2107.06925) | bidirectional pipeline | | 2022 | [DeepSpeed-MoE](https://arxiv.org/abs/2201.05596) | 多轴 MoE 训练/推理系统 | | 2022 | [Alpa](https://arxiv.org/abs/2201.12023) | 自动 inter/intra-operator parallelism | | 2022 | [Reducing Activation Recomputation](https://arxiv.org/abs/2205.05198) | Megatron SP 与 selective recomputation | | 2022 | [FlashAttention](https://arxiv.org/abs/2205.14135) | IO-aware exact attention | | 2022 | [Tutel](https://arxiv.org/abs/2206.03382) | adaptive MoE system | | 2022 | [MegaBlocks](https://arxiv.org/abs/2211.15841) | dropless block-sparse MoE | | 2023 | [PyTorch FSDP](https://arxiv.org/abs/2304.11277) | fully sharded 实现经验 | | 2023 | [FlashAttention-2](https://arxiv.org/abs/2307.08691) | attention work partition 与占用率 | | 2023 | [DeepSpeed-Ulysses](https://arxiv.org/abs/2309.14509) | sequence ↔ head All-to-All | | 2023 | [Ring Attention](https://arxiv.org/abs/2310.01889) | blockwise P2P context parallel | | 2023 | [Zero Bubble Pipeline Parallelism](https://arxiv.org/abs/2401.10241) | B/W 拆分与 schedule search | | 2024 | [MegaScale](https://arxiv.org/abs/2402.15627) | 10K+ GPU 训练与可靠性 | | 2024 | [DeepSeek-V2](https://arxiv.org/abs/2405.04434) | zero-bubble PP + EP + ZeRO-1,无 TP | | 2024 | [USP](https://arxiv.org/abs/2405.07719) | Ulysses × Ring 2D sequence parallel | | 2024 | [DeepSeek-V3](https://arxiv.org/abs/2412.19437) | DualPipe、cross-node All-to-All、FP8 | | 2025 | [DeepEP](https://github.com/deepseek-ai/DeepEP) | expert dispatch / combine kernels | | 2025 | [Kimi K2](https://arxiv.org/abs/2507.20534) | 1T MoE 预训练与 co-located RL | | 2026 | [Kimi K2.5](https://arxiv.org/abs/2602.02276) | DEP 与 100K concurrent agent tasks | | 2026 | [DeepSeek-V4](https://arxiv.org/abs/2606.19348) | million-token hybrid attention system constraints | | 2026 | [Kimi K3](https://arxiv.org/abs/2607.24653) | 2.8T pretraining + 1M agentic RL stack | | 2026 | [MoonEP](https://github.com/MoonshotAI/MoonEP) | perfect rank balance 与 static shape | | 2026 | [AgentENV](https://github.com/kvcache-ai/AgentENV) | resumable microVM agent environments | | 2026 | [K2 checkpoint engine](https://github.com/MoonshotAI/checkpoint-engine) | train/inference resharding | --- ## 13. 页面视觉与交互设计 ### 13.1 必须重绘的架构图 1. **四层成本栈**:FLOPs / HBM / network / idle time。 2. **每参数字节账**:从 2 bytes 误解展开到 16P example,再切 ZeRO-1/2/3。 3. **3D parallel device mesh**:TP 节点内、PP 跨节点、DP 跨副本。 4. **pipeline schedule 对照**:GPipe、1F1B、interleaved、ZeroBubble、DualPipe。 5. **collective 动画**:AllReduce / ReduceScatter / AllGather / All-to-All。 6. **MoE 两次 All-to-All**:再叠加 MoonEP redundant expert migration。 7. **context parallel 对照**:Ulysses transpose、Ring KV rotation、USP 2D mesh。 8. **activation lifecycle**:store / recompute / compress / CPU / remote GPU。 9. **DeepSeek-V3 execution strip**:compute 与 communication overlap。 10. **K2 → K2.5 → K3 系统谱系**。 11. **K3 1M RL memory seesaw**:training states ↔ KV pool ↔ gradient buffer。 12. **AgentENV lifecycle**:run → pause → snapshot / fork → resume。 ### 13.2 Interactive Training Systems Lab 四个 tab: #### A. Memory Ledger 输入: - total parameters; - parameter / gradient / master / optimizer precision; - DP / ZeRO stage; - activation base; - checkpoint、FP8 storage、CPU/remote offload。 输出: - per-GPU persistent states; - peak activation; - communication buffer; - CPU / remote tier; - 哪一项首先 OOM。 #### B. Parallel Mesh 输入: - GPU nodes 与每节点 GPU; - TP / PP / DP; - dense 或 MoE; - EP / CP group definition; - network topology。 输出: - 每 rank 坐标与 group membership; - 高频 collective 落在节点内还是跨节点; - invalid topology 原因; - 每种通信的调用频率。 #### C. Pipeline Scheduler 输入: - stages `p`; - micro-batches `m`; - virtual chunks `v`; - F / input-grad / weight-grad 时间; - schedule 选择。 输出: - 实际 timeline; - bubble ratio; - peak in-flight activations; - communication slots; - DeepSeek/Kimi 选择的对应关系。 #### D. Communication / MoE 输入: - collective; - ranks; - tokens / hidden / bytes; - expert top-k; - imbalance; - overlap ratio。 输出: - per-rank bytes; - α / β time; - exposed vs hidden communication; - DeepEP-style dynamic buffer 与 MoonEP fixed buffer 对照; - rank balance 与 intra-rank expert makespan 分开显示。 所有模拟必须标注为 deterministic teaching model,不冒充任何真实集群 benchmark。 --- ## 14. 高风险事实检查清单 - [x] `16P` 明确限定为 ZeRO 论文的 FP16/FP32 Adam 配方。 - [x] ZeRO-1/2/3 的分片对象与内存公式逐项核对原文。 - [x] collective 体积注明论文近似口径与 ring 精确因子。 - [x] GPipe / 1F1B 的 bubble 与 activation memory 区分。 - [x] 原始 PipeDream 异步语义与同步 PipeDream-Flush 区分。 - [x] interleaved schedule 的 `v` 收益与额外 PP communication 同时写。 - [x] ZeroBubble 的 input-gradient / weight-gradient 拆分回查原文。 - [x] DualPipe 的两份参数与特定 overlap 条件保留。 - [x] “near-zero A2A overhead” 改写为 critical-path overhead。 - [x] Megatron SP 与长上下文 SP 分开。 - [x] Ulysses 的 head-count 限制保留。 - [x] Ring causal load imbalance 与 block efficiency 边界保留。 - [x] EP 与 DP/TP/CP 不机械全部连乘。 - [x] DeepSeek-V2/V3 的“不使用 TP”限定在报告配置。 - [x] MoonEP `S×K` 的 `S` 明确为每 rank 本地 Token 口径。 - [x] MoonEP `E/R` 上界与 tight construction 回查 Appendix E。 - [x] rank aggregate balance 与 rank 内 expert-GEMM balance 分开。 - [x] MoonEP / DeepEP buffer 比较保留 worst-case copy-free 条件。 - [x] K2 FP8 activation storage 与 V3 FP8 compute 分开。 - [x] K2 不用 DualPipe 的原因回查 K2 §2.4.2。 - [x] K2.5 DEP 三阶段和 90% 报告口径回查原文。 - [x] K3 unified activation manager 的后端与粒度回查原文。 - [x] K3 remote activation target 是其他 PP rank memory。 - [x] K3 Pipeline ZeRO-2 的 CPU shard 与 GPU double buffer 区分。 - [x] K3 Muon P2P 只取 locally owned parameter shards。 - [x] K3 external KV 是 write-back,不是 write-through。 - [x] K3 training states 在 rollout 前 offload 到 NVMe 的时序写清。 - [x] gradient-buffer reuse 的生命周期安全条件写清。 - [x] AgentENV 数字标为 K3 报告统计,不外推。 - [ ] 所有 30+ 论文链接发布前做可达性检查。 - [ ] 页面每个数字回链到邻近的一手来源。 - [x] 互动公式写单元测试与浏览器断言。 - [x] desktop / mobile / reduced-motion / keyboard 全部验证。 - [x] immutable image、NAS、VPS、NPM、HTTPS、公开 Forgejo 全链验证。 ### 14.1 首版生产发布证据(2026-07-29) - 源提交:`c6306fe2602bf0631784fa7feb545ad497a2fbc8`。 - 不可变镜像:`docker.k1412.top/wuyang/llm-atlas:20260728T172750Z-c6306fe`。 - Registry digest:`sha256:4759d17e1118659c0c12e6dd0e2a70ec57252533b617591705d538c3de4e2b68`。 - NAS:Compose Manager 管理的 `llm-atlas` 容器为 `healthy`,端口保持 `12010→8080`。 - VPS / Tailscale:`100.94.16.3:12010` 的首页、训练系统、论文库、进度、健康检查、favicon 与 sitemap 均返回 200。 - NPM:host `31` 继续转发至 `100.94.16.3:12010`,certificate `41`、强制 HTTPS 与 host enabled 状态正常。 - 公网:11 个页面路由、`/healthz`、`/favicon.svg`、`/sitemap-index.xml` 全部返回 200;HTTP 返回 301 到 HTTPS。 - TLS:证书 CN 为 `llm-atlas.k1412.top`,有效期至 2026-10-26。 - 生产 Chrome:显存 OOM / K3 分层、合法与非法 device mesh、1F1B / DualPipe、collective overlap、MoonEP buffer、桌面与移动布局、菜单与零 JS 异常断言全部通过。 - 公开仓库:匿名 API 返回 `private: false`,`main` 指向同一源提交。 ## 首版页面完成闸门 - [x] 初学者能在不懂分布式系统的情况下读懂“为什么单卡放不下”。 - [x] 能用 byte ledger 解释参数、梯度、master weights 与 optimizer state。 - [x] 能区分 DP / TP / PP / EP / SP / CP 的切分对象。 - [x] 能解释为什么同样通信字节数仍可能有不同 wall time。 - [x] 能从时间轴上读出 GPipe、1F1B、ZeroBubble 与 DualPipe 差异。 - [x] 能解释 Ulysses、Ring 与 USP 的数据布局变化。 - [x] 能解释 DeepSeek-V3 的系统协同,而不是只背 DualPipe 名字。 - [x] 能解释为什么 K2 主动不采用 DualPipe。 - [x] 能沿 K2 → K2.5 → K3 读出内存与调度演进。 - [x] 能操作四个互动实验并触发至少一个 invalid / OOM / imbalance 情景。 - [ ] 论文阅读链、类型检查、链接、浏览器与容器验证全部通过。