一、Kimi K3 的模型规格
先把事实摆清楚。根据摩尔线程官网新闻 /news/334(技术正文以同花顺财经 2026-07-28 的逐字转载全文为准),Kimi K3 的关键规格如下:
| 维度 | 规格 |
|---|---|
| 总参数量 | 2.8 万亿 |
| 注意力骨干 | 69 层 KDA + 24 层 Gated MLA 混合 |
| MoE 结构 | Stable LatentMoE,896 专家,TopK 16 |
| 多模态 | 原生视觉理解 |
| 上下文长度 | 100 万 token |
| 权重格式 | MXFP4 checkpoint |
| 适配硬件 | 8 张 MTT S5000 单节点跑通 |
二、KDA 与 Gated MLA:混合注意力对推理引擎意味着什么
69 层 KDA 加 24 层 Gated MLA 的"混合骨干",是本次适配中最深的一处工程改动来源。要理解为什么,先看两种注意力在推理时的状态形态差异。
传统注意力(含 MLA)在 Decode 阶段维护的是 KV Cache:随序列长度线性增长,按 token 追加,天然适合分页(PagedAttention)与前缀共享。而 KDA 这类线性/递归形态的注意力,Decode 阶段维护的是 固定大小的 recurrent state 与 conv state:它不随序列长度增长,但它是就地更新的——每来一个 token,状态被原地改写。
这两种形态放在同一个模型里,推理引擎的内存管理器就必须同时支持"可分页、可追加、可共享"与"定长、原地更新、不可简单拼接"两套语义。更麻烦的是,现代推理引擎的很多关键功能——Prefix Cache、分块 Prefill(chunked prefill)、PD 分离——本质上都建立在"状态可以被切分、复制、跨实例搬运"这个假设上。对 KV Cache 这是成立的,对 recurrent state 需要额外机制。
Hybrid State Pool 的四个语义
SGLang-MUSA 侧为此适配了 Hybrid State Pool,同时管理 KDA 的 recurrent state 与 conv state,并提供四组语义:
- 分配(allocate):为新请求分配定长状态槽位。与 KV Cache 的按需增长不同,这里是请求进入时一次性确定的固定开销,因此并发上限可以被精确计算。
- 原地更新(in-place update):Decode 每步直接改写槽位内容,不产生新分配,也就没有 KV Cache 那样的碎片问题。
- 快照(snapshot):把当前状态完整拷出。这是让 Prefix Cache 与分块 Prefill 能够工作的关键——因为线性注意力的状态无法"从中间截取",只能在切分点整份保存。
- 恢复(restore):把快照写回槽位,用于命中前缀缓存、分块 Prefill 续跑,以及 PD 分离下 Decode 侧接手 Prefill 侧的状态。
把这四个语义和上层功能对上,就能看清整条链路:Prefix Cache 需要在共享前缀结束处做一次 snapshot,后续命中的请求做 restore;分块 Prefill 需要在每个 chunk 边界 snapshot,下一个 chunk 从 restore 开始;PD 分离 则需要把 snapshot 跨节点搬到 Decode 实例再 restore——这正是上一课 m8-l13 讲的 Mooncake 承担的职责,只不过它搬运的不只是 KV Cache,还包括 KDA state。
三、MXFP4 加载期在线逐层量化
Kimi K3 的 checkpoint 采用 MXFP4 格式。摩尔线程的处理方式是加载期在线逐层量化,无需离线转换——这句话看似只是省了一步,实际影响相当大。
对比两条路线。离线转换路线:拿到官方权重后,先跑一个转换脚本,产出一份适配本硬件的权重副本,再启动服务。它的代价是 Day-0 场景下几乎致命的——2.8 万亿参数的模型,转换本身就要耗费可观的时间与磁盘(需要同时存放原始与转换后两份权重),而且转换脚本本身要先写好、先验证好,这在"模型发布当天"是不现实的。加载期在线量化路线:服务启动时,一层一层地读入 MXFP4 权重、就地转换为硬件可高效执行的形式、然后释放临时缓冲。它的好处是零额外磁盘、零转换脚本维护、权重与官方发布完全一致(便于校验 hash);代价是首次启动时间变长,且量化逻辑必须内建在推理引擎里。
"逐层"三个字是这条路线可行的关键:如果一次性把整个 2.8T 模型读进内存再量化,任何机器都放不下;逐层处理意味着峰值额外内存只与单层规模相关。这与我们在 m8-l12 讨论的 FP8 标定思路是同一个工程哲学——把大问题切成能被硬件边界容纳的小问题。
# 概念性验证清单:确认走的是在线量化而非离线权重
# 1) 权重目录应保持官方原样,不应出现转换产物
ls -la /models/Kimi-K3 | head
du -sh /models/Kimi-K3 # 与官方发布体积一致
# 2) 启动时观察:首次加载耗时明显长于同规模 BF16 模型,
# 但磁盘上没有新增第二份权重
/usr/bin/time -v python -m sglang.launch_server \
--model-path /models/Kimi-K3 --device musa --tp 8 2>&1 | tee load.log
grep -iE "quant|load" load.log | head -40
# 3) 加载期间监控显存曲线:应呈现"逐层上升"而非"一次性尖峰"
watch -n 1 mthreads-gmi
四、896 专家 TopK16:DeepEP 的压力测试
Stable LatentMoE 的 896 专家 / TopK16 配置,对专家并行通信库是一次结构性压力测试。回忆 m8 模块里讲过的 MoE 通信三步:dispatch(把每个 token 按路由结果发到对应专家所在的卡)、专家计算、combine(把结果按权重收回)。中间承载的是 All-to-All 通信。
896 专家意味着路由目标空间比常见的 256 专家配置大了 3.5 倍,TopK16 又意味着每个 token 要同时发往 16 个目的地(常见配置是 TopK 8)。两者相乘,单 token 的通信扇出与元数据规模都显著上升,dispatch/combine 的索引计算、缓冲区规划、All-to-All 的分桶策略都需要重新适配。摩尔线程为此对 DeepEP 做了 896 专家 / TopK16 的 dispatch、combine 与 All-to-All 适配。
这里可以对照 m8-l12 里 vLLM-MUSA 的 FP8 MoE 标定逻辑理解:MoE 的性能从来不是"一个 kernel 快不快"的问题,而是"路由—通信—计算"三段的协同问题。专家数与 TopK 一变,最优的分桶与并行策略就会整体漂移,这也是为什么每个新 MoE 结构都需要重新适配,而不能指望通用实现。
五、软件闭环与通信分工
Kimi K3 适配所依赖的完整软件闭环是:
SGLang-MUSA → MATE → Triton / TileLang / MTCC → MUSA Runtime
逐层理解各自职责:SGLang-MUSA 负责调度、状态管理(Hybrid State Pool 就在这一层)、批处理与服务接口;MATE 提供高性能算子——注意,MATE 正是在 v0.2.5 中新增了 KDA Decode 支持与 KIMI K3 模型推理支持,两条时间线在这里交汇,详见本站 m6-l7 的 2026-08-10 更新章节与 MATE v0.2.5 Release Notes;Triton / TileLang / MTCC 是三条互补的 kernel 生成与编译路径,用于快速补齐 MATE 尚未覆盖的算子;MUSA Runtime 是底座。
通信侧则是三个组件各司其职,这个分工值得单独记住:
| 组件 | 职责 | 在 K3 场景中的具体作用 |
|---|---|---|
| MCCL | 集合通信 | TP/EP 下的 AllReduce、All-to-All 等标准集合操作 |
| MTSHMEM | 低时延通信 | 面向细粒度、低延迟的通信路径 |
| Mooncake | 跨节点状态迁移 | PD 分离下搬运 KV Cache 与 KDA state |
六、Step-by-Step:把这套能力落到自己的环境
由于官方未公布 Kimi K3 的具体启动命令与镜像 tag,下面给出的是基于已确认事实的能力核查流程,用来判断你手上的环境是否具备运行此类混合架构模型的条件。每一步都对应上文的一个结构性要求。
# Step 1 — 硬件与拓扑:确认 8 卡节点与卡间互联
mthreads-gmi -L # 应列出 8 张 MTT S5000
mthreads-gmi topo -m # 检查 MTLink 拓扑
# Step 2 — MATE 版本:KDA Decode 需要 0.2.5 及以上
python -c "import mate; print(getattr(mate,'__version__','unknown'))"
pip show mate-mubin 2>/dev/null | grep -i version
# Step 3 — SGLang-MUSA 是否具备 Hybrid State Pool 能力
python -c "import sglang; print(sglang.__version__)"
python -m sglang.launch_server --help | grep -iE "chunked|prefix|disaggregation"
# Step 4 — DeepEP 可用性(896 专家 / TopK16 依赖)
python -c "import deep_ep; print('deep_ep ok')"
# Step 5 — 通信库自检
python -c "import torch, torch_musa; print(torch.distributed.is_available())"
# Step 6 — PD 分离前置:Mooncake 传输层(见 m8-l13)
python -c "import mooncake; print('mooncake ok')"
排障与回滚:这类前沿架构适配的典型失败模式有三种。① 算子缺失:报错指向未实现的 KDA 相关 kernel,说明 MATE 版本低于 0.2.5,升级即可,但注意 vLLM-MUSA 侧对 MATE 0.2.5 的依赖曾被回滚(见 m6-l7 更新章节),SGLang 与 vLLM 两条栈要分别评估。② 结果异常但不报错:长上下文或开启 Prefix Cache 后输出质量下降,几乎可以确定是状态快照/恢复语义不完整——回滚方式是关闭 Prefix Cache 与分块 Prefill,退回到最朴素的整段 Prefill 验证基线正确性,再逐项打开定位。③ 加载期 OOM:MXFP4 在线量化的峰值内存与单层规模相关,若 OOM 说明并行切分不足,增大 TP 度或检查是否误用了整模型一次性加载路径。