diff --git a/tests/model_executor/models/qwen3_omni/test_qwen3_omni_quantization.py b/tests/model_executor/models/qwen3_omni/test_qwen3_omni_quantization.py new file mode 100644 index 000000000..382e2f4d1 --- /dev/null +++ b/tests/model_executor/models/qwen3_omni/test_qwen3_omni_quantization.py @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: Apache-2.0 +# SPDX-FileCopyrightText: Copyright contributors to the vLLM-Omni project +"""Regression tests for nested Qwen3-Omni quantization config mapping.""" + +from dataclasses import dataclass + +import pytest + +from vllm_omni.model_executor.models.qwen3_omni.quantization import ( + _OUTER_MAPPING_APPLIED, + apply_nested_quant_config_mapping, +) + +pytestmark = [pytest.mark.core_model, pytest.mark.cpu] + + +@dataclass +class _QuantConfig: + packed_modules_mapping: dict[str, list[str]] + + +@dataclass +class _NestedModel: + quant_config: _QuantConfig | None + + +@dataclass +class _NestedModelWithPackedModules(_NestedModel): + packed_modules_mapping: dict[str, list[str]] + + +def _mapped_quant_config(**packed_modules_mapping): + quant_config = _QuantConfig(packed_modules_mapping=packed_modules_mapping) + setattr(quant_config, _OUTER_MAPPING_APPLIED, True) + return quant_config + + +def test_nested_mapping_ignores_missing_quant_config(): + apply_nested_quant_config_mapping(_NestedModel(quant_config=None)) + + +def test_nested_mapping_allows_model_without_packed_modules_mapping(): + quant_config = _mapped_quant_config(existing=["module"]) + + apply_nested_quant_config_mapping(_NestedModel(quant_config=quant_config)) + + assert quant_config.packed_modules_mapping == {"existing": ["module"]} + + +def test_nested_mapping_merges_packed_modules_mapping(): + quant_config = _mapped_quant_config(existing=["module"]) + model = _NestedModelWithPackedModules( + quant_config=quant_config, + packed_modules_mapping={"qkv_proj": ["q_proj", "k_proj", "v_proj"]}, + ) + + apply_nested_quant_config_mapping(model) + + assert quant_config.packed_modules_mapping == { + "existing": ["module"], + "qkv_proj": ["q_proj", "k_proj", "v_proj"], + } diff --git a/vllm_omni/model_executor/models/qwen3_omni/quantization.py b/vllm_omni/model_executor/models/qwen3_omni/quantization.py index d870c7abd..26fe46956 100644 --- a/vllm_omni/model_executor/models/qwen3_omni/quantization.py +++ b/vllm_omni/model_executor/models/qwen3_omni/quantization.py @@ -1,5 +1,5 @@ # SPDX-License-Identifier: Apache-2.0 -# SPDX-FileCopyrightText: Copyright contributors to the vLLM project +# SPDX-FileCopyrightText: Copyright contributors to the vLLM-Omni project """Quantization mapping helpers for nested Qwen3-Omni stages.""" from vllm.model_executor.models.interfaces import SupportsQuant @@ -25,8 +25,8 @@ def apply_nested_quant_config_mapping(model: SupportsQuant) -> None: # The outer model maps names, while the nested model still contributes # fused-module metadata needed by quantization scheme matching. - if model.packed_modules_mapping is not None: - quant_config.packed_modules_mapping.update(model.packed_modules_mapping) + if packed_modules_mapping := getattr(model, "packed_modules_mapping", None): + quant_config.packed_modules_mapping.update(packed_modules_mapping) class Qwen3OmniNestedSupportsQuant(SupportsQuant):