执行摘要
- 一句话:EAGLE draft/draft-extend 拷贝批量化为 grouped foreach copy
- 推荐动作:值得精读,特别是对于需要优化 CUDA kernel launch 开销的开发人员。展示了如何通过批量小拷贝来减少 launch overhead,以及如何在 foreach 和 DMA 拷贝之间做性能权衡。方法通用,可推广到其他类似场景。
功能与动机
减少 replay 路径上多个小 device copy 带来的 kernel launch overhead。PR body 提到 'cutting kernel-launch overhead on the replay path'。
实现拆解
- 从
sglang.srt.model_executor.runner 导入 _grouped_foreach_copy_ 辅助函数。
- 在
EagleDraftCudaGraphRunner.replay() 和 EagleDraftExtendCudaGraphRunner.replay() 中,将原本分散的 copy_() 调用改为构造 copy_dsts 和 copy_srcs 列表,包含 seq_lens, out_cache_loc, positions, topk_p, topk_index, req_pool_indices 等字段,可选字段按条件追加。
- 调用
_grouped_foreach_copy_(copy_dsts, copy_srcs),该函数按 dtype 分组一次性完成所有拷贝,减少 kernel launch。
- 将
hidden_states 拷贝排除在 grouped foreach 之外,因为 profiling 显示 _foreach_copy_ 使用 compute kernel(~3x 慢于 DMA 拷贝),而 copy_() 对大块连续张量会使用 cudaMemcpyAsync DMA 引擎,效率更高。
seq_lens_cpu 处理(宿主机同步)保持原位,不参与 grouped copy。
涉及两个 runner 文件,未新增测试文件(现有 CUDA graph 测试覆盖)。
关键文件:
python/sglang/srt/speculative/eagle_draft_cuda_graph_runner.py(模块 推测解码;类别 source;类型 core-logic;符号 EagleDraftCudaGraphRunner.replay): EAGLE draft CUDA graph runner,replay 路径核心变更
python/sglang/srt/speculative/eagle_draft_extend_cuda_graph_runner.py(模块 推测解码;类别 source;类型 core-logic;符号 EagleDraftExtendCudaGraphRunner.replay): EAGLE draft-extend CUDA graph runner,replay 路径同步变更
关键符号:EagleDraftCudaGraphRunner.replay, EagleDraftExtendCudaGraphRunner.replay
评论区精华
本 PR 无 review 讨论,仅有 Qiaolin-Yu 的 Approve。从 commit 历史看,作者曾尝试 uint8 view 融合方案,但发现 stride 问题后回退到 grouped foreach copy,并独立处理 hidden_states。最终保留了性能最优的方案。
风险与影响
- 风险:低风险。改动集中在 replay 路径的拷贝部分,使用已有的
_grouped_foreach_copy_ 辅助函数。hidden_states 保持原有行为,确保不会退化。主要风险在于 _grouped_foreach_copy_ 在某些后端(如 AMD、CPU)上可能未充分测试,但 EAGLE 主要运行在 NVIDIA GPU 上,且现有 CUDA graph 测试应覆盖此路径。
- 影响:影响范围:仅限于 EAGLE 推测解码的 draft 和 draft-extend 的 CUDA graph replay 路径。性能提升约 48μs 每步骤,在高吞吐场景下累积效果明显。不涉及 API 变更、配置变更或跨模块影响。团队:由 kpham-sgl 独立完成,Qiaolin-Yu 审批后合并。
- 风险标记:低风险,仅影响 EAGLE replay 路径, 依赖现有 grouped_foreach_copy
关联脉络
参与讨论