Prhub

#28086 Abort during chunked prefill + PD peer-liveness abort

原始 PR 作者 cctry 合并时间 2026-06-18 14:13 文件变更 8 提交数 5 评论 9 代码增减 +763 / -3

执行摘要

实现分块预填充中止与 PD 对端存活检测

PR body指出:'Two abort improvements for the PD / chunked-prefill path.' 在chunked prefill场景下,原有中止请求只在分块之间生效,分块处理中无法立即中止。PD模式下对端失效后没有自动中止机制,可能导致请求挂起。该PR通过记录待中止的chunked request并在调度器安全点清理,以及添加对端存活轮询,解决了这些问题。

值得精读,特别是 process_pending_chunked_abort 的安全中止模式(延迟处理+多个调度点)和 resolve_waiting_queue_bootstrap 的对端检测集成方式。测试代码也提供了良好的端到端验证范例。建议熟悉 scheduler 和 PD 模块的团队成员优先 Review。

讨论亮点
  • 代码风格:merrymercy 在 review 中指出“try to remove all getattr and hasattr”,强调应避免 getattr,保持类型安全。作者 cctry 随即移除了相关 getattr 调用。
  • 正确性补充:ShangmingCai 在 scheduler.pyprocess_pending_chunked_abort 中建议添加 req.time_stats.trace_ctx.abort 调用以保持与其它中止路径一致。作者采纳并添加。
  • CI测试注册:ShangmingCai 在 approve 评论中建议“Should we pick and register one of the tests in test/registered/disaggregation/test_disaggregation_basic.py?”。作者随后将 TestDisaggChunkedPrefillAbort 类加入该注册测试文件,并调整了 CI 预估时间。

实现拆解

  1. 安全中止标记与延迟清理:在 scheduler.pyinit_chunked_prefill 中新增 _pending_chunked_abort_req 属性;abort_request 仅将目标请求赋值给此标记,避免在迭代中途直接销毁。新增 process_pending_chunked_abort 方法,在每个调度步 get_next_batch_to_run 开头调用。
  2. 中止逻辑process_pending_chunked_abort 判断待中止请求是否为当前分块(chunked_req)。若是,则调用 prepare_abort 标记中止、释放KV缓存(含disagg sender/metadata buffer)、清空 chunked_req 并通知tokenizer;若不是,则在请求完结后清除标记。在disagg prefill模式下还处理 maybe_release_metadata_bufferrelease_kv_cache
  3. 对端存活检测:在 disaggregation/prefill.py 中新增 resolve_waiting_queue_bootstrap,在 get_next_disagg_prefill_batch_to_run 中调用。该方法遍历等待队列中未中止的请求,通过 poll_and_all_reduce_attn_cp_tp_group 检测 disagg_kv_sender 状态。若收到 KVPoll.Failed,则调用 handle_bootstrap_failure 中止请求并从等待队列移除;若 KVPoll.WaitingForInput 且请求已乐观完成bootstrap,则调用 finalize_bootstrap
  4. 入口集成:修改 get_next_batch_to_run(统一模式)和 get_next_disagg_prefill_batch_to_run(PD模式)的调度步骤,分别插入 process_pending_chunked_abortresolve_waiting_queue_bootstrap
  5. 配套调整:在 batch_result_processor.py 中微调结果处理以跳过已中止的chunk;更新单元测试 mock(test_scheduler_chunked_req_gate.py)以初始化 _pending_chunked_abort_req
文件 模块 状态 重要度
python/sglang/srt/managers/scheduler.py 调度器 modified 7.58
python/sglang/srt/disaggregation/prefill.py 预填充管理 modified 7.12
python/sglang/test/manual/disaggregation/test_disaggregation_peer_liveness_abort.py 对端存活测试 added 8.14
python/sglang/test/manual/disaggregation/test_chunked_prefill_abort.py 分块中止测试 added 7.86
test/registered/disaggregation/test_disaggregation_basic.py PT 测试套件 modified 7.39

关键符号

process_pending_chunked_abort resolve_waiting_queue_bootstrap

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

评论区精华

使用 getattr 的代码风格 style

merrymercy 评论:'try to remove all getattr and hasattr' 以及 'why do we need getattr? It should always have the field'。作者 cctry 回应已更新。

结论:作者移除了 getattr 调用,改用直接属性访问。 · 已解决

缺少 trace abort 调用 正确性

ShangmingCai 评论:'Should we set req.time_stats.trace_ctx.abort here?'。作者 cctry 回应 added。

结论:在 process_pending_chunked_abort 中添加了 trace_ctx.abort 调用,与其他中止路径一致。 · 已解决

将测试注册到 CI 测试

ShangmingCai 在 approve 时建议:'Should we pick and register one of the tests in test/registered/disaggregation/test_disaggregation_basic.py?'

结论:作者将 TestDisaggChunkedPrefillAbort 类添加到 test_disaggregation_basic.py 并注册 CI。 · 已解决

风险与影响

  • 核心路径变更scheduler.py 是调度器核心,新增的 process_pending_chunked_abort 在每个调度步调用,可能引入回归,需关注请求泄漏或死锁。
  • PD模式网络依赖resolve_waiting_queue_bootstrap 中引入的 poll_and_all_reduce_attn_cp_tp_group 网络轮询可能增加PD模式下请求入队延迟,若网络抖动可能误判对端失败。
  • KV缓存释放安全性:中止路径中的 release_kv_cachemaybe_release_metadata_buffer 必须与主路径一致,避免双重释放或泄漏。
  • 测试时长:新增的CI测试(预估时间从560秒提升到700秒)可能增加CI流水线耗时。
  • 用户影响:chunked prefill场景下调用 abort_request 可立即停止分块处理,PD模式下对端失效的请求自动中止,无需手动干预,提升用户体验。
  • 系统影响:调度器增加了 _pending_chunked_abort_req 属性和两步检查,引入的判断开销极低;PD模式下每步调度增加一次全量请求的轮询,对规模化部署可能产生轻微延迟。
  • 团队影响:新增的手动测试和CI测试为后续类似功能提供了代码模板,降低测试编写门槛。
核心调度路径变更 PD 模式依赖网络 新增 CI 测试时长增加

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论