--- import BaseLayout from "@/layouts/BaseLayout.astro"; import TrainingSystemsLab from "@/components/TrainingSystemsLab.astro"; const toc = [ ["00", "map", "先拆成九张账"], ["01", "one-step", "一步训练发生什么"], ["02", "state", "模型状态与 ZeRO"], ["03", "activation", "激活:存、算、压、搬"], ["04", "parallel", "DP / TP / PP"], ["05", "collectives", "Collective 通信"], ["06", "pipeline", "流水线与气泡"], ["07", "expert", "Expert Parallel"], ["08", "context", "长上下文并行"], ["09", "precision", "低精度与优化器"], ["10", "deepseek", "DeepSeek 系统谱系"], ["11", "kimi", "Kimi K2 → K3"], ["12", "lab", "四合一互动实验室"], ["13", "agentic", "百万 Token Agentic RL"], ["14", "decisions", "怎样选择配置"], ["↳", "papers", "37 个一手节点"], ]; const ledgers = [ ["L1 / MODEL STATE", "模型状态", "参数、梯度、master weights、optimizer states 各占多少?"], ["L2 / ACTIVATION", "激活", "Backward 需要的中间量留在 HBM、重算、压缩还是卸载?"], ["L3 / COMPUTE", "计算划分", "切 batch、矩阵、layer、expert 还是 sequence?"], ["L4 / PIPELINE", "流水线气泡", "哪些 GPU 在等依赖,哪些计算可以挪进空隙?"], ["L5 / COLLECTIVE", "集合通信", "搬多少字节、调用多频繁、走哪一级网络?"], ["L6 / EXPERT", "专家派发", "动态路由怎样变成两次 All-to-All 与最慢 rank?"], ["L7 / CONTEXT", "长上下文状态", "Q/K/V、KV cache 或 recurrent state 怎样跨 rank?"], ["L8 / NUMERICS", "数值与优化器", "存储、GEMM、累加、归约和更新各用什么精度?"], ["L9 / RELIABILITY", "可靠性与环境", "checkpoint、rollout、KV、沙箱和故障怎样恢复?"], ]; const memoryRows = [ ["BF16 / FP16 parameter", "2P", "Forward / backward 当前使用的权重"], ["BF16 / FP16 gradient", "2P", "未分片的 gradient buffer"], ["FP32 master parameter", "4P", "优化器更新的高精度副本"], ["FP32 first moment", "4P", "Adam momentum"], ["FP32 second moment", "4P", "Adam variance"], ["TOTAL", "16P", "只属于这套 mixed-precision Adam 配方"], ]; const zeroStages = [ ["DP", "全部复制", "16P", "每步 gradient AllReduce"], ["ZeRO-1", "切 optimizer", "4P + 12P/N", "Reduce/更新后 AllGather"], ["ZeRO-2", "再切 gradient", "2P + 14P/N", "ReduceScatter + AllGather"], ["ZeRO-3", "再切 parameter", "16P/N", "每层参数 gather,梯度 scatter"], ]; const activationMoves = [ { id: "store", title: "留在 GPU", tag: "CAPACITY", body: "Forward 后原样保留,Backward 直接读取。速度最直接,容量最昂贵。", debt: "HBM", }, { id: "recompute", title: "丢掉再重算", tag: "COMPUTE", body: "只留 checkpoint;Backward 前重跑部分 forward。省容量,增加 FLOPs。", debt: "额外 forward", }, { id: "compress", title: "压成低精度", tag: "NUMERICS", body: "以 FP8 或其他表示保存,使用前恢复。省字节,引入 scale、cast 与精度验证。", debt: "数值风险", }, { id: "offload", title: "搬到别处", tag: "BANDWIDTH", body: "放进 CPU、远端 GPU 或 NVMe;Backward 前预取并尽量与计算重叠。", debt: "PCIe / RDMA / I/O", }, ]; const parallelAxes = [ ["DATA", "DP", "切 batch", "每卡完整模型;每 optimizer step 同步 gradient。", "低频大 collective"], ["TENSOR", "TP", "切一层矩阵", "同一 layer 的 GEMM 与 heads 分到多卡。", "每层高频 collective"], ["PIPELINE", "PP", "切 layer 深度", "相邻 stage 传 activation 与 gradient。", "P2P + bubble"], ["EXPERT", "EP", "切 routed experts", "Token 去往远端 expert,再把输出送回。", "每 MoE 层 2× A2A"], ["CONTEXT", "CP", "切一条长序列", "多卡共同完成同一样本的 attention / recurrent state。", "A2A 或 P2P ring"], ]; const collectives = [ ["AllReduce", "完整 x", "聚合后的完整 Σx", "DP gradient;TP partial output", "ring: 2(N−1) rounds"], ["ReduceScatter", "完整 x", "聚合后的 1/N shard", "ZeRO/FSDP gradient", "约 (N−1)/N · M sent"], ["AllGather", "1/N shard", "完整 x", "ZeRO parameter;SP tensor", "约 (N−1)/N · M sent"], ["All-to-All", "给每个 peer 的不同 shard", "来自每个 peer 的不同 shard", "MoE dispatch;Ulysses", "对拓扑与负载敏感"], ["P2P", "一个邻居消息", "一个邻居消息", "PP;Ring Attention;Muon", "易 pipeline / overlap"], ]; const pipelineWaves = [ { year: "2018–19", title: "PipeDream / GPipe", gain: "Micro-batch 让多个 stage 同时工作;GPipe 保持同步语义,PipeDream 探索异步 1F1B。", debt: "flush bubble、activation residency、weight version。", }, { year: "2021", title: "Interleaved 1F1B / Chimera", gain: "virtual chunks 缩短 bubble 单元;双向 pipeline 从两端注入工作。", debt: "更多消息、更多调度约束,stage 划分仍需平衡。", }, { year: "2023", title: "Zero Bubble", gain: "把 backward 拆成 input-gradient 与 weight-gradient,用可延后的 W 填空隙。", debt: "能否零气泡取决于 F/B/W 比例、内存和 optimizer sync。", }, { year: "2024", title: "DeepSeek DualPipe", gain: "双向 pipeline 配对 F/B,并把 MoE A2A 与 compute 重排、重叠。", debt: "两份参数;只有被覆盖的通信才不暴露在关键路径。", }, { year: "2025–26", title: "K2 / K3 的不同取舍", gain: "K2 选择省状态的 interleaved 1F1B;K3 继续把 ViT、offload 与 gradient reduce 填进不同相位。", debt: "最佳 schedule 由模型容量、MoE 比例和多模态负载共同决定。", }, ]; const contextMethods = [ ["MEGATRON SP", "切 element-wise activations", "AllGather + ReduceScatter", "与 TP 共组;主要省复制激活"], ["ULYSSES", "sequence shard ↔ head shard", "2× All-to-All", "并行度受 head / KV-head 可切分性约束"], ["RING ATTENTION", "固定 Q,轮转 K/V blocks", "P2P ring", "可重叠;block 太小会伤 kernel,causal 需均衡"], ["USP", "Ulysses × Ring 二维 mesh", "A2A + P2P", "把高带宽域与慢链路分别映射"], ["K3 KCP", "组合 fixed-size recurrent fragments", "AllGather + prefix scan", "只适用于 KDA 分支,不代表 MLA"], ]; const deepseekSteps = [ ["V2", "2024", "16 PP · 8 EP · ZeRO-1", "少 activated parameters + 重计算使其不需 TP;shared expert compute 与 A2A overlap。"], ["V3", "2024", "16 PP · 64 EP · ZeRO-1", "DualPipe、node-limited routing、cross-node A2A kernels 与 FP8 协同。"], ["V4", "2026", "Million-token hybrid attention", "CP 传输对象扩展为压缩/稀疏 attention 与 recurrent state,不能套标准 MHA 单式。"], ]; const kimiSteps = [ ["K2", "1T MoE", "选择 interleaved 1F1B", "不采用 DualPipe:两份 parameter+gradient 会迫使 PP/EP 扩大;用更多 warmup 和 WGrad overlap 代替。"], ["K2.5", "Native multimodal", "DEP 解耦 ViT", "视觉 forward 全局均衡、只留输出;backbone 完成后重算 ViT 并 backward。"], ["K3", "2.78T / 1M", "重构执行与存储层", "MoonEP、统一 activation manager、Pipeline ZeRO-2、remote activation、P2P Muon 与 external KV pool。"], ]; const paperChain = [ ["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", "layout 到 device mesh。"], ["2019", "GPipe", "https://arxiv.org/abs/1811.06965", "同步 micro-batch pipeline。"], ["2019", "Megatron-LM", "https://arxiv.org/abs/1909.08053", "Transformer tensor parallel。"], ["2019", "ZeRO", "https://arxiv.org/abs/1910.02054", "模型状态三阶段分片。"], ["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 异构内存。"], ["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 recompute。"], ["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。"], ["2024", "USP", "https://arxiv.org/abs/2405.07719", "Ulysses × Ring 二维 SP。"], ["2024", "DeepSeek-V3", "https://arxiv.org/abs/2412.19437", "DualPipe、A2A、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 agent tasks。"], ["2026", "DeepSeek-V4", "https://arxiv.org/abs/2606.19348", "百万 Token 系统约束。"], ["2026", "Kimi K3", "https://arxiv.org/abs/2607.24653", "2.8T pretraining + 1M agentic RL。"], ["2026", "MoonEP", "https://github.com/MoonshotAI/MoonEP", "完美 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。"], ]; ---

