Prhub

#34856 fix tpot by adjusting the sliding max-prefill-size window size

原始 PR 作者 hanwlax 合并时间 2026-08-17 09:50 文件变更 7 提交数 1 评论 1 代码增减 +13 / -4

执行摘要

调整 NPU 性能用例 prefill delayer 窗口参数修复 TPOT

PR body 明确指出动机是 "prevent too fast max-prefill size decay to effect the decode pass",即滑动窗口过小会导致 max-prefill size 衰减过快,进而影响 decode 阶段的性能表现(TPOT)。因此需要为 NPU 平台各性能用例放宽滑动窗口大小,并调整配套的延迟轮数参数。

不建议精读,属于纯测试参数调优。值得留意的只有一点:prefill delayer 的滑动窗口大小会显著影响 NPU 上长序列场景的 decode pass 稳定性,后续若有平台调度调整,可参考本 PR 的窗口与 max-delay-passes 配套组合。

讨论亮点

本 PR 没有实质性的 review 技术讨论:唯一的 Issue 评论是 sglang-npu-bot 触发的 CI 指令 /tag-and-rerun-ci,审核状态为 sglang-npu-bot APPROVED,无人工 reviewer 评论。因此不存在未解决的争议点。

实现拆解

  1. 明确参数语义SGLANG_PREFILL_DELAYER_MAX_PREFILL_BS_WINDOW_SIZE 控制 prefill batch size 滑动窗口大小,窗口越大,max-prefill size 衰减越平缓;SGLANG_PREFILL_DELAYER_MAX_DELAY_PASSES--prefill-delayer-max-delay-passes 控制 prefill 延迟调度的最大轮数。本次改动围绕这两类参数展开。

  2. 逐用例调整参数组合(全部位于 test/registered/npu/performance/):

    • minimax_m2_5 用例:窗口 64 → 128,并在 --enable-prefill-delayer 后新增 --prefill-delayer-max-delay-passes 128
    • qwen3_6_27b 1080p 多模态用例:窗口 64 → 128,同时在启动参数中新增 --prefill-delayer-max-delay-passes 300
    • qwen3_6_27b 1024 多模态用例:环境变量 SGLANG_PREFILL_DELAYER_MAX_DELAY_PASSES 150 → 300,并新增窗口 128;
    • qwen3_235b_a22b 8 卡用例:SGLANG_PREFILL_DELAYER_MAX_DELAY_PASSES 100 → 50,并新增较小窗口 16(与其他用例方向相反);
    • qwen3-8bqwen3_30b_a3bqwen3_32b 三个用例:仅新增窗口 128,其余参数不变。
  3. 参数组合意图:除 235B 外,扩大窗口意味着 max-prefill size 的下降更平滑,避免 prefill batch 快速收缩导致 decode pass 的显存与调度抖动;235B 采用更小窗口 16 并降低 delay passes,应是针对 8 卡大规模 EP 场景单独验证过的配置。

  4. 测试配套说明:所有用例均通过 register_npu_ci 注册到对应 CI 套件(如 base-c-test-perf-8-npu-a3base-c-test-perf-2-npu-a3full-2-npu-a3 等),无新增单元测试,也无配置、schema 或部署配套改动;CI 由 sglang-npu-bot 以 /tag-and-rerun-ci 触发验证。

文件 模块 状态 重要度
test/registered/npu/performance/minimax_m2_5/test_npu_minimax_m2_5_w8a8_4p_in64k_out1k_prefix90_50ms.py 性能测试 modified 3.99
test/registered/npu/performance/qwen3_6_27b/test_npu_qwen3_6_27b_1p_in1080p_30_out256_50ms.py 性能测试 modified 3.99
test/registered/npu/performance/qwen3_235b_a22b/test_npu_qwen3_235b_w8a8_8p_in3k5_out1k5_50ms.py 性能测试 modified 3.52
test/registered/npu/performance/qwen3_6_27b/test_npu_qwen3_6_27b_1p_in1024x1024_30_out1024_50ms.py 性能测试 modified 3.52
test/registered/npu/performance/qwen3-8b/test_npu_qwen3_8b_w8a8_1p_in3k5_out1k5_50ms.py 性能测试 modified 2.88
test/registered/npu/performance/qwen3_30b_a3b/test_npu_qwen3_30b_w8a8_1p_in3k5_out1k5_50ms.py 性能测试 modified 2.88
test/registered/npu/performance/qwen3_32b/test_npu_qwen3_32b_w8a8_2p_in3k5_out1k5_50ms.py 性能测试 modified 2.88

关键源码片段

