Fix Laguna patch mutating flat RoPE parameters (#57189)

Signed-off-by: Laura López Real <laulopezreal@users.noreply.github.com> Co-authored-by: Laura López Real <laulopezreal@users.noreply.github.com> Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>

Laura Lopez-Real committed Sep 17, 2026 at 14:22 UTC a85dd55177d59b99903432c71c7376309d7e7757
2 files changed +38 -1
tests/test_config.py
+37
@@ -46,6 +46,7 @@ from vllm.config.utils import get_field
46 from vllm.config.vllm import OPTIMIZATION_LEVEL_TO_CONFIG, OptimizationLevel
47 from vllm.platforms import current_platform
48 from vllm.transformers_utils.config import (
49 + _patch_hf_transformers_nested_rope_validation,
50 get_pooling_config,
51 try_get_dense_modules,
52 )
@@ -54,6 +55,42 @@ from vllm.v1.attention.backend import AttentionCGSupport
55 DEVICE_TYPE = current_platform.device_type
56
57
58 +def test_nested_rope_validation_patch_preserves_flat_rope_parameters(monkeypatch):
59 + calls = []
60 +
61 + def original_validate_rope(config, *args, **kwargs):
62 + calls.append(config)
63 +
64 + from transformers import PretrainedConfig
65 +
66 + monkeypatch.setattr(PretrainedConfig, "validate_rope", original_validate_rope)
67 + _patch_hf_transformers_nested_rope_validation()
68 +
69 + nested_rope_parameters = {
70 + "full_attention": {"rope_type": "default"},
71 + "original_max_position_embeddings": 32768,
72 + }
73 + PretrainedConfig.validate_rope(
74 + SimpleNamespace(rope_parameters=nested_rope_parameters)
75 + )
76 + assert nested_rope_parameters == {"full_attention": {"rope_type": "default"}}
77 +
78 + flat_rope_parameters = {
79 + "rope_type": "linear",
80 + "factor": 8.0,
81 + "rope_theta": 500000.0,
82 + }
83 + PretrainedConfig.validate_rope(
84 + SimpleNamespace(rope_parameters=flat_rope_parameters)
85 + )
86 + assert flat_rope_parameters == {
87 + "rope_type": "linear",
88 + "factor": 8.0,
89 + "rope_theta": 500000.0,
90 + }
91 + assert len(calls) == 2
92 +
93 +
94 def _write_json(path: Path, value: object) -> None:
95 path.parent.mkdir(parents=True, exist_ok=True)
96 path.write_text(json.dumps(value), encoding="utf-8")
vllm/transformers_utils/config.py
+1 -1
@@ -273,7 +273,7 @@ def _patch_hf_transformers_nested_rope_validation() -> None:
273 layer_types = set(rope_parameters) & set(
274 hf_configuration_utils.ALLOWED_LAYER_TYPES
275 )
276 - if shared_keys := set(rope_parameters) - layer_types:
276 + if layer_types and (shared_keys := set(rope_parameters) - layer_types):
277 for key in shared_keys:
278 del rope_parameters[key]
279 logger.warning(