Prhub

#29642 [AMD] Copy decode result on forward_stream instead of copy_stream

原始 PR 作者 1am9trash 合并时间 2026-06-30 14:53 文件变更 1 提交数 3 评论 0 代码增减 +15 / -5

执行摘要

AMD 平台跳过 D2H copy_stream 同步,decode 提升 12-17%

PR #29075 为通用调度器优化,将 decode 结果 D2H 拷贝移到独立 copy_stream 以隐藏延迟。但在 AMD ROCm 平台上,每个 decode step 都需要跨流同步(copy_stream.wait_stream(forward_stream) + event gating),固定同步开销超过了 tiny copy 能重叠的收益,导致所有模型 decode 性能倒退(DeepSeek-V4-Pro 和 Qwen3.5-397B-A17B-MXFP4 约 10-20%)。本 PR 旨在消除该回归。

建议精读。本 PR 展示了一个值得学习的权衡案例:通用优化(copy_stream 重叠)在特定硬件上可能因同步开销导致反效果。对于类似情况,建议引入平台感知的调度条件分支。此外,该 PR 的验证手段(GSM8k + 性能 benchmark)可作为小范围性能修复的参考模板。

讨论亮点

本 PR 无人工 review 评论(review_comments_count=0),仅有 bot 自动评论和两位 reviewer(kkHuang-amd、HaiShaw)的 approve。讨论集中在 PR body 中的性能数据:DeepSeek-V4-Pro 吞吐+17.6%,ITL -16.2%;Qwen3.5-397B-A17B-MXFP4 吞吐+12.7%,ITL -12.3%。没有安全或设计争议。

实现拆解

  1. 引入 HIP 平台检测:在 scheduler.py 的 import 中添加 is_hip 函数引用,并在模块顶部缓存 _is_hip = is_hip() 常量,避免运行时重复调用。
  2. 条件分支逻辑:在 run_batch 方法的 D2H 拷贝段,以 _is_hip 为分支条件:
    • HIP 路径:直接在主 forward_stream 上调用 batch_result.copy_to_cpu(),跳过 copy_stream.wait_stream() 和单独的 stream context,从而消除跨步同步的开销。
    • CUDA 路径:保持原有逻辑,使用独立 copy_streamforward_stream 同步以重叠拷贝与后续 forward。
  3. 改动范围:仅修改 python/sglang/srt/managers/scheduler.py 文件,新增 15 行,删除 5 行,无测试或配置文件变更。
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py 调度器 modified 6.64

关键符号

is_hip _is_hip run_batch

关键源码片段

python/sglang/srt/managers/scheduler.py core-logic

唯一修改的文件,核心调度逻辑中 D2H 拷贝路径的平台条件分支。新增 `is_hip` 检测并缓存 `_is_hip` 标志,在 `run_batch` 中绕过 copy_stream 同步直接在 forward_stream 上执行拷贝。

# python/sglang/srt/managers/scheduler.py
# 在文件顶部的 import 块中添加 is_hip 导入
from sglang.srt.utils import (
    ...
    is_hip, # 新增:导入 HIP 平台检测函数
    ...
)# 在模块作用域缓存平台标志,避免重复调用 is_hip()
_is_hip = is_hip()# 在 run_batch 方法中,D2H 拷贝部分改为条件分支
# base 版本(仅 CUDA):使用独立 copy_stream 与 forward_stream 同步
# head 版本:
if _is_hip:
    # 对 AMD ROCm 平台,跨流同步的固定开销大于 tiny copy 本身
    # 因此直接在 forward_stream 上阻塞执行拷贝,消除 wait_stream 开销
    batch_result.copy_to_cpu(
        return_logprob=batch.return_logprob,
        return_hidden_states=batch.return_hidden_states,
    )
else:
    # CUDA 平台保持原有优化:在独立 copy_stream 上执行 D2H 拷贝
    # 与下一轮 forward 重叠,通过 copy_done event 保证可见性
    self.copy_stream.wait_stream(self.forward_stream)
    with self.copy_stream_ctx:
        batch_result.copy_to_cpu(
            return_logprob=batch.return_logprob,
            return_hidden_states=batch.return_hidden_states,
        )

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

  1. 回归风险低:仅针对 HIP 平台修改,CUDA 路径完全不变,不影响现有 NVIDIA 用户。
  2. 精度风险:PR body 提供了 GSM8k 精度验证(DSV4-Pro 0.951,Qwen3.5 0.898),与预期一致。但仅在一个数据集上测试,覆盖可能不够全面。
  3. 维护成本:引入了平台相关分支,未来若 HIP 上也能有效利用 copy_stream 重叠,需要再次修改。但目前 ROCm 的同步开销显著高于 CUDA,该分支是合理妥协。
  4. 缺少测试:没有为 HIP 路径添加回归测试或性能测试。
  1. 影响用户:AMD ROCm 用户 decode 性能显著提升(12-17%),接近回归前的水平。NVIDIA CUDA 用户无影响。
  2. 影响系统:仅影响单文件 scheduler.py,改动极小。
  3. 影响团队:为 AMD 平台后续调度优化提供了明确方向——在 ROCm 同步开销高的场景下,简化的同步方案可能优于复杂的重叠策略。
  4. 影响程度:中。虽然改动小,但修复了关键的性能回归,对 AMD 用户价值高。
缺少测试覆盖 平台特定分支

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论