SYSTEMS / 12 LARGE-SCALE TRAINING

一万张 GPU,
为什么仍可能有一半在等?

大模型训练不是“卡越多越快”。参数要有地方放,激活要活到反向,矩阵和层要正确切分, 数据必须穿过真实网络,气泡、负载不均与故障还会把理论算力变成等待。

LEDGERS
9 张资源账
CORE SOURCES
37 个一手节点
LINEAGE
2012 → 2026
LAB
4 个独立实验
SPOTLIGHT
DeepSeek × Kimi

00 NINE LEDGERS

训练系统的核心:把等待、容量和数据移动分别记账

“模型放不下”可能是参数、Adam 状态、激活或临时通信 buffer;“扩展效率低”可能是 GEMM 太小、 网络太慢、最忙专家拖尾或 pipeline 没填满。只有先拆账,才知道优化是在消灭成本,还是把它搬到另一层。

{ledgers.map(([code, title, question]) => (
{code}{title}

{question}

))}
04IDLE / FAILURE

气泡、长尾、故障恢复、环境等待

03NETWORK

NVLink、IB/RoCE、PCIe、存储 I/O

02MEMORY

HBM、CPU DRAM、remote GPU、NVMe

01COMPUTE

Tensor Core、CUDA Core、kernel launch

像一间超大型餐厅:食材、厨师、传菜和空桌是四张不同的账

