执行摘要
- 一句话:实现分块预填充中止与PD对端存活检测
- 推荐动作:值得精读,特别是
process_pending_chunked_abort 的安全中止模式(延迟处理+多个调度点)和 resolve_waiting_queue_bootstrap 的对端检测集成方式。测试代码也提供了良好的端到端验证范例。建议熟悉 scheduler 和 PD 模块的团队成员优先 Review。
功能与动机
PR body指出:'Two abort improvements for the PD / chunked-prefill path.' 在chunked prefill场景下,原有中止请求只在分块之间生效,分块处理中无法立即中止。PD模式下对端失效后没有自动中止机制,可能导致请求挂起。该PR通过记录待中止的chunked request并在调度器安全点清理,以及添加对端存活轮询,解决了这些问题。
实现拆解
- 安全中止标记与延迟清理:在
scheduler.py 的 init_chunked_prefill 中新增 _pending_chunked_abort_req 属性;abort_request 仅将目标请求赋值给此标记,避免在迭代中途直接销毁。新增 process_pending_chunked_abort 方法,在每个调度步 get_next_batch_to_run 开头调用。
- 中止逻辑:
process_pending_chunked_abort 判断待中止请求是否为当前分块(chunked_req)。若是,则调用 prepare_abort 标记中止、释放KV缓存(含disagg sender/metadata buffer)、清空 chunked_req 并通知tokenizer;若不是,则在请求完结后清除标记。在disagg prefill模式下还处理 maybe_release_metadata_buffer 和 release_kv_cache。
- 对端存活检测:在
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。
- 入口集成:修改
get_next_batch_to_run(统一模式)和 get_next_disagg_prefill_batch_to_run(PD模式)的调度步骤,分别插入 process_pending_chunked_abort 和 resolve_waiting_queue_bootstrap。
- 配套调整:在
batch_result_processor.py 中微调结果处理以跳过已中止的chunk;更新单元测试 mock(test_scheduler_chunked_req_gate.py)以初始化 _pending_chunked_abort_req。
关键文件:
python/sglang/srt/managers/scheduler.py(模块 调度器;类别 source;类型 core-logic;符号 process_pending_chunked_abort): 核心调度器,新增 process_pending_chunked_abort 方法实现 chunked prefill 中止安全处理,并在 get_next_batch_to_run 入口调用。
python/sglang/srt/disaggregation/prefill.py(模块 预填充管理;类别 source;类型 core-logic;符号 resolve_waiting_queue_bootstrap): 预填充管理,新增 resolve_waiting_queue_bootstrap 方法检测对端存活并处理失效,集成到 get_next_disagg_prefill_batch_to_run。
python/sglang/test/manual/disaggregation/test_disaggregation_peer_liveness_abort.py(模块 对端存活测试;类别 test;类型 test-coverage;符号 _body_text, _decode_response, _finish_reason, _is_abort_result): 新增手动测试,验证 PD 对端失效后自动中止并恢复,覆盖对端存活检测核心场景。
python/sglang/test/manual/disaggregation/test_chunked_prefill_abort.py(模块 分块中止测试;类别 test;类型 test-coverage;符号 _decode_response, _is_abort_result, TestChunkedPrefillAbortE2E, test_abort_mid_chunked_prefill_by_rid): 新增手动测试,验证统一模式下 chunked prefill 中止功能。
test/registered/disaggregation/test_disaggregation_basic.py(模块 PT测试套件;类别 test;类型 test-coverage;符号 _decode_response, _is_abort_result, TestDisaggChunkedPrefillAbort, _post_abort): 注册 CI 的测试文件,新增 TestDisaggChunkedPrefillAbort 类,将 chunked prefill 中止测试纳入持续集成。
关键符号:process_pending_chunked_abort, resolve_waiting_queue_bootstrap
评论区精华
风险与影响
- 风险:
- 核心路径变更:
scheduler.py 是调度器核心,新增的 process_pending_chunked_abort 在每个调度步调用,可能引入回归,需关注请求泄漏或死锁。
- PD模式网络依赖:
resolve_waiting_queue_bootstrap 中引入的 poll_and_all_reduce_attn_cp_tp_group 网络轮询可能增加PD模式下请求入队延迟,若网络抖动可能误判对端失败。
- KV缓存释放安全性:中止路径中的
release_kv_cache 和 maybe_release_metadata_buffer 必须与主路径一致,避免双重释放或泄漏。
- 测试时长:新增的CI测试(预估时间从560秒提升到700秒)可能增加CI流水线耗时。
- 影响:
- 用户影响:chunked prefill场景下调用
abort_request 可立即停止分块处理,PD模式下对端失效的请求自动中止,无需手动干预,提升用户体验。
- 系统影响:调度器增加了
_pending_chunked_abort_req 属性和两步检查,引入的判断开销极低;PD模式下每步调度增加一次全量请求的轮询,对规模化部署可能产生轻微延迟。
- 团队影响:新增的手动测试和CI测试为后续类似功能提供了代码模板,降低测试编写门槛。
- 风险标记:核心调度路径变更, PD模式依赖网络, 新增CI测试时长增加
关联脉络
参与讨论