Prhub

#21940 [AMD]fix: use CUDA event for targeted draft-to-verify sync in EAGLE overlap

原始 PR 作者 AMD-yanfeiwang 合并时间 2026-04-27 12:58 文件变更 2 提交数 2 评论 9 代码增减 +21 / -0

执行摘要

修复 EAGLE overlap 中 draft 与 verify 的 GPU 同步问题

Issue #21942 报告在 AMD GPU 上使用 spec v2 + DP 配置时出现 memory access fault。根本原因是 EAGLE overlap 模式下 draft 阶段在 plan_stream 上执行的 GPU 工作与后续 verify 阶段在 plan_stream 上执行的准备工作之间缺少同步,导致数据竞态。

值得合并。该修复解决了 AMD 平台 spec v2 数据竞态 bug,且方案在 NVIDIA 平台也验证有效。设计上使用 CUDA event 替代 wait_stream 实现更精确同步,也是正确方向。建议后续考虑 gemini-code-assist 的抽取建议提升代码质量。

讨论亮点

Review 中 gemini-code-assist[bot] 建议将重复的 torch.get_device_module(self.device).Event() 调用抽取为辅助方法以提高可维护性。HaiShaw 询问性能数据,提交者提供了对比表,显示 Specv2(Sync) 方案与原版非 spec 基线性能接近,Specv2(async) 方案因复杂度高且提升微小被考虑放弃。未解决疑虑:hanming-lu 评论称该改动等同于硬编码 SGLANG_ENABLE_OVERLAP_PLAN_STREAM=0,应回退。

实现拆解

  1. eagle_worker_v2.pyforward_batch_generation 方法中,draft 调用完成后、verify 调用之前,新增 CUDA event 记录:若 self.plan_stream 存在,则创建 CUDA event 并记录到当前流(主流)。

  2. eagle_worker_v2.pyverify 方法中,plan_stream_ctx 开始处增加 wait_event:检查 self.plan_stream_draft_done_event 属性存在时,调用 self.plan_stream.wait_event(self._draft_done_event),确保 plan_stream 等待 draft 的 GPU 工作完成后再开始元数据准备。

  3. multi_layer_eagle_worker_v2.py 的对应方法中应用完全相同的两处变更。

  4. 该方案比原有的 wait_stream(main_stream) 更精确,只等待 draft GPU 工作而非所有主流操作,减少不必要的同步开销。

文件 模块 状态 重要度
python/sglang/srt/speculative/eagle_worker_v2.py 推测解码 modified 5.99
python/sglang/srt/speculative/multi_layer_eagle_worker_v2.py 推测解码 modified 5.44

关键符号

forward_batch_generation verify

关键源码片段

python/sglang/srt/speculative/eagle_worker_v2.py core-logic

核心变更文件,添加了 event 记录和 wait_event 同步逻辑,修复数据竞态

# eagle_worker_v2.py forward_batch_generation 中新增:
# 在 draft() GPU 工作分发后记录一个 CUDA event
if self.plan_stream:
    self._draft_done_event = torch.get_device_module(self.device).Event()
    self._draft_done_event.record()# verify 方法中 plan_stream_ctx 开始处新增:
with self.plan_stream_ctx:
    # 使用 wait_event 比 wait_stream 更精确,只等待 draft GPU 工作
    if self.plan_stream and hasattr(self, "_draft_done_event"):
        self.plan_stream.wait_event(self._draft_done_event)

评论区精华

重复代码抽取建议 style

gemini-code-assist[bot] 建议将重复的 torch.get_device_module(self.device).Event() 调用抽取为辅助方法

结论:未采纳,但评论者未坚持,不影响合并 · unresolved

性能数据确认 other

HaiShaw 询问性能数据,提交者提供了对比表,显示 Specv2(Sync) 方案性能接近原始基线

结论:提交者提供了性能对比数据,HaiShaw 随后 approve · 已解决

是否等同于硬编码 SGLANG_ENABLE_OVERLAP_PLAN_STREAM=0 设计

hanming-lu 评论称该改动等同于硬编码 SGLANG_ENABLE_OVERLAP_PLAN_STREAM=0,应回退

结论:未进一步讨论,PR 已合并 · unresolved

风险与影响

风险较低。新增代码在 if self.plan_stream 条件内,不会影响非 overlap 路径。但若存在多个 draft 阶段快速连续执行场景,_draft_done_event 可能被覆盖,需确保事件记录与等待成对。测试覆盖方面,缺少专门的单元测试,依赖 CI 集成测试验证。

直接影响使用 speculative decoding v2 且开启 overlap 的部署,特别是 AMD GPU 平台。修复了可能导致服务器崩溃的 memory access fault,提升稳定性和可靠性。对 NVIDIA GPU 平台同样有效(已确认 B200 可复现)。无性能回退风险(提交者提供数据表明性能与原版基线接近)。

核心路径变更 缺少测试覆盖

关联 Issue

#21942 [Bug] [AMD] spec v2 + DP Memory access fault

完整报告

参与讨论