test/registered/npu/performance/minimax_m2_5/test_npu_minimax_m2_5_w8a8_4p_in64k_out1k_prefix90_50ms.py test-coverage

改动量最大的用例(+3/-1),将滑动窗口从 64 扩到 128 并新增 --prefill-delayer-max-delay-passes 128,是本 PR 的核心样例。

# MiniMax-M2.5 用例:滑动窗口从 64 上调到 128,并显式设置最大延迟轮数为 128。
# 目的是让 max-prefill size 衰减更平缓,避免 decode pass 被过快收缩的 prefill batch 拖累。
MINIMAX_M2_5_W8A8_4P_IN64K_OUT1K_PREFIX90_ENVS = {
    "PYTORCH_NPU_ALLOC_CONF": "expandable_segments:True",
    "STREAMS_PER_DEVICE": "32",
    "HCCL_SOCKET_IFNAME": "lo",
    "GLOO_SOCKET_IFNAME": "lo",
    # ... 其余环境变量省略 ...
    "SGLANG_PREFILL_DELAYER_MAX_PREFILL_BS_WINDOW_SIZE": "128", # 原值为 64
    "PYTHONPATH": f"{MINIMAX_M2_5_EAGLE3_MODEL_PATH}:{os.environ.get('PYTHONPATH', '')}",
}MINIMAX_M2_5_W8A8_4P_IN64K_OUT1K_PREFIX90_OTHER_ARGS = [
    # ... 其余启动参数省略 ...
    "--enable-prefill-delayer",
    "--prefill-delayer-max-delay-passes", # 新增:限制 prefill 延迟调度的最大轮数,配合窗口扩大
    128,
    "--prefill-max-requests",
    10,
    # ... 其余启动参数省略 ...
]
test/registered/npu/performance/qwen3_6_27b/test_npu_qwen3_6_27b_1p_in1080p_30_out256_50ms.py test-coverage

改动量同样为 +3/-1,窗口 64 → 128 并在命令行显式新增 --prefill-delayer-max-delay-passes 300,覆盖多模态长文本场景。

# Qwen3-6/27B 多模态用例(1080p):窗口从 64 扩到 128,并显式传入最大延迟轮数 300。
# 该用例使用 NEXTN 推测解码,放大窗口有助于稳定长序列 prefill 到 decode 的过渡。
QWEN3_6_27B_1080P_ENVS = {
    "STREAMS_PER_DEVICE": "32",
    "HCCL_SOCKET_IFNAME": "lo",
    "GLOO_SOCKET_IFNAME": "lo",
    # ... 其余环境变量省略 ...
    "SGLANG_PREFILL_DELAYER_MAX_PREFILL_BS_WINDOW_SIZE": "128", # 原值为 64
    "ASCEND_USE_FIA": "1",
}QWEN3_6_27B_1080P_OTHER_ARGS = [
    # ... 其余启动参数省略 ...
    "--enable-prefill-delayer",
    "--prefill-delayer-queue-min-ratio",
    0.45,
    "--prefill-delayer-max-delay-ms",
    5500,
    "--prefill-delayer-max-delay-passes", # 新增:显式配置最大延迟轮数 300
    300,
    "--enable-multimodal",
    # ... 其余启动参数省略 ...
]

评论区精华

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

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

风险与影响

风险极低,因为全部变更仅作用于测试用例的配置常量,不触碰产品代码路径。需要关注的具体点:

  • qwen3_235b_a22b 用例与其他 6 个用例的参数方向相反(delay passes 从 100 降至 50、窗口仅 16),若该组合是在小窗口下的激进策略,且 CI 环境波动时可能重新出现 TPOT 抖动,需要观察该 suite 的历史稳定性;
  • 窗口扩大后 prefill 延迟时间变长,可能影响同一 CI suite 中其他用例的排队时长,但不会影响产品行为;
  • 这些性能用例多为 nightly 或特定 NPU 套件,改动不覆盖 GPU 等其他硬件平台,无跨平台回归面。

影响范围限于 NPU 平台的性能 CI 套件(base-c-test-perf-8-npu-a3、base-c-test-perf-2-npu-a3、full-2-npu-a3 等),涉及 Minimax-M2.5、Qwen3-8B/30B/32B/235B、Qwen3-6/27B 多模态等模型场景的 TPOT 指标。对最终用户无影响,不改变任何服务端参数默认值或推理逻辑;对团队而言,该 PR 是 NPU 性能基准测试的配置维护,能提升 CI 对 prefill/decode 调度抖动的稳定性,但洞察价值有限。

仅测试参数调整 无产品代码影响 235B 用例参数方向相反

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论