GPU 算力是厨师;HBM 是手边案台;跨卡网络是传菜通道;pipeline bubble 是厨师在等上一道工序。 增加厨师,如果案台太小、传菜口拥堵或订单全堵在某个专家窗口,仍然不会线性提速。

01 ONE TRAINING STEP

先看一步训练,所有系统优化才有落点

一个同步训练 step 并不是一次“模型运行”。它包含数据进入、forward、保存或处理 activation、 backward、梯度聚合、optimizer update,以及下一步开始前必须完成的同步。不同状态只在特定时间被需要。

01LOAD

读入并 pack Token / 图像 / 视频

storage → CPU → GPU
02FORWARD

按 layer 产生 activation 与 loss

parameter + compute
03BACKWARD

逆序消费 activation,产生 gradient

recompute / prefetch
04REDUCE

跨 replica 聚合或分片 gradient

collective
05UPDATE

用 optimizer states 更新参数

master weights

“不是什么状态都要一直在 GPU”

PARAMETERforwardbackwardupdate
ACTIVATION产生等待 / 卸载消费后释放
GRADIENT逐层产生reduce / update
OPTIMIZER可分片 / 卸载短时使用
ZeRO、checkpointing 与 offload 共享同一个直觉

如果一个状态当前不需要,就不必在每张 GPU 上完整常驻。区别在于:ZeRO 把状态放到其他 rank, checkpointing 把中间量变成未来的重计算,offload 则把它放到更慢的存储层。

02 MODEL-STATE MEMORY

