总结
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_kernelPython 包(注意下划线),与主包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依赖它。 -
算子调用路径大致为:
pythonfrom 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成为统一的公开导入面 :pythonfrom 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/)
- 自己维护的 AOT (
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-kernelwheel(带+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. 对开发/维护的意义
- 新增 AOT 算子 :仍在
python/sglang/kernels/aot/csrc/下写.cu/.cc,在CMakeLists.txt注册,并通过sglang.kernels.ops.<group>暴露。 - 新增 JIT 算子 :在
python/sglang/kernels/jit/csrc/放 header/cu 模板,Python 侧放在ops/<group>/。 - 新增模型专用大 kernel :考虑走
plugin_kernels/<hardware>/<model>契约 + 独立仓库实现。 - 历史包袱 :旧文档、CI、Dockerfile 中若仍出现
sgl-kernel路径,通常应理解为python/sglang/kernels/aot/。
7. 参考提交
419a57e771--- 创建sgl-kernel顶层目录9286740eff---TORCH_LIBRARY替代PYBIND11_MODULE99f636a86f--- RFC #29630 finale:退役sglang.jit_kernelc32c4ef79c--- 把sgl-kernel移动到python/sglang/kernels/aotb86d294a98--- 新增 plugin kernel backend,拆分 megakernels/monokernels1aa56cca37--- AMD ROCm wheel 支持- 当前目录说明:
python/sglang/kernels/README.md - AMD 构建说明:
3rdparty/amd/wheel/README.md