SGLang 高级 CUDA Graph 技术解析

SGLang 高级 CUDA Graph 技术解析

TL;DR

CUDA Graph 旨在消除内核启动开销,但在真实推理引擎中实现这一收益,需要尽可能多地捕获工作负载,同时不牺牲兼容性、启动时间或内存。在 SGLang 中,我们围绕通用 runner/backend 接口重构了 CUDA Graph 支持,使不同捕获策略可在执行路径间复用。

图1

Breakable CUDA Graph (BCG) 是 SGLang 首创的服务技术,已在预填充阶段成为默认方案。BCG 代码量仅为 torch.compile 分段后端的四分之一,构建图速度快 3.8–5.2 倍,且对复杂功能支持更广。预填充单独测试显示,BCG 比 eager 执行快 1.70 倍,全捕获达 1.93 倍。

背景

现代 LLM 推理引擎中,一次推理步骤包含大量 GPU 操作。从 CPU 反复启动这些操作会带来显著开销,尤其在延迟敏感场景下。CUDA Graph 通过记录 GPU 工作并重放,可大幅降低启动开销。

图2

SGLang 中的 CUDA Graph:Runner/Backend 分离与灵活组合

重构后,Runner 管理捕获与重放所需的执行状态,Backend 决定捕获方式(全图、分段或编译器生成)。Prefill 与 decode 使用独立 runner,投机解码进一步扩展。

图3

Breakable CUDA Graph

BCG 在捕获过程中插入显式 eager 断点,允许不兼容操作在图段间运行,无需编译器即可实现分段。

图4

全 CUDA Graph 用于预填充

通过请求填充,SGLang 实现了对动态预填充工作负载的完整捕获。

图5

CUDA Graph 的内存占用

SGLang 通过跨形状和图段的内存复用,有效控制 CUDA Graph 带来的内存开销。

图6
本文来自 LMSYS 博客,赢政天下(winzheng.com)进行了全文翻译。 点击这里查看原文 如果转载中文,请注明出处,谢谢支持!