Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/qwen38-bringup-prompt.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ Rust 在 `kernel-lab` 容器里构建,home 挂在 `/work`;binary 宿主机

## 这件事为什么重要

kern 卖的是 model-agnostic runtime,但到今天只跑过 Qwen3-4B。这次的目标不只是
kern 是 model-agnostic runtime,但到今天只跑过 Qwen3-4B。这次的目标不只是
"跑通",而是拿到一份可公开的证据:**一个 agent 从零把一个结构完全不同的新模型
带上 kern,花了多久、改了什么、没改什么。** 整个 session trace 会开源。所以:

Expand Down
18 changes: 5 additions & 13 deletions docs/registry.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@ vendored 的 CUTLASS 核、自己的手写核),每挖一个都要花一次 A

| 事项 | 决定 |
|---|---|
| 字节放哪 | HF private 仓库 `Pegainfer/kern-kernels`,`blobs/<sha256>` 平铺、无扩展名,与本地缓存 `~/.cache/kern/blobs/` 同构 |
| 字节放哪 | HF 公开仓库 `Pegainfer/kern-kernels`,`blobs/<sha256>` 平铺、无扩展名,与本地缓存 `~/.cache/kern/blobs/` 同构 |
| 事实记哪 | 独立 private Git 仓库的 `index/<family>.toml`(`KERN_INDEX_DIR` 指向该目录),一族一文件,由导入工具生成、CI 检查、人 review |
| ABI 在哪 | `tools/kernels/abi/<family>.py`,一族一个 Python 模块,输入 index 里的 variant 与形状、输出 manifest op 的 `impl`(今天的 `trtllm_fmha_abi.py` 就是这个形状) |
| runtime 改什么 | `source` 除 `hf:` 外接受裸 `https://` URL(`hf:` 退化为 URL 模板的语法糖);modules 全是 registry ref 时不再要求 `--kernels` 目录 |
| 换主机怎么办 | 改 `source` 标签、重生成 manifest;sha 不变,index 不变。on-prem 交付 = 拷 `blobs/` 目录,不需要任何 registry |
| 换主机怎么办 | 改 `source` 标签、重生成 manifest;sha 不变,index 不变。离线部署 = 拷 `blobs/` 目录,不需要任何 registry |
| 不做什么 | 不做查询服务;TOML 里不做模板语言(ABI 留在 Python);不按模型建索引;runtime 不知道 index 的存在 |

## 2. Blob store
Expand Down Expand Up @@ -49,12 +49,6 @@ runtime 校验的是第三个,前两个换了都不影响运行。同一个 bl
有了 index 之后翻目录的场景消失,而平铺 sha 换来三件事:镜像是 `rsync`、
本地缓存目录就是完整的离线分发单元、永远没有重命名与冲突。

**为什么 HF、为什么 private。** runtime 已经会读 `HF_TOKEN` 拉 `hf:`,零改动;
第三方 cubin(Apache-2.0)与我们自己的 ABI、报告混放在一个仓库里最省事,
所以整仓 private。网络不是考虑项(海外机器)。等有第一个外部客户,按客户的
交付形态把 `blobs/` 镜像到自己域名下的对象存储或客户的 OCI 仓库,只改
`source` 标签。

**许可证。** 再分发 Apache-2.0 的 cubin 要带 NOTICE:每个 family 的 index 记
`license` 与 `license_blob`(LICENSE 文本的 sha),仓库 README 列全部来源。
`Pegainfer/kern-qwen38-sm103` 里的 `licenses/LICENSE.trtllm-gen.txt` 就是第一份。
Expand Down Expand Up @@ -163,12 +157,10 @@ launch = abi.trtllm_bmm.op(v, n=6144, k=3584, ...) # v.module 给 {"cubin": "h
- 模型仓库(`Pegainfer/kern-qwen38-sm103` 一类)以后只放 manifest 与模型自己的
东西,cubin 一律指向 `kern-kernels`;现有仓库不动,新 manifest 按新写法生成。

## 5. 商业上意味着什么
## 5. 约定

index 是资产,blob 不是:第三方 cubin 谁都能从 wheel 里拿,我们卖的是"这个
形状用哪个变体、ABI 怎么摆、测过多少"。index 进 git 意味着它有 review 和历史;
TOML 已移到独立 private Git 仓库,格式不变;公开仓库保留索引工具与 ABI 代码。blob store
换主机是标签改写,离线交付是一个目录。继续遵守:不把事实写进 blob 的文件名,不让 runtime 依赖 HF 的任何特性。
index 进 git,有 review 和历史;TOML 在独立的 Git 仓库(见第 3 节),公开仓库保留索引工具与 ABI 代码。
blob store 换主机是标签改写,离线部署是一个目录。不把事实写进 blob 的文件名,不让 runtime 依赖 HF 的任何特性。

## 6. 门禁

