Prhub

#46771 [ModelRunner V2] Update scheduler tests to cover MRV2 paths

原始 PR 作者 njhill 合并时间 2026-06-27 00:36 文件变更 2 提交数 1 评论 0 代码增减 +53 / -18

执行摘要

调度器测试覆盖 MRV2 路径

V2 model runner 引入后,现有调度器测试仅覆盖 V1 路径,缺少对 V2 行为(如抢占恢复请求的表示方式)的验证。PR 通过参数化测试填补这一空白,提高测试覆盖率。

建议精读测试中针对 V2 行为差异的断言逻辑,理解 V2 model runner 将抢占恢复视为新请求而非缓存请求的设计意图。

讨论亮点

无讨论,PR 由 reviewer WoosukKwon 直接批准。

实现拆解

  1. tests/v1/core/utils.pycreate_scheduler 函数新增 use_v2_model_runner 参数,若未指定则读取 envs.VLLM_USE_V2_MODEL_RUNNER 环境变量,并赋值给 scheduler.use_v2_model_runner
  2. tests/v1/core/test_scheduler.pytest_cached_request_data_resumed_all_token_ids_mrv1_only 中显式传入 use_v2_model_runner=False,确保该测试始终运行在 V1 模式下。
  3. test_kv_connector_handles_preemption 测试函数上新增 use_v2_model_runner 参数化,并在创建调度器时传入该参数;根据 use_v2_model_runner 调整断言:V2 模式下,恢复的请求应出现在 scheduled_new_reqs 而非 scheduled_cached_reqs
  4. 同步更新 create_scheduler_with_priority 助手函数,同样支持use_v2_model_runner 参数。
文件 模块 状态 重要度
tests/v1/core/test_scheduler.py 调度器 modified 6.58
tests/v1/core/utils.py 测试工具 modified 5.38

关键符号

create_scheduler test_kv_connector_handles_preemption

关键源码片段

tests/v1/core/test_scheduler.py test-coverage

核心测试文件,新增 `use_v2_model_runner` 参数化覆盖 V2 路径,调整断言以匹配 V2 行为。

@pytest.mark.parametrize("use_v2_model_runner", [False, True])
@pytest.mark.parametrize("is_async", [False, True])
@pytest.mark.parametrize(
    "use_ec_connector, ec_role", [(False, None), (True, "ec_consumer")]
)
def test_kv_connector_handles_preemption(
    is_async, use_ec_connector, ec_role, use_v2_model_runner
):
    """Test whether scheduler with KVConnector can handle preemption when
    blocks run out in allocate_slots()."""
    scheduler = create_scheduler(
        is_async,
        use_kv_connector=mock_kv(matched_tokens=0, is_async=is_async),
        num_blocks=4,
        block_size=16,
        use_ec_connector=use_ec_connector,
        ec_role=ec_role,
        use_v2_model_runner=use_v2_model_runner,
    )
    # ... (request setup and scheduling steps omitted for brevity)
    # After one request completes and triggers preemption:
    if use_v2_model_runner:
        # V2 model runner 将抢占恢复的请求视为 NewRequestData
        # 而不是 CachedRequestData,因此 expects 中 cached_reqs 为 0
        assert output.scheduled_cached_reqs.num_reqs == 0
        assert len(output.scheduled_new_reqs) == 1
    else:
        # V1 model runner 保持原有行为:恢复的请求作为 CachedRequestData
        assert output.scheduled_cached_reqs.num_reqs == 1
        assert output.scheduled_new_reqs == []
tests/v1/core/utils.py test-coverage

工具函数文件,`create_scheduler` 新增 `use_v2_model_runner` 参数,支持注入 V2 behavior 以方便测试。

def create_scheduler(
    model: str = "facebook/opt-125m",
    # ... other params ...
    use_v2_model_runner: bool | None = None, # 新增参数:控制 scheduler 使用的 model runner 版本
) -> Scheduler | AsyncScheduler:
    # ... config setup ...
    scheduler = scheduler_cls(
        vllm_config=vllm_config,
        kv_cache_config=kv_cache_config,
        block_size=block_size,
        log_stats=True,
        structured_output_manager=StructuredOutputManager(vllm_config),
    )
    if use_v2_model_runner is None:
        # 默认从环境变量 VLLM_USE_V2_MODEL_RUNNER 读取
        use_v2_model_runner = bool(envs.VLLM_USE_V2_MODEL_RUNNER)
    scheduler.use_v2_model_runner = use_v2_model_runner
    return scheduler

评论区精华

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

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

风险与影响

风险极低。变更仅涉及测试代码和辅助函数,不修改任何生产逻辑。参数化后不会影响现有 V1 测试结果,新增 V2 路径验证可提前发现问题。

影响范围限于 v1 scheduler 的测试覆盖。增强了对 V2 model runner 行为的回归保护,尤其是抢占恢复场景,有助于防止未来重构引入的兼容性问题。

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论