“BF16 参数 2P bytes”只是训练账单的第一行

ZeRO 用 FP16/FP32 mixed-precision Adam 说明:前反向权重和梯度各 2 字节,更新还保留 FP32 master parameter、 momentum 与 variance,各 4 字节。于是基线是 16P,而不是 2P。

{memoryRows.map(([name, bytes, role], index) => (
{String(index + 1).padStart(2, "0")}{name}{bytes}

{role}

))}
16P 不是 Adam 的永久常数

这条式子依赖具体 dtype 与状态实现。BF16 gradient、FP32 accumulation、EMA、FP8 scale、flat buffer、 Muon state 或 fused optimizer 都会改变账单。正确做法是逐张量列 byte ledger。

ZeRO:沿数据并行轴逐步取消复制

{zeroStages.map(([name, split, memory, traffic], index) => (
{String(index).padStart(2, "0")}

{name}

{split} {memory}

{traffic}

))}
COMMUNICATION CONVENTION

ZeRO 论文把 ReduceScatter 与 AllGather 各近似为 P 的数据移动,所以普通 DP 与 ZeRO-2 都约为 2P, ZeRO-3 约为 3P。严格 ring 每 rank 的单向发送量还要乘 `(N−1)/N`。不同口径不能直接相除。

03 ACTIVATION LIFECYCLE

参数按模型大小增长,激活按 batch × sequence × hidden × layers 增长

增大 DP 只切 batch,不会切开一个超长样本的 activation。标准注意力如果显式保存 `S×S` matrix, 还会出现平方级中间量。因而 7B 长上下文训练可能比更大参数的短上下文配置更早撞上 HBM。

{activationMoves.map((move, index) => (
{String(index + 1).padStart(2, "0")} / {move.tag}

{move.title}

{move.body}

新账单:{move.debt}
))}
STORE ALL
{Array.from({ length: 12 }, (_, i) => A{i + 1})}

Backward 直接读取;activation memory 随层数线性增长。

CHECKPOINT + RECOMPUTE
{Array.from({ length: 12 }, (_, i) => {i % 4 === 0 ? `C${i / 4 + 1}` : "重算"})}

只留边界 checkpoint;Backward 经过某段时重跑该段 forward。

关键论文怎样逐步把重计算变细

2016Sublinear Memory

分段 checkpoint 把 n 层 feature-map memory 从 O(n) 降到 O(√n);递归可继续换内存。

2022Selective Recomputation

优先重算 memory-heavy、compute-light 中间量,并用 Megatron SP 分片原本复制的 element-wise activation。

2022FlashAttention

用 SRAM tiling 与 online softmax 避免把完整 S×S attention matrix 写回 HBM;dense attention FLOPs 仍是平方级。

2026K3 Unified Manager

把 recompute、FP8、local / remote offload 变成 tensor 粒度的可组合 storage policy。

04 PARALLEL AXES

五种并行,切的是五个不同对象

如果只背缩写,很容易把“更多 GPU”误解成同一种扩展。判断任何配置时,先问: 每张 GPU 持有什么、每次通信发生在哪个频率、哪个维度真的独立。

{parallelAxes.map(([full, short, cut, body, comm], index) => (
{String(index + 1).padStart(2, "0")} / {full} {short}

{cut}

{body}

{comm}
))}
NODE 0 · FAST DOMAINNODE 1NODE 2NODE 3
{Array.from({ length: 4 }, (_, node) => (
{Array.from({ length: 4 }, (_, gpu) => {node * 4 + gpu}TP{gpu})}
))}
不要机械写 `world = DP × TP × PP × EP × CP`

只有互相正交的 device-mesh axes 才连乘。Megatron SP 与 TP 共组;EP 常只作用于 MoE layer; dense attention、shared expert 和 context group 还可能用另一套 process groups。先画 rank membership。

05 COLLECTIVE COMMUNICATION

通信量必须同时写:消息大小、rank 口径、算法和调用频率

LATENCYα × rounds

小消息、同步、协议与 kernel launch 更敏感。

+
BANDWIDTHβ × bytes

大 tensor 搬运由链路吞吐主导。

OVERLAPhidden time