Expand Down
2 changes: 1 addition & 1 deletion docs/roadmap.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ kern 在内部 RSI 里是 kernel agent 的反馈环境(`kern test` 裁判、`k
| 级 | 内容 | 门禁 |
|---|---|---|
| R1 ✅ | runtime:module `source` 接受裸 `https://` URL,`hf:` 是它的 URL 模板语法糖;modules 全是 registry ref 时 `Runtime::load` 不要求 kernels 目录;缓存目录(`KERN_CACHE_DIR`)即离线分发单元 | kern-manifest verify 测试覆盖 `https://` 与畸形 URL;预填缓存、断网、无 `--kernels` 下 `kern run examples/qwen3-4b.json` 与有网时逐字同。**2026-09-19 tray14 过**:modules 全改成 `https://blobs.invalid/blobs/<sha>`(无法解析的 host)+ 预填 `KERN_CACHE_DIR`,无 `--kernels`,32 token 与本地 cubin 跑逐字同、0 次 fetch(`~/bench_results/2026-09-19-registry/`) |
| R2 ✅ | blob store `Pegainfer/kern-kernels`(private,`blobs/<sha256>` 平铺)+ `$KERN_INDEX_DIR/<family>.toml` + `tools/kernels/abi/<family>.py` + `check.py`(CI);三个预编译核(trtllm fmha ctx、DSL mla decode、flash_kda)与手写核迁入,`handwritten.hw()` / `prebuilt()` 收编为 index 查询,`tools/kernels-bin/` 与生成器里的 nvcc 路径删除 | 重生成的 `examples/k3-*.json` 除 module `source` 外逐字节相同;4 层 TP4 prefill c8/c40/c7 与 EP4 c8/c40+free16 全 exact(同 P 行口径);`check.py --online` 全部命中。**2026-09-19 tray14 过**:10 个 example 重生成 0 行非 source 差异;43 族 49 变体 53 blob 上传,`check.py` 离线/在线 0 问题;k3_golden 用空 `--cubins` 目录跑 TP4 c8/c40/c7、EP4 c8/c40+free16、decode span8/plain 七项,exact 数与 09-18 逐项相同(span8 的 1 wrong 是同一个近平局);`~/bench_results/2026-09-19-registry/` |
| R2 ✅ | blob store `Pegainfer/kern-kernels`(`blobs/<sha256>` 平铺)+ `$KERN_INDEX_DIR/<family>.toml` + `tools/kernels/abi/<family>.py` + `check.py`(CI);三个预编译核(trtllm fmha ctx、DSL mla decode、flash_kda)与手写核迁入,`handwritten.hw()` / `prebuilt()` 收编为 index 查询,`tools/kernels-bin/` 与生成器里的 nvcc 路径删除 | 重生成的 `examples/k3-*.json` 除 module `source` 外逐字节相同;4 层 TP4 prefill c8/c40/c7 与 EP4 c8/c40+free16 全 exact(同 P 行口径);`check.py --online` 全部命中。**2026-09-19 tray14 过**:10 个 example 重生成 0 行非 source 差异;43 族 49 变体 53 blob 上传,`check.py` 离线/在线 0 问题;k3_golden 用空 `--cubins` 目录跑 TP4 c8/c40/c7、EP4 c8/c40+free16、decode span8/plain 七项,exact 数与 09-18 逐项相同(span8 的 1 wrong 是同一个近平局);`~/bench_results/2026-09-19-registry/` |
| R3 ✅ | 第一个新族 `trtllm_bmm_mxe4m3_mxe2m1_mxe4m3`(flashinfer-cubin 0.6.18 的 trtllm-gen batched GEMM,`siTuGlu` 变体即 K3 的激活):整族导入、ABI 从 bundle 的 `KernelParams.h` + `flashinferMetaInfo.h` 写、vLLM 容器里 `trtllm_fp4_block_scale_moe` 探针 capture 验证;K3 prefill 的 MoE 换成 allgather(fp8 latent) → CTA 表 → FC1 → FC2 → finalize → reduce-scatter,MegaMoE 留给 decode 形态;`[[pick]]` 由 `kern bench` 对 16k/4 行的 K3 形状扫 tile 变体写入 | 4 层 TP4 prefill 门禁不变;93 层 12.9k 判定点对;16k over 0 < 780 ms(MegaMoE 231 ms 里 GEMM 之外的 86 ms 是靶,新增两次集合通信预算 ~40 ms)。**2026-09-19 tray03 过**:两族 215 变体导入、ABI 移植对 capture 逐字段 0 差异、probe 门禁 `out` 逐位同;`kern bench` 扫 18 对 tile 变体(`k3-prefill-16k-ep4`)写入 pick(tile 128:FC1 0.85 / FC2 0.40 ms 每层,捕获的 tile 64 是 1.23 / 0.58);4 层 TP4 c40 1/1、c7 6/6,c8 4/5(step 15 是 4 ulp 近平局,逐层对比 MegaMoE 形态:同专家集合的行差 ~5% 即两条路各自的 fp8 中间量化);93 层 12.9k 单块 2/2、c8 16/17(之前 13/17);**16k over 0 = 749.5 ms**(之前 780;MoE 本体 231 → ~156,reduce-scatter 多出的 54 ms 是等最慢 rank 的专家负载);`~/bench_results/2026-09-19-registry/` |

## 流水线线(PP)
Expand Down
Loading