Prhub

#26123 Fix routed-experts device buffer overflow under DP attention

原始 PR 作者 brucechanglongxu 合并时间 2026-05-31 10:11 文件变更 1 提交数 1 评论 4 代码增减 +6 / -4

执行摘要

修复 DP attention 下 routed-experts 缓冲区溢出

在 DP attention 启用且 max_running_requests 大于 chunked_prefill_size * dp_size 的场景下,RoutedExpertsCapturer 的设备缓冲区会发生溢出,因为 _get_local_slice 使用 dp_rank * cuda_graph_batch 进行索引,当缓冲区仅按 max_running_requests 分配时,dp_rank > 0 的索引会超出边界。该问题在关联 Issue #23999 中被发现,作为独立修复从更大的 PR 中拆分出来。

建议尽快合并。这是一个明确正确的 bugfix,改动量小且风险低,解决了一个在 DP attention 路径下可导致静默数据损坏或崩溃的问题。值得关注的是作者将修复从大型 PR #23999 中独立拆分出来的做法,降低了集成风险。

讨论亮点

审核者 alexnails 要求更新 FIXME 注释以反映变更,作者已照做。无其他技术争议。

实现拆解

仅修改 python/sglang/srt/state_capturer/routed_experts.pyRoutedExpertsCapturer.__init__ 方法,将 max_batch_size 计算从 max(chunked_prefill_size * dp_size, max_running_requests) 改为 max(chunked_prefill_size * dp_size, max_running_requests * dp_size)。同时更新注释,说明 dp_size 因子的必要性,并保留 spec decoding 尚未处理的 FIXME。

文件 模块 状态 重要度
python/sglang/srt/state_capturer/routed_experts.py 状态捕获 modified 6.03

关键符号

RoutedExpertsCapturer.__init__

关键源码片段

python/sglang/srt/state_capturer/routed_experts.py core-logic

唯一变更文件,修改了 RoutedExpertsCapturer.__init__ 中 max_batch_size 的计算,修复 DP attention 下缓冲区溢出。

# python/sglang/srt/state_capturer/routed_experts.py
# RoutedExpertsCapturer.__init__ 中关键计算部分
server_args = get_global_server_args()# 按 dp_size 缩放,使缓冲区覆盖完整的 DP 聚合批次。
# _get_local_slice 会以 [attention_dp_rank * cuda_graph_batch, ...) 的方式索引,
# 当 max_running_requests > chunked_prefill_size 时,dp_rank > 0 的切片
# 会超出原来以 max_running_requests 为第一维的缓冲区。
# FIXME: spec decoding 的 num_verify_tokens 仍然未被考虑。
max_batch_size = max(
    server_args.chunked_prefill_size * server_args.dp_size,
    max_running_requests * server_args.dp_size, # 修复项:乘以 dp_size
)

评论区精华

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

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

风险与影响

风险极低:当 dp_size == 1 时表达式退化回原值;当 chunked_prefill_size * dp_size 已占主导时也不受影响。唯一可能的影响是轻微增加显存占用(增加量不超过 dp_size 倍),但这是正确性必须的。仍存在 spec decoding 的 num_verify_tokens 未考虑的问题(已在 FIXME 中记录)。

影响范围小:仅修改一个文件的 2 行核心逻辑。影响用户:任何使用 MoE 模型且启用 DP attention、且 max_running_requests 超过 chunked_prefill_size dp_size 的用户将从隐式数据损坏/崩溃中得到修复。对 dp_size == 1 或 chunked_prefill_size 较大的用户无影响。

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

关联 Issue

#23999 [moe] Capture routing softmax weights alongside routed experts and DP buffer-shape fix
#24403 consolidate routed-experts capturer onto reusable base
#24450 move topk capturers to srt/state_capturer/

完整报告

参与讨论