Prhub

#26780 [PD] Optimistic prefill

原始 PR 作者 cctry 合并时间 2026-06-02 16:16 文件变更 11 提交数 16 评论 19 代码增减 +571 / -92

执行摘要

PD 分解中乐观预填充,减少 TTFT

在 PD 分解中,预填充当前需要等待 bootstrap 完成才能开始计算,该等待直接增加 TTFT,包括调度器间到达时间偏差、解码侧分配延迟和 bootstrap 握手开销。本 PR 通过乐观预填充允许预填充提前开始,如果 bootstrap 在预填充完成前就绪则正常进行,否则重试或回退。(引自 PR body)

该 PR 值得精读,特别是重叠调度和状态管理的设计。建议关注 metadata buffer 分配策略和重试回退路径。对于使用 PD 分解的团队,建议评估此优化并配置合适的重试次数。

讨论亮点

Review 中核心讨论点包括:

  • Metadata buffer 耗尽死锁风险:gemini-code-assist[bot] 指出 pop_bootstrapped 中使用 break 当缓冲区耗尽时可能导致 head-of-line blocking,建议改为 continue。作者采纳。
  • 测试用例静默通过:bot 发现 test_survive_requests 未递增 successes 且未处理 HTTP 500,但作者澄清所有请求预期失败,无需 assertion。ShangmingCai 认可。
  • 重试前 KV 缓存释放:ShangmingCai 询问是否需要显式释放 KV 缓存防止泄漏,作者解释 finalize_bootstrap 在此时不应失败,并添加断言。
  • 文档补充:ShangmingCai 建议增加文档,作者计划后续默认启用时更新。

实现拆解

  1. 核心重试逻辑prefill.py):新增 should_force_retry(基于 SHA-256 哈希采样)和 maybe_release_metadata_buffer 函数,管理重试触发和元数据缓冲区释放。
  2. 元数据缓冲区管理prefill.py):将 add 拆分为 create_sender(仅创建发送器)、ensure_metadata_buffer(分配缓冲区索引)、finalize_bootstrap(bootstrap 完成后初始化发送器),支持先创建后分配。
  3. 调度器适配schedule_policy.pyscheduler.py):在调度 chunked prefill 前轮询 bootstrap 状态,若未就绪则释放 KV 缓存并将请求重新排到等待队列头部(保留元数据缓冲区)。
  4. 请求时间统计重构req_time_stats.py):移除 alloc_wait_duration,新增 prefill_retry_count 字段和 reset_prefill_retry_time 方法,重试时重置相关时间戳。
  5. 缓存命中率修正metrics_reporter.py):增加 reprocessed_log_input_tokensreprocessed_log_hit_tokens,从缓存命中率计算中扣除重试导致的重复 token。
  6. 配置与校验server_args.py):添加 --optimistic-prefill-retries 参数,并禁用不兼容特性(pipeline parallelism、HiCache、Mamba radix cache)。
  7. 测试覆盖:新增 test_disaggregation_optimistic_prefill.py(202 行),包含强制重试采样工具、重试计数器断言、GSM8K 准确率测试、logprob 测试和故障注入测试。
文件 模块 状态 重要度
python/sglang/srt/disaggregation/prefill.py 预填充 modified 8.84
test/registered/disaggregation/test_disaggregation_optimistic_prefill.py 测试 added 7.69
python/sglang/srt/disaggregation/utils.py PD 工具 modified 7.2
python/sglang/srt/observability/req_time_stats.py 可观测性 modified 6.81
python/sglang/srt/server_args.py 配置 modified 6.09
python/sglang/srt/managers/scheduler_components/metrics_reporter.py 指标 modified 5.45

关键符号

should_force_retry maybe_release_metadata_buffer ensure_metadata_buffer finalize_bootstrap reset_prefill_retry_time _poll_with_failure_injection is_aborted advance_logprob_pt

关键源码片段

python/sglang/srt/disaggregation/prefill.py core-logic

核心变更文件,实现乐观预填充的主要逻辑:强制重试检测、元数据缓冲区管理、bootstrap 最终化等。

import hashlib
from sglang.srt.managers.schedule_batch import Req
from sglang.srt.environ import envsdef should_force_retry(req: Req) -> bool:
    # Test hook to force a request into optimistic prefill retry.
    retry_prob = envs.SGLANG_TEST_FORCE_OPTIMISTIC_PREFILL_RETRY_PROB.get()
    # 如果 重试概率 <= 0 或请求已经重试过或被撤销,则不强制重试
    if retry_prob <= 0 or req.time_stats.prefill_retry_count > 0 or req.is_retracted:
        return False
    # 使用 SHA-256 哈希请求 ID 来实现确定性采样
    digest = hashlib.sha256(str(req.rid).encode()).digest()
    return int.from_bytes(digest[:8], 'big') < retry_prob * 2**64def maybe_release_metadata_buffer(
    req: Req, allocator: ReqToMetadataIdxAllocator
) -> None:
    # 释放请求的元数据缓冲区索引,如果已分配
    if req.metadata_buffer_index >= 0:
        allocator.free(req.metadata_buffer_index)
        req.metadata_buffer_index = -1

评论区精华

Metadata buffer 耗尽导致死锁风险 正确性

gemini-code-assist[bot] 指出 `pop_bootstrapped` 中使用 `break` 当 metadata buffers 耗尽时可能导致 head-of-line blocking,建议改为 `continue`。

结论:作者接受建议,将 `break` 改为 `continue`,避免死锁。 · 已解决

测试用例静默通过问题 测试

gemini-code-assist[bot] 指出 `test_survive_requests` 中 `successes` 计数器未递增且未处理 HTTP 500,可能静默通过。ShangmingCai 建议增加断言。

结论:作者回应所有请求预期失败,无需 assertion。ShangmingCai 随后认可。 · 已解决

重试前 KV 缓存释放确认 正确性

ShangmingCai 询问是否需要在重新排队前释放 KV 缓存以防止泄漏。

结论:作者回复 `finalize_bootstrap` 不应失败,已添加断言确认并注释说明。 · 已解决

文档补充建议 documentation

ShangmingCai 建议在文档中补充新功能说明。

结论:作者同意计划后续默认启用时更新文档。 · acknowledged

风险与影响

  • Metadata buffer 耗尽:尽管已改为 continue 避免死锁,但若所有缓冲区都被占用,后续请求仍需等待,可能影响吞吐。
  • 与高级特性不兼容:乐观预填充与 HiCache、Mamba radix cache、pipeline parallelism 不兼容,虽然在配置校验中禁用,但用户可能期望这些特性同时启用,导致配置混淆。
  • 时间统计变更影响监控:移除 alloc_wait_duration 可能使依赖于该指标的监控 dashboard 失效。
  • 重试逻辑增加状态复杂度:引入 pending_bootstrapprefill_retry_count 等状态,可能与其他调度特性(如 retract)交互导致意外行为。
  • 对用户:启用后 TTFT 显著降低(bench 显示 P99 降低 50%),但需注意与 HiCache、Mamba 等特性互斥。
  • 对系统:增加了调度重试路径和元数据缓冲区占用量,但通过重试预算限制开销。
  • 对团队:新增核心调度逻辑,需要维护测试稳定性和兼容性矩阵。
metadata buffer 耗尽风险 与 HiCache/Mamba/PP 不兼容 重试逻辑增加调度复杂度

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论