只减关键路径时间,不减物理传输字节。

OP每 rank 输入每 rank 输出LLM 位置环形直觉
{collectives.map((row) =>
{row.map((cell, index) => index === 0 ? {cell} : {cell})}
)}

为什么相同字节数也可能完全不同

DP一次 / optimizer step

消息大,但能被一整个 batch 的计算摊薄。

TP多次 / layer / micro-batch

高频,强依赖节点内低延迟高带宽。

PP邻接 / micro-batch

点对点;stage 越多,消息与 bubble 越复杂。

EP两次 / MoE layer

All-to-All;payload 与 top-k、路由宽度和负载相关。

06 PIPELINE BUBBLES

流水线不改变模型数学,只改变谁在什么时候做哪一段

FLUSH BUBBLE(p − 1)(F + B)

理想平衡 stage、忽略通信。

IDEAL WORKm(F + B)

m 个 micro-batches 的有效计算。

UTILIZATIONm / (m + p − 1)

GPipe / non-interleaved flush 的简化式。

{pipelineWaves.map((wave, index) => (
{String(index + 1).padStart(2, "0")}

{wave.title}

{wave.gain}

留下的债:{wave.debt}
))}
STANDARD BACKWARD B = input-gradient + weight-gradient

两部分绑成一个调度单元,必须一起完成。

ZERO BUBBLE IDEA Binput 在依赖链上 · W 可以延后

先让前一 stage 继续反传,再把 W 放进之后的空隙。

DEEPSEEK-V3 / DUALPIPE

“近零 All-to-All 开销”不是“没有 All-to-All”

V3 把 forward/backward chunk 拆成 attention、dispatch、MLP、combine,再把 input-grad / weight-grad 分开; 双向注入 micro-batches,并手动划分通信与计算使用的 SM。通信字节仍真实经过 IB/NVLink, 只是多数传输在该配置下被相邻计算覆盖,不再暴露在关键路径。

边界:DualPipe 需要两份参数,并比表中的 1F1B 多一个 stage-normalized activation 单位。

07 EXPERT PARALLEL

MoE 省的是每 Token 计算,不会自动省通信与等待

ROUTERToken → top-k experts
DISPATCHAll-to-All #1
EXPERT GEMM每 rank 本地执行
COMBINEAll-to-All #2
MIX按 router weight 聚合

逻辑 payload 近似随 `tokens × top-k × routed width × bytes` 增长;但 end-to-end time 还受 capacity、 padding、路由 metadata、跨节点比例和最忙 rank makespan 影响。MoE 专题 已详细解释模型路由,本章只聚焦执行系统。

GShard把 expert parallel 带进大规模 Transformer

路由、自动分片与跨设备 expert execution 成为一体。

Tutel自适应 parallelism 与 kernel

不同专家数、capacity、硬件下切换执行策略。

MegaBlocksDropless block-sparse compute

不靠固定 capacity padding / dropping,但真实不均衡工作仍存在。

DeepEP优化 dispatch / combine 数据路径

高吞吐与低延迟 kernel;不单独保证每 rank token load 相同。

MoonEP:先给 rank 级完美均衡一个上界保证

INPUTS×K×R assignments

每 rank 本地 S Tokens,每 Token 选择 K experts。

ONLINE PLAN填满 underloaded rank

remote tokens 最多来自一个 source rank。

BOUND≤ E/R redundant experts

每个 source rank 本地最多 E/R experts。

STATIC SHAPE每 rank 恰好 S×K

固定 buffer,消除逐层 shape host sync。

完美 rank balance 不是完美 expert-GEMM balance

每 rank 总 assignments 相同以后,rank 内不同 experts 仍可一多一少。K3 还需要 workload-aware scheduler 平衡 SM makespan。MoonEP 的 `S×K` vs DeepEP `S×K×R` 也只适用于报告定义的 worst-case copy-free buffer 对照。

08 CONTEXT PARALLEL

长序列并行不是一种算法,而是一组不同的数据布局

方法切什么通信关键边界
{contextMethods.map((row) =>
{row.map((cell, index) => index === 0 ? {cell} : {cell})}
)}
ULYSSES
S/4 · all headsS/4 · all headsS/4 · all headsS/4 · all heads
All-to-All
full S · H0full S · H1full S · H2full S · H3

