sgl-kernel 项目的演进:不同时间点的角色与去向

总结

sgl-kernel 经历了 独立顶层包 → 并入 sglang.kernels.aot → 成为统一 kernel 命名空间中的一个后端 的演进。它的源码位置、包名、与主 sglang 的耦合方式都发生了变化,但核心使命------为 SGLang 提供 AOT 编译的自定义 CUDA/HIP 算子------始终未变。


1. 阶段一:独立顶层包(约 2024 年中 ~ 2025 年中)

1.1 创建与定位

  • 首个提交 :419a57e771 minor: add sgl-kernel dir (#2261)
  • 位置 :仓库顶层目录 sgl-kernel/
  • 角色 :一个可独立发布到 PyPI 的 C++/CUDA 扩展包,提供高性能自定义算子。
  • 安装产物 :sgl_kernel Python 包(注意下划线),与主包 sglang 解耦。

1.2 目录结构

复制代码
sgl-kernel/
  setup.py                 # setuptools 构建入口
  CMakeLists.txt           # CUDA 主构建
  src/sgl-kernel/
    __init__.py
    ops/__init__.py        # Python 侧算子封装
    csrc/                  # CUDA/HIP/C++ 源码
      moe_align_kernel.cu
      custom_all_reduce.cu / .hip
      ...
    include/               # 头文件
  benchmark/               # 性能测试脚本
  build.sh                 # 本地构建脚本
  Makefile / Dockerfile

1.3 技术栈变化

时间 关键提交 变化
2024-12 b02da24a5b Refactor sgl-kernel build (#2642) 重构 setup.py,简化构建;统一 sgl_kernel_ops.cu 入口
2025-01 9286740eff Use TORCH_LIBRARY instead of PYBIND11_MODULE (#3130) 从 pybind11 注册改为 TORCH_LIBRARY/TORCH_LIBRARY_IMPL,与 PyTorch 自定义算子生态更兼容
2025-01 9cf4077294 Enable custom AR for AMD GPUs (#3406) 为 AMD GPU 引入 custom_all_reduce.hip 等 HIP 实现

1.4 与主 sglang 的关系

  • 主仓库 python/ 目录下的 sglang 通过 pip install sgl-kernel 依赖它。

  • 算子调用路径大致为:

    python 复制代码
    from sgl_kernel import moe_align_block_size
  • 这是松耦合 阶段:kernel 仓库有自己的 CI、版本号(如 0.0.2.post8、0.0.3)、发布节奏。


2. 阶段二:RFC #29630 大重构(2025 年 7 月)

2.1 背景

  • 随着算子数量爆炸,SGLang 里同时存在:
    • sgl-kernel(AOT C++/CUDA 扩展)
    • sglang.jit_kernel(JIT 编译的 Triton/CuTe DSL kernel)
    • FlashInfer、AITER、DeepGEMM 等外部 kernel 库
    • 各种 srt/layers/... 里直接调用的算子
  • 调用方式不统一、测试分散、后端选择困难。

2.2 关键提交与动作

A. 退役 sglang.jit_kernel,统一为 sglang.kernels
  • 提交 :99f636a86f [Kernel] RFC #29630 finale: retire sglang.jit_kernel into sglang.kernels (#32072)
  • 动作 :
    • 将 python/sglang/jit_kernel/ 移动到 python/sglang/kernels/jit/。

    • sglang.kernels 成为统一的公开导入面 :

      python 复制代码
      from sglang.kernels.ops.activation import silu_and_mul
      from sglang.kernels.ops.gemm import fp8_scaled_mm
    • 引入 KernelSpec、KernelBackend、KernelRegistry、select_kernel() 等机制。

B. 把顶层 sgl-kernel/ 并入 python/sglang/kernels/aot/
  • 提交 :c32c4ef79c [Kernel] Move sgl-kernel under sglang.kernels.aot (#32648)
  • 动作 :
    • 将整个 sgl-kernel/ 目录重命名/移动到 python/sglang/kernels/aot/。

    • 源码路径从:

      复制代码
      sgl-kernel/src/sgl-kernel/csrc/...

      变为:

      复制代码
      python/sglang/kernels/aot/csrc/...
    • 包名从 sgl-kernel / sgl_kernel 改为 sglang-kernel / sgl_kernel(Python 扩展模块名仍常叫 sgl_kernel)。

    • CI、Dockerfile、文档全部更新路径引用。

2.3 新布局(RFC #29630 后)

复制代码
python/sglang/kernels/
  README.md              # 统一 kernel 命名空间说明
  spec.py                # KernelSpec / KernelBackend
  registry.py            # 全局算子注册表
  selector.py            # select_kernel / get_kernel
  fused_op.py            # BaseFusedOp(多后端统一 forward)
  ops/                   # 按算子组组织的公开 facade
    activation/
    attention/
    communication/
    gemm/
    moe/
    ...
  jit/                   # 原 jit_kernel 的共享构建/运行时基础设施
    csrc/                # JIT header-only CUDA/CuTe DSL 源码
    include/
    utils/
    __main__.py          # KERNEL_PATH 查询入口
  aot/                   # 原 sgl-kernel 的全部内容
    CMakeLists.txt
    csrc/                # AOT 编译的 CUDA/HIP 源码
    benchmark/
    build.sh
  kda_kernels/           # Kernel Design Agents 生成的后端
  cake_kernels/          # FlashInfer Cake 生成的后端

2.4 角色的根本转变

维度 阶段一 阶段二
源码位置 顶层 sgl-kernel/ python/sglang/kernels/aot/
包名 sgl-kernel(PyPI) sglang-kernel(PyPI)
导入方式 from sgl_kernel import ... from sglang.kernels.ops import ...
与主包关系 外部依赖 主源码树内的一部分,但仍是独立 wheel
统一调度 无 KernelRegistry + BaseFusedOp
后端种类 单一 AOT AOT / JIT / KDA / CAKE / 外部库

3. 阶段三:插件化 backend 与 plugin_kernels/(2025 年 10 月)

3.1 背景

  • 单一模型/硬件的"超大 kernel"(megakernel / monokernel)需要:
    • 独立的仓库开发(如 sgl-nvidia-mega、sgl-amd-mono)
    • 在 SGLang 主仓库中只保留契约/规格说明,不保留具体实现

3.2 关键提交

  • 提交 :b86d294a98 [Refactor] kernels: Add the plugin kernel backend and split plugin contracts from their srt integration (#45389)
  • 动作 :
    • 在 python/sglang/kernels/ 下新增 plugin_kernels/。

    • 把原本放在 srt/megakernels/ 和 srt/monokernels/ 的契约代码 迁移到:

      复制代码
      python/sglang/kernels/plugin_kernels/nvidia/spec.py
      python/sglang/kernels/plugin_kernels/amd/spec.py
    • 把运行时绑定/集成 代码迁移到:

      复制代码
      python/sglang/srt/kernel_plugins/nvidia/binding.py
      python/sglang/srt/kernel_plugins/amd/binding.py
    • 新增 KernelBackend.PLUGIN。

3.3 带来的新角色

  • sglang.kernels 不再只是"SGLang 自己写的算子集合",而是 SGLang 生态中所有 kernel 后端的注册中心 :
    • 自己维护的 AOT (aot/)
    • JIT 编译 (jit/)
    • Agent 生成 (kda_kernels/, cake_kernels/)
    • 外部插件 (plugin_kernels/)

4. 阶段四:当前状态(2026 年 10 月)

4.1 当前目录结构

复制代码
sglang/
  python/sglang/kernels/
    README.md
    spec.py / registry.py / selector.py / fused_op.py
    ops/                   # 公开算子 facade(20+ 算子组)
    jit/                   # JIT 共享基础设施
    aot/                   # 原 sgl-kernel,AOT wheel 源码
    kda_kernels/           # KDA agent 生成 kernel
    cake_kernels/          # Cake/FlashInfer 生成 kernel
    plugin_kernels/        # 外部插件契约
  python/pyproject.toml    # 依赖 "sglang-kernel==0.4.10"
  3rdparty/amd/wheel/sgl-kernel/   # AMD ROCm 专用构建文件

4.2 当前包依赖

主 sglang wheel 在 python/pyproject.toml 中声明:

toml 复制代码
dependencies = [
  ...
  "sglang-kernel==0.4.10",
  ...
]
  • sglang-kernel 就是原 sgl-kernel 改名后的 AOT wheel。
  • AMD 用户安装的是 amd-sglang,它额外依赖 ROCm 版本的 sglang-kernel wheel(带 +rocm720 / +rocm1000 本地版本标签)。

4.3 不同去向的清晰划分

历史产物 当前去向 说明
顶层 sgl-kernel/ → python/sglang/kernels/aot/ AOT 源码树
sgl-kernel PyPI 包 → sglang-kernel PyPI 包 包名升级,内容延续
sglang.jit_kernel → sglang.kernels.jit JIT 基础设施
srt/megakernels/ → sglang.kernels.plugin_kernels/nvidia + srt/kernel_plugins/nvidia 插件契约与运行时分离
srt/monokernels/ → sglang.kernels.plugin_kernels/amd + srt/kernel_plugins/amd 同上
AMD 专用 sgl-kernel 构建 → 3rdparty/amd/wheel/sgl-kernel/ ROCm wheel 构建脚本与 CMake

5. 关键决策总结

决策 原因
把 sgl-kernel 从顶层移到 python/sglang/kernels/aot 与主 Python 包同树开发,减少版本错位;统一 sglang.kernels 命名空间
改名 sgl-kernel → sglang-kernel 明确这是 SGLang 官方 AOT kernel wheel,避免与历史 sgl-kernel 混淆
退役 sglang.jit_kernel 消除 jit_kernel 与 sgl-kernel 两个并行命名空间,统一调度与测试
引入 KernelSpec / KernelBackend 让同一算子可以有 AOT/JIT/KDA/CAKE/PLUGIN 多个实现,支持 A/B 测试与自动 fallback
拆分 plugin_kernels 与 kernel_plugins 保持 kernels/ 不依赖 srt/,实现 kernel 契约与运行时集成的解耦

6. 对开发/维护的意义

  1. 新增 AOT 算子 :仍在 python/sglang/kernels/aot/csrc/ 下写 .cu/.cc,在 CMakeLists.txt 注册,并通过 sglang.kernels.ops.<group> 暴露。
  2. 新增 JIT 算子 :在 python/sglang/kernels/jit/csrc/ 放 header/cu 模板,Python 侧放在 ops/<group>/。
  3. 新增模型专用大 kernel :考虑走 plugin_kernels/<hardware>/<model> 契约 + 独立仓库实现。
  4. 历史包袱 :旧文档、CI、Dockerfile 中若仍出现 sgl-kernel 路径,通常应理解为 python/sglang/kernels/aot/。

7. 参考提交

  • 419a57e771 --- 创建 sgl-kernel 顶层目录
  • 9286740eff --- TORCH_LIBRARY 替代 PYBIND11_MODULE
  • 99f636a86f --- RFC #29630 finale:退役 sglang.jit_kernel
  • c32c4ef79c --- 把 sgl-kernel 移动到 python/sglang/kernels/aot
  • b86d294a98 --- 新增 plugin kernel backend,拆分 megakernels/monokernels
  • 1aa56cca37 --- AMD ROCm wheel 支持
  • 当前目录说明:python/sglang/kernels/README.md
  • AMD 构建说明:3rdparty/amd/wheel/README.md
相关推荐
zhangfeng11333 小时前
6篇RAG核心论文的工程启示:Vector + Graph + Agent路由混合架构实战
人工智能·架构·llm·agent
沛东的认知和实践13 小时前
当 RAG 开始“要求找全”:一次 Agentic RAG 边界探索与 LLM Wiki 转向
llm·agent
Eloudy14 小时前
《Attention Is All You Need》的 Encoder–Decoder Transformer 一次完整训练
llm·transformer
lucas_AI15 小时前
自蒸馏也讲究因材施教:让每个 token 自己挑老师,数学推理白捡 5.9 分
llm
ZhengEnCi1 天前
同样的模型,为什么本地和云 API 差别那么大:量化精度、聊天模板与采样参数的三大元凶
人工智能·算法·llm
goehou1 天前
ReAct 循环跑偏的三种样子,以及怎么在工程上兜住
llm·agent·react·工具调用·工程实践
ZhengEnCi1 天前
Agent 如何进行工具调用:从一次 Function Calling 到生产级工具编排的完整链路
llm·agent·ai编程
王博要战斗1 天前
TensorBoard 和 W&B(Wandb) 到底该怎么接进 LLMOps 平台?
llm
用户8351414049491 天前
本地跑小模型做语音唤醒:手上那块子能带动吗
llm·嵌入式