Prhub

#34106 [jit_kernel] Fix missing JIT kernel namespaces

原始 PR 作者 mmangkad 合并时间 2026-08-08 22:15 文件变更 2 提交数 2 评论 3 代码增减 +6 / -2

执行摘要

修复 JIT 内核 missing namespace,恢复首次编译

PR body 明确指出:这是 #33400 遗留的 namespace 迁移遗漏。align_single_token.cuh 是 #32541 之后新增的 kernels,仍然使用匿名 namespace;modulate_scale_shift.cuh 在 #33400 中也只迁移了内部伪命名空间 sglang_modulate_scale_shift,缺少最外层 sglang。这会导致以 sglang:: 前缀引用的调用方(load_jit 生成的包装代码)找不到符号,进而破坏 JIT 首次编译。

值得快速阅读,作为 JIT 内核 namespace 约定的补充案例。主要关注点是:新增/迁移 JIT 内核时必须检查 namespace sglang 包裹,#33400 这种全局迁移很可能漏掉之后新增的文件,补丁型修复可以快速恢复但最好有扫描机制防回归。

讨论亮点

该 PR 的 review 过程非常简洁:BBuf 直接 APPROVED,没有留下任何 inline review 评论。Issue 评论区出现两条 /rerun-test 机器指令,其中 BBuf 触发的 rerun 最终通过,属于 CI 层面的常规操作,没有设计争议或未解决疑虑。

实现拆解

  1. 在 python/sglang/kernels/jit/csrc/moe/align_single_token.cuh 中,将文件顶部的匿名 namespace 改为 namespace sglang,并把末尾的 } // namespace 注释改为 sglang。这样单 token MoE 对齐内核(#32541 新增)就和其他 JIT 内核一样位于 namespace sglang 下,load_jit 生成的无前缀导出才能找到它。
  2. 在 python/sglang/kernels/jit/csrc/diffusion/modulate_scale_shift.cuh 中,在现有的 namespace sglang_modulate_scale_shift 外层再包裹一层 namespace sglang,并在文件末尾闭合。该文件在 #33400 中只把内部伪命名空间做了嵌套化,遗漏了最外层包裹,本次补齐。
  3. 验证:H200 上清空 TVM-FFI 缓存后运行 test_modulate_scale_shift.py,12 个测试全部通过,覆盖 BF16/FP16 生产与边界形状,并且要求与 eager PyTorch 逐位相等,证明修复没有改变任何计算。
文件 模块 状态 重要度
python/sglang/kernels/jit/csrc/moe/align_single_token.cuh JIT 内核 modified 3.12
python/sglang/kernels/jit/csrc/diffusion/modulate_scale_shift.cuh JIT 内核 modified 3.12

关键源码片段

python/sglang/kernels/jit/csrc/moe/align_single_token.cuh core-logic

#32541 新增的单 token MoE 对齐内核,在 #33400 迁移时被遗漏,仍是匿名 namespace;本 PR 将其改为 namespace sglang,补齐 JIT 命名空间约定。

// python/sglang/kernels/jit/csrc/moe/align_single_token.cuh
// 修复 #33400 的命名空间迁移遗漏:该文件是 #32541 新增的
// 单 token MoE 对齐内核,原为匿名命名空间,改为 namespace sglang
#include <cstdint>namespace sglang {struct AlignSingleTokenParams {
    const int32_t* __restrict__ topk_ids; // [1, topk]
    // ... 其余字段未改动
};struct AlignSingleTokenKernel {
    // ... 内核实现未做任何计算改动
};} // namespace sglang
python/sglang/kernels/jit/csrc/diffusion/modulate_scale_shift.cuh core-logic

#33400 只把内部伪命名空间 sglang_modulate_scale_shift 嵌套化,遗漏了最外层 namespace sglang;本 PR 补齐外层包裹,恢复 diffusion adaLN modulation 内核的首次编译。

// python/sglang/kernels/jit/csrc/diffusion/modulate_scale_shift.cuh
// 在伪命名空间 sglang_modulate_scale_shift 外层补齐 namespace sglang
#include <cstdint>namespace sglang {namespace sglang_modulate_scale_shift {
namespace {struct ModulateScaleShiftKernel {
    // ... 内核实现未改动,bit-exact 测试保证与 eager PyTorch 逐位一致
};} // namespace
} // namespace sglang_modulate_scale_shift} // namespace sglang

评论区精华

CI rerun other

BBuf 在 issue 评论区触发 /rerun-test 重跑 test_unified_radix_cache_kl_dsv4.py,最终通过。

结论:重跑的 CI 测试通过,无代码层面争议。 · 已解决

风险与影响

  1. 回归风险:两个文件都是头文件(.cuh),被多个 JIT 内核源文件 include;如果某个调用文件仍然以匿名命名空间的前提去引用(虽然不应存在),补上 namespace 后可能产生编译错误。但 #33400 迁移后所有 JIT 内核都要求 namespace sglang,修复方向与既有约定一致。
  2. 未见风险:不涉及计算逻辑改动,bit-exact 测试已覆盖 modulate 内核;align_single_token.cuh 没有对应的直接测试变更,但代码只是包装命名空间。
  3. 影响面:只影响 JIT 首次编译路径(fresh TVM-FFI cache),对已经缓存过的部署无影响。
  1. 用户影响:修复了从 main 拉取最新代码并清空 JIT 缓存后,走 MoE 单 token 对齐或 diffusion adaLN modulation 路径时可能出现的编译失败或符号找不到问题。
  2. 系统影响:不影响运行时计算,bit-exact 校验保证数值一致。
  3. 团队影响:这是一次小的合规性修复,延续 #33400 的 namespace 统一约定,降低后续新增 JIT 内核遗漏 namespace 的可能性(可通过 test_kernels_namespace 之类检查兜底)。
命名空间迁移遗漏 影响 JIT 首次编译路径

关联 Issue

#32541 [Kimi] Support kimi-k3
#33400 [jit_kernel] Move JIT kernels into namespace sglang

完整报告

参与讨论