Prhub

#29420 [AMD][DSV4] Remove per-batch D2H syncs in MTP to avoid bubbles between 2 batches

原始 PR 作者 amd-danli103 合并时间 2026-06-30 13:40 文件变更 1 提交数 5 评论 8 代码增减 +9 / -1

执行摘要

消除 AMD DSV4 MTP 解码批次间 D2H 同步气泡

With MTP (EAGLE) enabled, DSV4 decode on the HIP backend showed periodic 2–xx ms gaps between consecutive batches — scheduling and execution could not overlap. Profiling traced the stalls to two per-batch device→host syncs in the target-verify metadata build, which block the host launch thread and serialize batch N execution with batch N+1 scheduling.

值得精读。本PR展示了典型的GPU性能优化模式——通过传递CPU持久化副本来消除重复D2H同步,是理解HIP后端调度优化的良好范例。对于关注AMD GPU推理性能的工程师,以及编写HIP/CUDA兼容代码的开发者,有参考价值。

讨论亮点
  1. gemini-code-assist[bot] 建议:指出 extend_seq_lens_cpu 应该改为必选参数以避免静默回退;但该部分后来被证明与 PR #29202 重叠,作者决定移除这部分改动。
  2. 1am9trash 指出重叠:评论 _attach_unified_kv_prefill_metarepeat_interleave output_size 修复与 Xinyi 的 PR #29202 目标相同,建议复用。作者确认并缩减PR范围,仅保留 seq_lens_cpu 传递。
  3. 最终一致认为:减少PR范围避免了冲突,且核心优化(消除 seq_lens.tolist() D2H同步)仍保留。

实现拆解

  1. 问题定位:在 deepseek_v4_backend_hip_radix.pyinit_forward_metadata_target_verify 中,每批次执行 seq_lens.tolist() 将GPU张量拷贝到主机,导致同步开销。
  2. 方案选择:根据Review建议,移除了与PR #29202重叠的 _attach_unified_kv_prefill_meta 修改,仅保留核心优化——通过传入CPU侧已经维护的 seq_lens_cpu 镜像来避免 seq_lens.tolist()
  3. 代码修改:在 init_forward_metadata_target_verify 签名中新增可选参数 seq_lens_cpu: Optional[List[int]] = None,当不为 None 时直接使用,否则回退到 .tolist()
  4. 调用点适配:在CUDA图回放入口 init_forward_metadata_out_graphTARGET_VERIFY 分支传递 seq_lens_cpu=seq_lens_cpu.tolist();在eager入口 init_forward_metadata 同样传入 seq_lens_cpu。这两个调用点都已持有CPU镜像,因此无需额外同步。
  5. 性能验证:在MI355X ×8,TP8+DP8,DSV4-Pro + EAGLE负载下测量,解码步骤时间减少8%~13%,精度(GSM8K)无退化。
文件 模块 状态 重要度
python/sglang/srt/layers/attention/deepseek_v4_backend_hip_radix.py HIP 后端 modified 5.91

关键符号

init_forward_metadata_target_verify init_forward_metadata_out_graph init_forward_metadata

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

extend_seq_lens_cpu 应改为必选参数 设计

gemini-code-assist[bot] 建议将 extend_seq_lens_cpu 改为必选参数,避免静默回退到 D2H 同步,使优化失效。

结论:该部分后来被移除(与 PR #29202 重叠),因此建议未采纳。但思路正确后,类似模式在保留的 seq_lens_cpu 参数中使用。 · 已解决

与 PR #29202 的重复范围确认 other

1am9trash 指出 _attach_unified_kv_prefill_meta 中 repeat_interleave output_size 修复与 Xinyi 的 PR #29202 目标相同。

结论:作者 amd-danli103 同意并缩小 PR 范围,仅保留 seq_lens_cpu 传递部分,避免冲突。 · 已解决

风险与影响

风险极低。新增 seq_lens_cpu 参数为可选,调用方若未提供会自动回退到 seq_lens.tolist(),行为与之前完全相同。所有修改仅在AMD HIP路径生效,不影响CUDA后端。若CPU镜像与GPU张量不一致(理论上不会,因为在进入前已经同步),可能导致错误,但已存在的CPU镜像是与GPU值一致的副本。

对使用AMD GPU运行DeepSeek V4 with MTP(EAGLE)的用户有显著性能提升(解码步骤时间-8%~13%)。对CUDA后端无影响,对不使用MTP的场景无影响。代码改动量小(9行),维护成本低。

仅 AMD 路径 缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论