Prhub

#37051 Fix priority preemption regression test in scheduler

vllm-project/vllm · 作者 ezylopx5 · 合并时间 2026-04-01 11:36

分析状态 已生成
文件变更 1提交数 3 · 评论 22
代码增减 +75 / -63
test bugfix v1 scheduler

执行摘要

修复调度器优先级抢占回归测试,替换跳过测试为确定性多步验证。

根据PR body描述,根因是旧测试期望在单个调度步骤后立即抢占,但实际抢占发生在运行请求推进并请求额外KV块之后。因此需要替换跳过的测试,以更健壮和确定性的方式验证优先级调度预emption逻辑。

建议技术管理者关注此PR,因为它展示了如何设计健壮的回归测试以验证核心调度器逻辑。工程师可精读测试函数以理解KV块压力和抢占机制的设计细节。

讨论亮点

review讨论主要集中在测试设计优化:1) orozery询问循环次数的合理性,ezylopx5调整为动态计算循环边界(基于块分配数学),提升了测试精确性;2) orozery建议测试应模拟高优先级请求在低优先级之后到达以验证抢占逻辑,最终测试被重写为扁平结构,先运行两个低优先级请求,后加入高优先级请求,确保抢占发生时同时有高低优先级请求在运行;3) 讨论还涉及update_from_output()不分配块、抢占实际发生在schedule()调用时,澄清了抢占触发机制。

实现拆解

唯一修改的文件是'tests/v1/core/test_scheduler.py',主要改动包括:1) 移除@pytest.mark.skip注解;2) 重写test_priority_scheduling_preemption函数,添加详细分阶段注释(Phase 1-3),模拟低优先级请求先运行、高优先级请求后到达的场景;3) 使用块对齐的令牌数(block_size * 2)避免循环,通过精确的块分配数学计算触发抢占;4) 添加断言验证抢占和调度结果。

文件 模块 状态 重要度
tests/v1/core/test_scheduler.py v1/core/scheduler 测试 modified 3.0

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

关键符号

test_priority_scheduling_preemption

评论区精华

循环次数的优化 设计

orozery 询问 ' 为什么需要循环 8 次?应精确预测逐出 ',ezylopx5 回应并调整为动态计算循环边界(tokens_to_next_block + 2)。

结论:采用基于块分配数学的动态计算,避免硬编码循环,提高测试精确性。 · 已解决

测试场景设计 正确性

orozery 指出测试应模拟高优先级请求在低优先级之后到达以验证抢占逻辑,确保抢占发生时同时有高低优先级请求在运行。

结论:最终测试重写为扁平结构,先运行低优先级请求,后加入高优先级请求,验证抢占正确性。 · 已解决

风险与影响

风险较低:1) 回归风险:测试变更可能影响现有测试覆盖率,但PR旨在修复无效测试,提高可靠性;2) 兼容性风险:无,仅修改测试代码,不影响生产逻辑;3) 性能风险:无,测试运行时间微小变化。

影响范围有限:1) 对用户:无直接影响,这是内部测试改进;2) 对系统:提高调度器优先级抢占逻辑的测试信心,有助于预防未来回归;3) 对团队:增强测试可维护性和确定性,减少调试时间。

测试覆盖变更

关联 Issue

未识别关联 Issue

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

完整报告

执行摘要

此PR修复了vLLM调度器中一个之前被跳过的优先级抢占回归测试,通过重写测试函数为确定性多步验证,确保在KV块压力下低优先级请求被抢占而高优先级请求保持运行,提高测试可靠性和可维护性,对生产代码无直接影响。

功能与动机

动机源于旧测试依赖重复请求ID而失效,且期望立即抢占不符合实际调度行为。PR body指出:“根因是旧测试期望在单个调度步骤后立即抢占,而实际抢占发生在运行请求推进并请求额外KV块之后。” 因此需要替换测试以更准确验证优先级抢占逻辑。

实现拆解

改动集中于tests/v1/core/test_scheduler.py文件的test_priority_scheduling_preemption函数:

  • 移除跳过注解:删除@pytest.mark.skip("needs investigation"),使测试重新启用。
  • 重写测试逻辑
    • 添加分阶段注释(Phase 1-3),模拟低优先级请求先运行、高优先级请求后到达的场景。
    • 使用块对齐令牌数(block_size * 2 = 32 tokens)确保每个请求初始占用2个块,通过解码步骤触发额外块需求。
    • 移除循环结构,采用扁平化调用schedule()update_from_output(),精确控制抢占触发点。
  • 断言验证
    python assert lo1.status == RequestStatus.PREEMPTED # 低优先级请求被抢占 assert hi1 in scheduler.running # 高优先级请求保持运行

评论区精华

review讨论中核心交锋包括:

orozery: “为什么需要循环8次?我们应精确预测逐出。”
ezylopx5: 调整为动态计算循环边界(tokens_to_next_block + 2),基于块分配数学提升精确性。

orozery: “测试应模拟高优先级请求在低优先级之后到达,以验证抢占逻辑。”
ezylopx5: 重写测试为先运行两个低优先级请求,后加入高优先级请求,确保抢占发生时高低优先级请求同时运行,验证调度器优先抢占最低优先级请求。

风险与影响

风险

  • 回归风险:测试变更可能意外破坏其他测试,但通过精确模拟和断言降低了风险。
  • 兼容性风险:无,仅影响测试代码。
    影响

  • 对用户无直接影响,这是内部测试改进。

  • 提升调度器优先级抢占逻辑的测试覆盖率,增强系统稳定性。
  • 团队受益于更健壮的回归测试,减少未来调试成本。

关联脉络

此PR与历史PR #37067 相关,原始PR被拆分为调度器测试修复和CPU平台检测修复两个部分。从近期历史PR看,vLLM项目持续优化测试和调度器模块(如 #37160 引入CPU KV缓存卸载),此PR是测试维护的一部分,有助于确保核心调度逻辑在演进中保持正确性。

参与讨论