Prhub

#32072 [Kernel] RFC #29630 finale: retire sglang.jit_kernel into sglang.kernels

原始 PR 作者 BBuf 合并时间 2026-07-23 08:35 文件变更 354 提交数 4 评论 1 代码增减 +889 / -875

执行摘要

删除 sglang.jit_kernel 包,完成统一内核命名空间迁移

根据 RFC #29630,SGLang 需要统一的 sglang.kernels 命名空间来组织内核,以解决代码散布在多个位置的问题。前序批次已逐步迁移了各算子,本 PR 消除过渡期残留的 shim 层和旧包引用,最终退役 sglang.jit_kernel

  • 值得精读:本 PR 展示了如何逐步完成大规模包迁移的收尾工作,包括处理 shim、构建基础设施、打包配置、CI 触发器和文档同步。对于想了解 SGLang 内核组织模式的读者,这是必读 PR。
  • 值得关注的决策
    1. 采用“先保留 shim 逐步迁移,最后一次性删除”的策略,平衡了迁移进度与兼容性。
    2. 将所有 JIT 构建资源(csrc/include)放在 kernels/jit/ 下,而不是分散在算子模块中,保持了复用。
    3. 在打包配置中灵活使用 glob 模式,确保新路径被包含在 wheel 中。
  • 核心理念:统一的 import 入口有助于降低贡献者认知负担,也为未来内核调度和缓存打下基础。
讨论亮点

本 PR 的 review 评论很少(1 条来自 gemini-code-assist bot 的 sunset 说明,无实质性讨论),且无 inline review 评论。PR 由作者 BBuf 直接合并。

实现拆解

1. 删除旧的 shim 层和包结构

  • 移除 python/sglang/jit_kernel/ 下的所有文件(约 80 个文件),包括之前作为过渡期兼容 shim 的 8 个 batch-1 文件(如 activation.pynorm.pydsv3_router_gemm.py 等)以及其余算子、子包、构建目录和 __init__.py
  • 所有曾通过 shim 导出的符号现在直接来自 sglang.kernels.ops.<group>,调用处已在前序 PR 中更新。

2. 迁移共享 JIT 构建基础设施

  • csrc/include/benchmark/tests/.clang-format 等文件从 sglang/jit_kernel/ 移动至 sglang/kernels/jit/ 下,同时保留 git 历史(通过重命名追踪)。
  • 修改 sglang/kernels/jit/utils/compile.py 中的 KERNEL_PATH 解析逻辑:将 find_spec("sglang.jit_kernel") 替换为 find_spec("sglang.kernels.jit")

3. 更新所有调用点与导入引用

  • 扫描并更新了仓库中所有仍然引用 sglang.jit_kernel 的地方,包括:
    • 模型文件(如 inkling_*cutedsl_gdndsaropeflash_attention 等);
    • 基准测试(benchmark/);
    • SGL-Kernel 子项目(sgl-kernel/);
    • Profiler 辅助脚本(.claude/skills/llm-torch-profiler-analysis/scripts/triage_kernel_helpers.py)中的候选路径。
    • 所有导入均改为从 sglang.kernels.ops.<group> 引入对应的 _jit_ 模块。

