Prhub

#36704 Refactor JIT kernel and expert-pack directory layout

原始 PR 作者 BBuf 合并时间 2026-08-29 07:41 文件变更 25 提交数 5 评论 2 代码增减 +90 / -55

执行摘要

重构 JIT 内核与专家打包目录布局

PR body 指出需要保持 JIT 内核树组织有序:将 Python 操作包装器与 JIT 基础设施分离,按功能区域分组 CUDA 源码,并避免功能特定的仓库级 tools 目录。这同时也是对 #35314 目录布局反馈的后续跟进。

值得快速浏览,了解目录组织模式(ops 与 jit 分离、工具内嵌包)及延迟导入、Git 元数据回退等实用技巧。对于负责打包、部署或维护 JIT 内核的工程师,建议精读 expert_pack_runtime.pyminicpm_sala/__init__.py 的改动。

讨论亮点

本 PR 没有 review 评论或实质设计讨论。评论区仅有作者 BBuf 两次触发 /tag-and-rerun-ci extra,用于重跑额外 CI。PR 的变更点(如延迟导入、Git 元数据回退)均在实现中直接体现,未产生公开争议。

实现拆解

  1. 迁移 MiniCPM-SALA 包装器:将 python/sglang/kernels/jit/minicpm_sala/ 整体移至 python/sglang/kernels/ops/minicpm_sala/,新增 __init__.py 采用延迟导入(__getattr____dir__),避免过早加载 get_block_table,同时删除旧的 jit/minicpm_sala/__init__.py。CUDA 源文件保留在 jit/csrc/minicpm_sala,通过 loader 路径更新引用。
  2. 重组 JIT 头文件:将两个散落的 JIT 头文件分别移入 csrc/elementwisecsrc/speculative,并同步更新 loader 路径和 JIT 开发指南文档,使头文件按功能领域归档。
  3. 迁移 expert_pack 工具:将 tools/expert_pack 下所有文件(build.pyformat.pykimi_ggml.pyprepare_deepseek_pack.pyprepare_kimi_pack.pyprepare_kimi_manifest.pyvalidate.py 等)以 rename 方式迁入 python/sglang/srt/model_loader/expert_pack/,并新增包 __init__.py。运行时引用同步更新:expert_pack_runtime.py 中原先基于仓库根目录的 _repo_root() 改为 _expert_pack_tools_dir(),通过 Path(__file__).with_name("expert_pack") 定位工具目录,并将子进程 cwd 改为该目录。
  4. 适配 CLI 与 Git 行为prepare_kimi_manifest.py 中仓库根路径从 parents[2] 改为 parentbuild.pygit_sha() 增加 try/except,在非 git 环境下回退为 "unknown",并补充 SPDX 许可头。
  5. 同步测试与文档:更新 test/registered/expert_pack/test_expert_pack_runtime.py 的导入与断言,新增对包路径的验证;更新 JIT 开发指南和示例中对移动后路径的引用,确保示例可运行。
文件 模块 状态 重要度
python/sglang/srt/model_loader/expert_pack_runtime.py 模型加载 modified 7.77
python/sglang/srt/model_loader/expert_pack/build.py 模型加载 renamed 7.06
python/sglang/kernels/ops/minicpm_sala/__init__.py 内核层 added 5.87
python/sglang/srt/model_loader/expert_pack/prepare_kimi_manifest.py 模型加载 renamed 5.85
python/sglang/kernels/jit/minicpm_sala/__init__.py 内核层 removed 5.66
test/registered/expert_pack/test_expert_pack_runtime.py 测试 modified 4.98

关键符号

_expert_pack_tools_dir ensure_kimi_assets prepare_raw_kimi_server_args prepare_raw_deepseek_server_args git_sha __getattr__

关键源码片段

python/sglang/srt/model_loader/expert_pack_runtime.py data-contract

核心运行时适配:将基于仓库根的路径解析改为包内相对路径,是本次重构的关键数据契约变更。

def _expert_pack_tools_dir() -> Path:
    # 解析工具目录为当前文件同级的 expert_pack 子目录,
    # 这样安装包后也能正确定位准备脚本,而不依赖源代码检出。
    tools_dir = Path(__file__).with_name("expert_pack")
    required_tools = (
        "prepare_deepseek_pack.py",
        "prepare_kimi_manifest.py",
        "prepare_kimi_pack.py",
    )
    # 显式检查必需脚本,缺失时给出清晰错误,避免子进程失败难排查。
    missing = [name for name in required_tools if not (tools_dir / name).is_file()]
    if missing:
        raise RuntimeError(
            "expert_pack preparation tools are missing: " + ", ".join(missing)
        )
    return tools_dir
python/sglang/kernels/ops/minicpm_sala/__init__.py infrastructure

MiniCPM-SALA 包装器新入口,采用延迟导入避免加载性能损耗。

"""MiniCPM-SALA kernels."""from __future__ import annotationsfrom typing import TYPE_CHECKING, Anyif TYPE_CHECKING:
    from sglang.kernels.ops.minicpm_sala.get_block_table import get_block_table
​
​
def __getattr__(name: str) -> Any:
    # 延迟导入:仅在实际访问 get_block_table 时才加载内核符号,
    # 避免模块导入阶段触发不必要的 Triton 编译或 CUDA 初始化。
    if name == "get_block_table":
        from sglang.kernels.ops.minicpm_sala.get_block_table import get_block_table
​
        globals()[name] = get_block_table
        return get_block_table
    raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
​
​
def __dir__() -> list[str]:
    # 让 dir() 反映完整公开 API,弥补 __getattr__ 延迟导入的可见性空缺。
    return sorted(set(globals()) | set(__all__))
​
​
__all__ = ["get_block_table"]

评论区精华

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

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

风险与影响

主要风险来自路径重构:

  • python/sglang/srt/model_loader/expert_pack_runtime.py 原先依赖 _repo_root() 扫描父目录,现改为包内相对路径 _expert_pack_tools_dir(),若安装包被裁剪或工具脚本缺失,会抛出运行时错误(已显式检查必需文件)。
  • build.pygit_sha() 在非 git 目录下返回 "unknown",可能影响 manifest 中 git 可追溯性,但属于预期降级。
  • 所有移动文件均为 rename 操作,逻辑无变化,但外部脚本或用户代码若引用旧路径(如 tools/expert_packkernels.jit.minicpm_sala)将失效。PR 内已做仓库级扫描确认无旧引用残留,但无法覆盖下游使用者。
  • 验证中 GPU 测试未能运行,虽然路径重构不影响逻辑,但无法确认新加载路径在真实 GPU 环境下的行为。

对用户:通过 pip 安装的使用者不再需要仓库级 tools 目录,expert_pack 工具可直接从包内调用,但旧导入路径失效。对系统:JIT 内核与 ops 分离、工具脚本随包分发,包结构更符合规范。对团队:后续新增 JIT 内核或专家打包工具需遵循新目录约定,避免在仓库根目录创建功能特定目录。影响程度中等,主要是开发期路径变化,无运行时行为变化。

路径重构 导入引用变更 Git 元数据回退 缺少 GPU 测试

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论