执行摘要
此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是测试维护的一部分,有助于确保核心调度逻辑在演进中保持正确性。
参与讨论