Prhub

#30273 [XPU] Enable breakable prefill CUDA graph on XPU

原始 PR 作者 rahulvijayaraghavan 合并时间 2026-07-21 09:09 文件变更 4 提交数 5 评论 14 代码增减 +399 / -48

执行摘要

XPU 启用可分段 prefill CUDA 图

为 Intel XPU 支持分段 prefill CUDA 图捕获与回放,以减少 kernel 启动延迟、提升 prefill 推理性能。此前该功能仅支持 NVIDIA CUDA 和 AMD ROCm/HIP。

值得精读。该 PR 展示了如何通过 get_device_module() 实现设备无关的图形捕获原语,设计模式清晰。对于关注多硬件适配或 Intel XPU 推理的开发者有直接参考价值。

讨论亮点

主要讨论集中在测试分离和文档调整。CaoE 建议将 XPU 测试从共享套件移至专用 XPU 测试套件,作者采纳并创建 test/registered/xpu/test_breakable_cuda_graph.py。此外,CaoE 询问 breakable graph 是否仅针对 prefill(不含 decode),得到确认。文档结构调整的建议也被接受并执行。

实现拆解

  1. 设备无关化核心原语:在 breakable_cuda_graph.py 中,导入 get_device_moduleis_xpu,将类型 torch.cuda.Stream 替换为 torch.Stream,调用 get_device_module().current_stream() 替代 torch.cuda.current_stream()_is_stream_capturing 增加 XPU 分支(is_hip() or _is_xpu),使用 get_device_module().is_current_stream_capturing();流标识从 cuda_stream 改为 stream_idwait_stream hook 挂接到 get_device_module().Stream.wait_stream

  2. 解除 XPU prefill 后端限制:在 server_args.py_handle_xpu_backends 中,移除强制将非 TC_PIECEWISE prefill 后端设为 DISABLED 的代码,使得 BREAKABLE 后端可在 XPU 上选择。

  3. 新增 XPU 测试套件:创建 test/registered/xpu/test_breakable_cuda_graph.py,包含单元测试(TestBreakableCUDAGraphBasic)和集成测试(TestXPUBreakableGraph),通过 get_device_module()get_device() 实现设备无关,并注册到 XPU CI。

  4. 更新文档:在 xpu.mdx 中添加 breakable prefill 后端的用法示例和支持表格。

文件 模块 状态 重要度
python/sglang/srt/model_executor/runner_backend_utils/breakable_cuda_graph/breakable_cuda_graph.py 断点捕获 modified 8.45
test/registered/xpu/test_breakable_cuda_graph.py XPU 测试 added 7.76
python/sglang/srt/server_args.py 配置层 modified 5.51
docs_new/docs/hardware-platforms/xpu.mdx 文档 modified 3.43

关键符号

get_current_stream _is_stream_capturing _hooked_wait_stream _handle_xpu_backends TestBreakableCUDAGraphBasic

关键源码片段

python/sglang/srt/model_executor/runner_backend_utils/breakable_cuda_graph/breakable_cuda_graph.py core-logic

核心原语文件,通过设备模块抽象支持 XPU

# _is_stream_capturing: 对 HIP 和 XPU 使用 torch 便携 API,对 NVIDIA 保持 cuda-python。
def _is_stream_capturing(stream: torch.Stream) -> bool:
    if is_hip() or _is_xpu:
        with get_device_module().stream(stream):
            return get_device_module().is_current_stream_capturing()
    return (
        _capture_status(stream.cuda_stream)
        == rt.cudaStreamCaptureStatus.cudaStreamCaptureStatusActive
    )# _hooked_wait_stream: 使用 stream_id 替代 cuda_stream 进行比较,兼容 XPU。
def _hooked_wait_stream(self: torch.Stream, other: torch.Stream):
    assert _original_wait_stream is not None
    forked = _forked_streams_var.get()
    if forked is None:
        _original_wait_stream(self, other)
        return
    capturing = _current_stream_var.get()
    if capturing is None:
        _original_wait_stream(self, other)
        return
    cap_id = capturing.stream_id
    is_self_cap = self is capturing or self.stream_id == cap_id
    is_other_cap = other is capturing or other.stream_id == cap_id
    if is_self_cap and not is_other_cap:
        if not _is_stream_capturing(other):
            return
        _original_wait_stream(self, other)
        forked.discard(other)
    elif is_other_cap and not is_self_cap:
        _original_wait_stream(self, other)
        forked.add(self)
    else:
        _original_wait_stream(self, other)

评论区精华

文档结构调整建议 documentation

CaoE 建议将 Breakable Prefill Graph 小节合并到 Enable Prefill Graph 主节下,并简化描述。

结论:作者采纳,将内容移至 Enable Prefill Graph 内作为子节,简化描述。 · 已解决

测试分离与范围确认 测试

CaoE 指出应确认 XPU graph 在公开环境支持的测试组合,建议选取可工作的部分放入专用 XPU 测试套件。

结论:作者创建 `test/registered/xpu/test_breakable_cuda_graph.py` 作为专用套件,回退共享测试至原始状态。 · 已解决

功能范围确认(prefill vs decode) question

CaoE 询问 breakable graph 是否仅适用于 prefill(不包含 decode)。

结论:确认 breakable 只针对 prefill 阶段,文档和改动均指向 prefill。 · 已解决

风险与影响

正确性风险:XPU 上 breakable graph 的捕获/回放行为可能与 CUDA 存在细微差异,尤其边角情况。当前测试覆盖了基本流程,但复杂模型场景需进一步验证。

性能风险:设备无关抽象在热点路径引入 get_device_module() 调用,通常开销可忽略。

兼容性风险_hooked_wait_stream 的流标识从 cuda_stream 改为 stream_id,仓库内无其他依赖,但可能影响未来钩子。

回归风险server_args.py 解除限制后,用户误设不支持的预填后端可能通过其他校验捕获。

用户:XPU 用户可通过 --cuda-graph-backend-prefill breakable 启用分段 prefill 图,预期降低预填阶段延迟。

系统:无 breaking change;现有 CUDA/HIP 路径不受影响,共用同一原语。

团队:建立了设备模块抽象模式,为未来更多硬件后端支持提供参考。

核心原语设备无关化 XPU 新增后端 测试覆盖待完善

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论