把 sequence shard 转成 head shard;attention 后再转回来。

RING ATTENTION
Q0
K/V0
Q1
K/V1
Q2
K/V2
Q3
K/V3
K/V blocks 轮转 →

每 rank 固定本地 Q,在线累积对全局 K/V 的精确 softmax。

K3 / KDA CONTEXT PARALLEL

KDA 是 recurrent linear attention:每 rank 从本地 Token 计算 fixed-size transition/state fragments, 一次 AllGather 后用 prefix scan 恢复 incoming state。它不搬完整历史 KV,但只覆盖 KDA 分支; K3 的 MLA 与视觉 encoder 仍有各自 CP。

09 NUMERICS & OPTIMIZER

低精度训练要分别回答:存什么、算什么、在哪里累加

STOREBF16 / FP8

权重与 activation 占多少 HBM。

GEMM INPUTFP16 / BF16 / FP8

Tensor Core 使用何种格式。

ACCUMULATEFP32 / mixed

大量乘加与 reduction 是否丢失小量。

UPDATEFP32 master

优化器状态和参数更新精度。

DEEPSEEK-V3

FP8 compute framework

主要 compute-intensive GEMM 使用 FP8;敏感操作保留更高精度;tile/block scaling 管动态范围; WGrad FP8 也让相关 activation 可按 FP8 保存。

KIMI K2

FP8 activation storage

部分 MoE / SwiGLU 输入压成 FP8-E4M3,scale 为 FP32;K2 明确没有用 FP8 compute, 因为前期研究观察到潜在性能退化风险。

KIMI K3

Muon 改写通信图

Newton–Schulz orthogonalization 需要完整矩阵;K3 不全量 AllGather,而让 owner rank P2P 获取自己更新所需 shards,并按 model chunk pipeline。

10 DEEPSEEK SYSTEMS LINEAGE

DeepSeek 的亮点不是单个 kernel,而是模型、路由、调度与网络共同设计

{deepseekSteps.map(([model, year, config, body], index) => (
{String(index + 1).padStart(2, "0")}{model}
{config}

{body}

))}

V3 的四层闭环

MODELMLA + fine-grained MoE

少 activated parameters;但跨节点 expert traffic 重。

ROUTER最多 4 个节点

限制 IB fan-out,再在节点内经 NVLink 转发。

KERNEL20 SM communication

warp specialization 与动态任务分配;这是报告集群的实测配置。

SCHEDULEDualPipe overlap

把 A2A 与 attention / MLP / backward 重排进同一时间轴。

“V3 不用 TP”是配置事实,不是架构定律

V3 借助大 EP、ZeRO-1、selective recomputation 与 FP8 把状态放下,避免高频 TP 通信。 换硬件、batch、专家布局或上下文长度后,最优并行配置可能改变。

11 KIMI SYSTEMS LINEAGE

K2 → K3:从“稳定复用一套并行配置”走向统一执行与存储系统

{kimiSteps.map(([model, scale, mechanism, body], index) => (
{String(index + 1).padStart(2, "0")}{model}{scale}

{mechanism}

{body}

))}

K2 为什么主动不采用 DualPipe

DUALPIPE GAIN 更少 bubble + 重 A2A overlap
VS
K2 COST 2× parameter / gradient memory
K2 CHOICE Interleaved 1F1B + extra warmup + WGrad overlap

K2 是 1T total-parameter MoE。报告指出,DualPipe 的额外状态会迫使系统增加 PP 或 EP: 更大 PP 增加 bubble,更大 EP 提高通信与负载成本。因此团队保留 16 PP / 16 EP / ZeRO-1, 用更多 warmup micro-batches 覆盖 EP communication,并让 WGrad 与 PP communication 并行。

K3 3T-class 预训练执行图

ROUTINGMoonEP

在线冗余 expert 规划 → rank perfect balance → static shape

ACTIVATIONUnified manager

recompute + block FP8 + local/remote offload

GRADIENTPipeline ZeRO-2

GPU double buffer → DP reduce → CPU shards

OPTIMIZERP2P Muon

只取 locally owned matrices 的远端 shards