4. 调整打包、CI 与所有权文件

  • 打包配置:在 pyproject.toml 以及 5 个平台专用 wheel 配置文件(pyproject_cpu.tomlnpu.tomlxpu.tomlother.toml3rdparty/amd/wheel/pyproject.toml)中,把 package-data 的 glob 从 jit_kernel/**/* 改为 kernels/**/*,确保构建时携带移动后的 csrc/include 等资源。
  • CI 触发器:更新 pr-test-check-changespr-test-amdpr-test-amd-rocm720pr-test-npu 等工作流文件中的 change-filter 路径从 sglang/jit_kernel/** 改为 sglang/kernels/**
  • 所有权与维护者文档:修改 labeler.ymlCODEOWNERSMAINTAINER.md 中的路径映射,并在 MAINTAINER.md 中更新了引用。

5. 验证与清理

  • 作者在本地 (torch 2.11) 验证了 import sglang.kernels.ops 干净(不触发 SGL-Kernel 加载),KERNEL_PATH 能正确解析到 kernels/jitcsrc/include/ 存在,所有 24 个重写目标模块路径均可通过 find_spec 导入。
  • 155 个变更的 .py 文件编译通过,pre-commit 检查通过。
文件 模块 状态 重要度
python/sglang/jit_kernel/ 旧内核包 removed 7.44
python/sglang/kernels/jit/utils/compile.py 内核基础设施 modified 6.21
.claude/skills/llm-torch-profiler-analysis/scripts/triage_kernel_helpers.py Profiler 脚本 modified 5.57
.github/workflows/pr-test-npu.yml CI 配置 modified 5.86
python/sglang/srt/layers/moe/cutlass_w4a8_moe.py MoE 内核 modified 5.74

关键源码片段

python/sglang/jit_kernel/ deletion

整个包的删除是本次 PR 的核心动作。其中包含了所有前序迁移留下的 shim 文件(如 activation.py、norm.py、dsv3_router_gemm.py 等),这些文件只是重新导出新路径的符号,删除后再也没有间接层。

# 旧包删除前,典型的 shim 文件只包含几行重导出代码。
# 例如 python/sglang/jit_kernel/activation.py:"""Compatibility shim (RFC #29630 Phase 4) -> sglang.kernels.ops.activation._jit_activation."""from sglang.kernels.ops.activation import _jit_activation as _implglobals().update({k: getattr(_impl, k) for k in dir(_impl) if not k.startswith("__")})# 该文件已被删除,所有调用方已改为直接导入
# from sglang.kernels.ops.activation import _jit_activation
.claude/skills/llm-torch-profiler-analysis/scripts/triage_kernel_helpers.py core-logic

该脚本是 Profiler 分析辅助工具,其中定义了多个 `FusionPatternSpec` 并引用了旧路径。PR 更新了其中的候选路径,使之指向 `sglang/kernels/ops/` 下对应的模块,避免 Profiler 使用时找不到文件。

# 变更示例:将候选路径中的旧包路径改为新包路径
# 来源:.claude/skills/llm-torch-profiler-analysis/scripts/triage_kernel_helpers.py# 变更前:
# candidate_path = (
# "python/sglang/srt/models/utils.py"
# "<br>python/sglang/jit_kernel/norm.py"
# )# 变更后:
FusionPatternSpec(
    pattern="In-place QK RMSNorm",
    candidate_path=(
        "python/sglang/srt/models/utils.py"
        "<br>python/sglang/kernels/ops/layernorm/_jit_norm.py"
    ),
    active_keywords=("fused_inplace_qknorm", "minimaxm2rmsnormtp"),
    ...
)

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

1. 漏掉的引用导致运行时导入失败

  • 虽然作者扫描过,但极少数非 Python 文件(如文档、Notebook 或第三方脚本)或未进入 CI 覆盖的分支可能仍引用旧的 sglang.jit_kernel 路径。但该包已被删除,任何运行时尝试 import 都会抛出 ModuleNotFoundError。
  • 风险较低,因为主库代码已全部转换,且 CI 覆盖了主要路径。

2. JIT 构建基础设施路径变更

  • compile.py 中的 KERNEL_PATH 解析逻辑改变,如果某些 JIT 内核在首次编译时找不到 csrc/include/,会编译失败。但由于 find_spec 替换与目录重命名对应,测试已经验证通过。
  • 但不同平台(NPU、XPU、AMD)可能依赖特定的构建文件路径,需要关注 CI 结果。

3. 打包配置的兼容性

  • package-data glob 从 jit_kernel/**/* 改为 kernels/**/*,如果还有旧版本的 wheel 或者 pip 缓存,可能产生冲突。建议用户安装新版本时清除缓存。

4. 外部依赖(如 sgl-kernel)的隐式导入

  • sgl-kernel 子项目中的部分代码可能通过 from sglang.jit_kernel import ... 导入,已在本次修改中更新。如果存在未跟踪的引用(如 GIT LFS 文件、docker 构建中的拷贝),则可能出现缺失。

总体风险可控,但属于核心路径变更,建议合并后监视 CI 和用户反馈。

对用户的影响

  • 无直接功能变化。所有内部 API 已迁移,用户代码只需通过 sglang.kernels.ops 导入内核即可。对于仅通过 SGLang 入口(如 HTTP 服务)使用的用户,完全透明。

对系统的影响

  • 包大小略微减小(删除 shim 层),但 JIT 构建所需资源仍在。
  • 导入速度可能加快(去除了间接跳转)。
  • 构建系统路径调整,可能影响 CI 时间和首此编译时的缓存。

对团队的影响

  • 积极的:消除了过渡期的双重维护,内核组织更清晰,引用路径更统一。
  • 负面的:所有基于旧路径的文档、外部脚本、个人分支需要更新。但作者已同步更新了文档和 CI。
  • 协作影响:同仓库的多个活跃开发分支可能需要合并本 PR 以避免冲突。
核心路径变更 包删除风险 构建路径依赖 CI 调整影响面广

关联 Issue

#29630 [RFC] Introduce a unified sglang.kernels namespace for kernel organization and dispatch

完整报告

参与讨论