Signed-off-by: vensen <vensenmu@gmail.com> Signed-off-by: Yueqian Lin <linyueqian@outlook.com> Co-authored-by: Gao Han <hgaoaf@connect.ust.hk> Co-authored-by: Yueqian Lin <linyueqian@outlook.com> Co-authored-by: Yueqian Lin <70319226+linyueqian@users.noreply.github.com>
131 lines
5.0 KiB
Python
131 lines
5.0 KiB
Python
# SPDX-License-Identifier: Apache-2.0
|
|
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
|
|
"""Tests for the central pipeline registry (2.5/N)."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
import pytest
|
|
|
|
from vllm_omni.config.pipeline_registry import _OMNI_PIPELINES
|
|
from vllm_omni.config.stage_config import (
|
|
_PIPELINE_REGISTRY,
|
|
PipelineConfig,
|
|
StageExecutionType,
|
|
StagePipelineConfig,
|
|
register_pipeline,
|
|
)
|
|
|
|
|
|
class TestCentralRegistryDeclarations:
|
|
"""Every in-tree pipeline must be declared exactly once in the central registry."""
|
|
|
|
def test_omni_entries_visible_in_registry(self):
|
|
for key in _OMNI_PIPELINES:
|
|
assert key in _PIPELINE_REGISTRY
|
|
|
|
def test_expected_omni_pipelines_present(self):
|
|
# Guard against accidental removal during future refactors.
|
|
assert "qwen2_5_omni" in _OMNI_PIPELINES
|
|
assert "qwen2_5_omni_thinker_only" in _OMNI_PIPELINES
|
|
assert "qwen3_omni_moe" in _OMNI_PIPELINES
|
|
assert "qwen3_tts" in _OMNI_PIPELINES
|
|
|
|
|
|
class TestLazyLoading:
|
|
"""Pipelines are imported only on first access."""
|
|
|
|
def test_contains_without_import(self):
|
|
# ``in`` hits the lazy map, not the loaded cache.
|
|
assert "qwen3_omni_moe" in _PIPELINE_REGISTRY
|
|
|
|
def test_getitem_loads_correct_pipeline(self):
|
|
pipeline = _PIPELINE_REGISTRY["qwen3_omni_moe"]
|
|
assert pipeline.model_type == "qwen3_omni_moe"
|
|
assert pipeline.model_arch == "Qwen3OmniMoeForConditionalGeneration"
|
|
|
|
def test_unknown_model_type_returns_none_via_get(self):
|
|
assert _PIPELINE_REGISTRY.get("not_a_real_pipeline") is None
|
|
|
|
def test_unknown_model_type_raises_keyerror_via_getitem(self):
|
|
with pytest.raises(KeyError):
|
|
_PIPELINE_REGISTRY["not_a_real_pipeline"]
|
|
|
|
def test_iteration_yields_registered_pipelines(self):
|
|
keys = set(_PIPELINE_REGISTRY)
|
|
assert "qwen2_5_omni" in keys
|
|
assert "qwen3_omni_moe" in keys
|
|
|
|
def test_iteration_resilience(self, monkeypatch, caplog):
|
|
# Synthetic failure to verify iteration robustness against load errors.
|
|
target_logger = logging.getLogger("vllm_omni.config.stage_config")
|
|
target_logger.addHandler(caplog.handler)
|
|
prev_level = target_logger.level
|
|
target_logger.setLevel(logging.ERROR)
|
|
try:
|
|
monkeypatch.setattr(
|
|
_PIPELINE_REGISTRY,
|
|
"_lazy_map",
|
|
{
|
|
"healthy": ("vllm_omni.model_executor.models.qwen2_5_omni.pipeline", "QWEN2_5_OMNI_PIPELINE"),
|
|
"broken": ("vllm_omni.non_existent_module", "SomeConfig"),
|
|
"attr_fail": ("vllm_omni.config.stage_config", "NON_EXISTENT_VAR"),
|
|
},
|
|
)
|
|
|
|
# Assert that list(_PIPELINE_REGISTRY.values()) and dict(_PIPELINE_REGISTRY.items())
|
|
# both yield only healthy entries.
|
|
healthy_instance = _PIPELINE_REGISTRY["healthy"]
|
|
assert list(_PIPELINE_REGISTRY.values()) == [healthy_instance]
|
|
assert dict(_PIPELINE_REGISTRY.items()) == {"healthy": healthy_instance}
|
|
assert "Failed to import pipeline module" in caplog.text
|
|
assert "Pipeline variable 'NON_EXISTENT_VAR' not found" in caplog.text
|
|
|
|
finally:
|
|
target_logger.removeHandler(caplog.handler)
|
|
target_logger.setLevel(prev_level)
|
|
|
|
|
|
class TestDynamicRegistration:
|
|
"""``register_pipeline()`` still works for plugins and tests."""
|
|
|
|
def test_register_adds_to_registry(self):
|
|
custom = PipelineConfig(
|
|
model_type="_test_dynamic_registration",
|
|
model_arch="DynamicTestModel",
|
|
stages=(
|
|
StagePipelineConfig(
|
|
stage_id=0,
|
|
model_stage="test",
|
|
execution_type=StageExecutionType.LLM_AR,
|
|
input_sources=(),
|
|
final_output=True,
|
|
),
|
|
),
|
|
)
|
|
register_pipeline(custom)
|
|
try:
|
|
assert "_test_dynamic_registration" in _PIPELINE_REGISTRY
|
|
assert _PIPELINE_REGISTRY["_test_dynamic_registration"] is custom
|
|
finally:
|
|
# Don't leak the test registration into other tests.
|
|
if "_test_dynamic_registration" in _PIPELINE_REGISTRY:
|
|
del _PIPELINE_REGISTRY["_test_dynamic_registration"]
|
|
|
|
def test_dynamic_registration_overrides_lazy_entry(self):
|
|
# Build a substitute for qwen3_omni_moe that we can distinguish.
|
|
original = _PIPELINE_REGISTRY["qwen3_omni_moe"]
|
|
override = PipelineConfig(
|
|
model_type="qwen3_omni_moe",
|
|
model_arch="OverriddenArch",
|
|
stages=original.stages,
|
|
)
|
|
register_pipeline(override)
|
|
try:
|
|
assert _PIPELINE_REGISTRY["qwen3_omni_moe"].model_arch == "OverriddenArch"
|
|
finally:
|
|
# Remove the dynamic override so later tests see the original.
|
|
if "qwen3_omni_moe" in _PIPELINE_REGISTRY._loaded:
|
|
del _PIPELINE_REGISTRY["qwen3_omni_moe"]
|