MULTIMODALDynamic CP + bubble fill

大图切 patch;大部分 ViT compute 放入 text PP 空隙

12 INTERACTIVE LAB

亲手改变配置,看瓶颈怎样从一张账移动到另一张账

推荐依次尝试:在显存账中把 70B 切到 ZeRO-3;在 device mesh 选择“故意冲突”; 在 pipeline 中比较 1F1B 与 DualPipe 的参数副本;最后把通信 overlap 拉到 95%,观察 bytes 不变、exposed time 下降。

13 MILLION-TOKEN AGENTIC RL

到 Agentic RL,训练系统还要管理 KV、环境和跨迭代长尾

01TRAIN

Policy update;model、optimizer 与 gradient 占 GPU/CPU。

02RESHARD

训练布局转成 inference layout;K2 用 checkpoint engine。

03ROLLOUT

百万 Token KV、tool latency、partial trajectory 与 sandbox。

04REWARD

Reference / judge forward;权重可能无法常驻 GPU。

K3 的三次“生命周期复用”

KV / WRITE-BACK只在 GPU eviction 时写 CPU

active decode blocks 留在 GPU;idle reusable prefix 才进入 external pool,KDA state 与 MLA KV 一起管理。

HBM / GRAD BUFFERReference weights 借用 policy gradient storage

一个 VPP slot 当前 forward,另一个 prefetch 下一 chunk;真实 backward 前再被 gradient 覆盖。

ENV / PAUSE推理等待时释放 sandbox 资源

AgentENV 用 Firecracker microVM,支持 incremental checkpoint、resume、fork 与 snapshot。

CHECKPOINT133 ms

报告最低延迟

RESUME49 ms

报告最低延迟

MEMORY OVERCOMMITup to 6.5×

真实 workload 报告

SANDBOXES51,219,741

K3 训练与评估累计

这些是 K3 报告的生产统计,不是通用 Firecracker benchmark

系统数字高度依赖镜像、内存 dirty rate、存储层和并发形态。课程保留原始口径,不把最小延迟或最高 overcommit 外推到其他环境。

14 CONFIGURATION PLAYBOOK

没有“最好并行策略”,只有当前最先触顶的约束

01单 replica 的模型状态放不下?

先算精确 byte ledger;考虑 ZeRO/FSDP、TP/PP/EP 或 optimizer offload。

02参数放下,但 activation OOM?

减 micro-batch;selective recompute、FlashAttention、SP/CP、压缩或 offload。

03GPU 忙但 MFU 低?

检查 GEMM shape、kernel fusion、micro-batch、低精度和 launch overhead。

04GPU 在等网络?

先定位 collective、频率和拓扑;再谈减少体积、换 group、chunk 或 overlap。

05PP 有大块空白?

增加 m、virtual chunks、B/W split 或双向 schedule,同时重算 activation 与参数副本。

06MoE 最忙 rank 拖尾?

分开 router balance、rank placement、redundant experts 与 rank 内 GEMM scheduling。

07长序列单样本放不下?

按 attention 类型选择 Ulysses、Ring、USP 或 recurrent-state CP;不要只增 DP。

08训练能跑但经常失败?

计算 checkpoint 恢复时间、数据确定性、world-size reshard 与环境状态恢复。

ONE RULE TO KEEP

每项优化都要写两句话:它省了什么;它把代价搬到了哪里。

PRIMARY-SOURCE CHAIN

从分布式深度学习到 K3:37 个一手阅读节点

这不是按引用数排序的“必读榜”,而是一条问题链。建议先读带有当前瓶颈的节点: 容量读 ZeRO;层内切分读 Megatron;气泡读 GPipe / ZeroBubble;MoE 执行读 MegaBlocks / DeepEP / MoonEP; 长序列读 Ulysses / Ring / USP;最后回到 DeepSeek 与 Kimi 的整机协同。

{paperChain.map(([year, title, url, note], index) => ( {String(index + 1).padStart(2, "0")} {title}

{note}

))}
证据规则

本页机制和数字回查论文、官方技术报告或作者仓库;图均为课程原创简化示意。 性能提升只属于论文的模型、集群和基线,不作跨系统排行榜。