A high-throughput and memory-efficient inference and serving engine for LLMs
Deprecate Transformers v4 support (#45161)
Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com>
Harry Mellor committed
Jun 11, 2026 at 04:04 UTC
18d87a87dc39c1a50f452b218fdcc3aeec48d18e
19 files changed
+62
-268
requirements/common.txt
+1
-1
@@ -7,7 +7,7 @@ requests >= 2.26.0
7
tqdm
8
blake3
9
py-cpuinfo
10
-transformers >= 4.56.0, != 5.0.*, != 5.1.*, != 5.2.*, != 5.3.*, != 5.4.*, != 5.5.0
10
+transformers >= 5.5.3
11
tokenizers >= 0.21.1 # Required for fast incremental detokenization.
12
safetensors >= 0.6.2 # MXFP4/MXFP6 dtype support (F8_E8M0, F4) added in 0.6.0: https://github.com/huggingface/safetensors/pull/611
13
protobuf >= 5.29.6, !=6.30.*, !=6.31.*, !=6.32.*, !=6.33.0.*, !=6.33.1.*, !=6.33.2.*, !=6.33.3.*, !=6.33.4.* # Required by LlamaTokenizer, gRPC. CVE-2026-0994
vllm/config/vllm.py
+2
-6
@@ -14,12 +14,10 @@ from dataclasses import is_dataclass
14
from datetime import datetime
15
from enum import IntEnum
16
from functools import lru_cache
17
-from importlib.metadata import version
17
from pathlib import Path
18
from typing import TYPE_CHECKING, Any, Literal, TypeVar, get_args
19
20
import torch
22
-from packaging.version import Version
21
from pydantic import ConfigDict, Field, model_validator
22
23
import vllm.envs as envs
@@ -697,10 +695,8 @@ class VllmConfig:
695
# Therefore, the presence of tie_word_embeddings in SomeVLTextConfig cannot
696
# be used as a signal for whether tie_word_embeddings should be copied from
697
# hf_config to the language_model config.
700
- if (
701
- Version(version("transformers")) >= Version("5.0.0")
702
- and model_config.is_multimodal_model
703
- and hasattr(model_config.hf_config, "tie_word_embeddings")
698
+ if model_config.is_multimodal_model and hasattr(
699
+ model_config.hf_config, "tie_word_embeddings"
700
):
701
tie_word_embeddings = model_config.hf_config.tie_word_embeddings
702
hf_config.get_text_config().tie_word_embeddings = tie_word_embeddings
vllm/model_executor/model_loader/weight_utils.py
+1
-18
@@ -77,30 +77,13 @@ logger = init_logger(__name__)
77
temp_dir = tempfile.gettempdir()
78
79
80
-def enable_hf_transfer():
81
- """automatically activates hf_transfer"""
82
- if "HF_HUB_ENABLE_HF_TRANSFER" not in os.environ:
83
- try:
84
- # enable hf hub transfer if available
85
- import hf_transfer # type: ignore # noqa
86
-
87
- huggingface_hub.constants.HF_HUB_ENABLE_HF_TRANSFER = True
88
- except ImportError:
89
- pass
90
-
91
-
80
def enable_xet_high_performance():
81
"""automatically activates xet high performance mode"""
82
if "HF_XET_HIGH_PERFORMANCE" not in os.environ:
83
huggingface_hub.constants.HF_XET_HIGH_PERFORMANCE = True
84
85
98
-if hasattr(huggingface_hub.constants, "HF_XET_HIGH_PERFORMANCE"):
99
- # Transformers v5
100
- enable_xet_high_performance()
101
-else:
102
- # Transformers v4
103
- enable_hf_transfer()
86
+enable_xet_high_performance()
87
88
89
class DisabledTqdm(tqdm):
vllm/model_executor/models/gemma3n_mm.py
+2
-7
@@ -618,13 +618,8 @@ class Gemma3nForConditionalGeneration(
618
input_features = audio_input["input_features_padded"].squeeze(1)
619
input_features_mask = audio_input["input_features_mask"].squeeze(1)
620
audio_outputs = self.audio_tower(input_features, ~input_features_mask)
621
- if isinstance(audio_outputs, tuple):
622
- # Transformers v4
623
- audio_encodings, audio_mask = audio_outputs
624
- else:
625
- # Transformers v5
626
- audio_encodings = audio_outputs.last_hidden_state
627
- audio_mask = audio_outputs.audio_mel_mask
621
+ audio_encodings = audio_outputs.last_hidden_state
622
+ audio_mask = audio_outputs.audio_mel_mask
623
audio_features = self.embed_audio(inputs_embeds=audio_encodings)
624
625
# The Gemma3nProcessor expects all audio will be 30s in length and
vllm/model_executor/models/qwen3_omni_moe_thinker.py
-36
@@ -30,9 +30,7 @@ import numpy as np
30
import torch
31
import torch.nn as nn
32
import torch.nn.functional as F
33
-from packaging.version import Version
33
from transformers import PretrainedConfig
35
-from transformers import __version__ as TRANSFORMERS_VERSION
34
from transformers.feature_extraction_utils import BatchFeature
35
from transformers.models.qwen3_omni_moe.configuration_qwen3_omni_moe import (
36
Qwen3OmniMoeAudioEncoderConfig,
@@ -1261,40 +1259,6 @@ class Qwen3OmniMoeThinkerMultiModalProcessor(
1259
tok_kwargs = dict(tok_kwargs)
1260
mm_kwargs["audio_kwargs"] = dict(mm_kwargs.get("audio_kwargs") or {})
1261
mm_kwargs["text_kwargs"] = dict(mm_kwargs.get("text_kwargs") or {})
1264
- if Version(TRANSFORMERS_VERSION) < Version("4.58.0"):
1265
- # Extract audio_sample_rate before restructuring
1266
- audio_sample_rate = mm_kwargs.pop("audio_sample_rate", None)
1267
-
1268
- # move truncation to audio_kwargs level to avoid conflict
1269
- # with tok_kwargs
1270
- mm_kwargs["audio_kwargs"].setdefault(
1271
- "truncation", mm_kwargs.pop("truncation", False)
1272
- )
1273
- mm_kwargs["text_kwargs"].setdefault(
1274
- "truncation", tok_kwargs.pop("truncation", False)
1275
- )
1276
-
1277
- # Validate and conditionally pass audio_sample_rate
1278
- # WhisperFeatureExtractor has a fixed sampling rate, and vLLM's
1279
- # audio loader already resamples audio to the target rate.
1280
- # Only pass the value if it matches to avoid unexpected behavior.
1281
- if audio_sample_rate is not None:
1282
- expected_sr = feature_extractor.sampling_rate
1283
- if audio_sample_rate != expected_sr:
1284
- logger.warning(
1285
- "[%s] audio_sample_rate mismatch: user provided %dHz "
1286
- "but model expects %dHz. Ignoring user value. "
1287
- "vLLM's audio loader already resampled to %dHz.",
1288
- self.__class__.__name__,
1289
- audio_sample_rate,
1290
- expected_sr,
1291
- expected_sr,
1292
- )
1293
- else:
1294
- # Sample rate matches, safe to pass
1295
- mm_kwargs["audio_kwargs"]["audio_sample_rate"] = (
1296
- audio_sample_rate
1297
- )
1262
1263
hf_inputs = super()._call_hf_processor(
1264
prompt=prompt,
vllm/model_executor/models/transformers/base.py
+16
-42
@@ -27,6 +27,10 @@ import transformers
27
from packaging.version import Version
28
from torch import nn
29
from transformers import AutoModel
30
+from transformers.conversion_mapping import (
31
+ WeightRenaming,
32
+ get_model_conversion_mapping,
33
+)
34
from transformers.modeling_utils import ALL_ATTENTION_FUNCTIONS
35
36
from vllm.compilation.decorators import support_torch_compile
@@ -212,16 +216,9 @@ class Base(
216
`create_attention_instances` are used
217
- Sets the dtype to the default torch dtype set by vLLM because Transformers
218
uses the config dtype when creating the model
215
- - Propagates this dtype to any sub-configs because Transformers model
216
- implementations do not support/use different dtypes in sub-models
219
"""
220
self.text_config._attn_implementation = "vllm"
221
self.config.dtype = torch.get_default_dtype()
220
- # TODO(hmellor): Remove this when Transformers v4 support is dropped
221
- for sub_config_name in getattr(self.config, "sub_configs", {}):
222
- sub_config = getattr(self.config, sub_config_name)
223
- if sub_config.dtype != (dtype := self.config.dtype):
224
- sub_config.dtype = dtype
222
223
def _get_decoder_cls(self, **kwargs: dict) -> type[PreTrainedModel]:
224
"""
@@ -300,9 +297,7 @@ class Base(
297
298
This handles:
299
303
- - Transformers weight renaming:
304
- - from `WeightRenaming` in Transformers v5
305
- - from `_checkpoint_conversion_mapping` in Transformers v4
300
+ - Transformers weight renaming from `WeightRenaming`
301
- Checkpoints saved with a base model prefix that is not `model`
302
- Checkpoints saved with no base model prefix
303
- Any quantization config specific mappings
@@ -310,37 +305,16 @@ class Base(
305
self.hf_to_vllm_mapper = WeightsMapper()
306
orig_to_new_regex = self.hf_to_vllm_mapper.orig_to_new_regex
307
313
- if Version(transformers.__version__) >= Version("5.0.0"):
314
- from transformers.conversion_mapping import (
315
- WeightRenaming,
316
- get_model_conversion_mapping,
317
- )
318
-
319
- for mapping in get_model_conversion_mapping(self.model):
320
- # Handle weights which have been renamed in Transformers
321
- if isinstance(mapping, WeightRenaming):
322
- # Recompile using regex (Transformers used re)
323
- compiled_sources = re.compile(
324
- mapping.compiled_sources.pattern, mapping.compiled_sources.flags
325
- )
326
- target_pattern = mapping.target_patterns[0]
327
- orig_to_new_regex[compiled_sources] = target_pattern
328
- # TODO: Handle WeightConverter to enable layer merging
329
- else:
330
- # Replace legacy suffixes used for norms
331
- # TODO(hmellor): Remove this when Transformers v4 support is dropped
332
- orig_to_new_regex.update(
333
- {
334
- re.compile(r"\.gamma$"): ".weight",
335
- re.compile(r"\.beta$"): ".bias",
336
- }
337
- )
338
-
339
- # Handle weights which have been renamed in Transformers
340
- # TODO(hmellor): Remove this when Transformers v4 support is dropped
341
- ccm = getattr(self.model, "_checkpoint_conversion_mapping", {})
342
- for source, target in ccm.items():
343
- orig_to_new_regex[re.compile(source)] = target
308
+ for mapping in get_model_conversion_mapping(self.model):
309
+ # Handle weights which have been renamed in Transformers
310
+ if isinstance(mapping, WeightRenaming):
311
+ # Recompile using regex (Transformers used re)
312
+ compiled_sources = re.compile(
313
+ mapping.compiled_sources.pattern, mapping.compiled_sources.flags
314
+ )
315
+ target_pattern = mapping.target_patterns[0]
316
+ orig_to_new_regex[compiled_sources] = target_pattern
317
+ # TODO: Handle WeightConverter to enable layer merging
318
319
# Handle unexpected weights which should be ignored
320
if self.model._keys_to_ignore_on_load_unexpected is not None:
@@ -377,7 +351,7 @@ class Base(
351
"""
352
Check if the model has tied word embeddings.
353
"""
380
- # Transformers v4 and v5 will store this in different places
354
+ # Models created with Transformers v4 and v5 will store this in different places
355
tie_word_embeddings_v4 = getattr(self.text_config, "tie_word_embeddings", False)
356
tie_word_embeddings_v5 = getattr(self.config, "tie_word_embeddings", False)
357
return tie_word_embeddings_v4 or tie_word_embeddings_v5
vllm/model_executor/models/transformers/utils.py
-6
@@ -101,8 +101,6 @@ Style = Literal[
101
"replicate",
102
"colwise_gather_output",
103
"rowwise_split_input",
104
- "colwise_rep",
105
- "rowwise_rep",
104
]
105
106
@@ -131,12 +129,8 @@ def replace_linear_class(
129
"colwise": (ColumnParallelLinear, {}),
130
"rowwise": (RowParallelLinear, {}),
131
"replicate": (ReplicatedLinear, {}),
134
- # Transformers v5
132
"colwise_gather_output": (ColumnParallelLinear, {"gather_output": True}),
133
"rowwise_split_input": (RowParallelLinear, {"input_is_parallel": False}),
137
- # Transformers v4
138
- "colwise_rep": (ColumnParallelLinear, {"gather_output": True}),
139
- "rowwise_rep": (RowParallelLinear, {"input_is_parallel": False}),
134
}.get(style, (ReplicatedLinear, {}))
135
136
return vllm_linear_cls(
vllm/model_executor/models/ultravox.py
-15
@@ -5,7 +5,6 @@
5
"""PyTorch Ultravox model."""
6
7
import copy
8
-import inspect
8
from collections.abc import Iterable, Mapping, Sequence
9
from types import SimpleNamespace
10
from typing import Annotated, Any, Literal, TypeAlias
@@ -397,17 +396,10 @@ class UltravoxTransformerProjector(nn.Module, ModuleUtilsMixin):
396
)
397
hidden_states = hidden_states + positions
398
400
- # Backward compatibility for Transformers v4 where layer_head_mask
401
- # was a required argument for WhisperEncoderLayer.forward
402
- kwargs = {}
403
- if "layer_head_mask" in inspect.signature(self.layers[0].forward).parameters:
404
- kwargs["layer_head_mask"] = None
405
-
399
for layer in self.layers:
400
hidden_states = layer(
401
hidden_states,
402
attention_mask=extended_attention_mask,
410
- **kwargs,
403
)
404
# BC version that allows for the old tupled output
405
if isinstance(hidden_states, tuple):
@@ -504,17 +496,10 @@ class ModifiedWhisperEncoder(WhisperEncoder):
496
497
attention_mask = self.get_attention_mask_by_audio_len(audio_lens, hidden_states)
498
507
- # Backward compatibility for Transformers v4 where layer_head_mask
508
- # was a required argument for WhisperEncoderLayer.forward
509
- kwargs = {}
510
- if "layer_head_mask" in inspect.signature(self.layers[0].forward).parameters:
511
- kwargs["layer_head_mask"] = None
512
-
499
for encoder_layer in self.layers:
500
hidden_states = encoder_layer(
501
hidden_states,
502
attention_mask,
517
- **kwargs,
503
)
504
# BC version that allows for the old tupled output
505
if isinstance(hidden_states, tuple):
vllm/tokenizers/mistral.py
+1
-9
@@ -31,21 +31,13 @@ from mistral_common.tokens.tokenizers.sentencepiece import (
31
)
32
from mistral_common.tokens.tokenizers.tekken import Tekkenizer
33
from pydantic import ValidationError
34
+from transformers.tokenization_mistral_common import MistralCommonBackend
35
36
from vllm.entrypoints.chat_utils import ChatCompletionMessageParam
37
from vllm.entrypoints.openai.chat_completion.protocol import ChatCompletionRequest
38
from vllm.logger import init_logger
39
from vllm.tokenizers.protocol import TokenizerLike
40
40
-try:
41
- # Transformers v5
42
- from transformers.tokenization_mistral_common import MistralCommonBackend
43
-except ImportError:
44
- # Transformers v4
45
- from transformers.tokenization_mistral_common import (
46
- MistralCommonTokenizer as MistralCommonBackend,
47
- )
48
-
41
if TYPE_CHECKING:
42
import llguidance
43
from transformers import BatchEncoding
vllm/transformers_utils/config.py
+19
-57
@@ -16,6 +16,7 @@ from huggingface_hub import constants
16
from packaging.version import Version
17
from safetensors.torch import _TYPES as _SAFETENSORS_TO_TORCH_DTYPE
18
from transformers import GenerationConfig, PretrainedConfig
19
+from transformers.configuration_utils import ALLOWED_LAYER_TYPES
20
from transformers.models.auto.image_processing_auto import get_image_processor_config
21
from transformers.models.auto.modeling_auto import (
22
MODEL_FOR_CAUSAL_LM_MAPPING_NAMES,
@@ -49,15 +50,6 @@ from .repo_utils import (
50
with_retry,
51
)
52
52
-try:
53
- # Transformers v5
54
- from transformers.configuration_utils import ALLOWED_ATTENTION_LAYER_TYPES
55
-except ImportError:
56
- # Transformers v4
57
- from transformers.configuration_utils import (
58
- ALLOWED_LAYER_TYPES as ALLOWED_ATTENTION_LAYER_TYPES,
59
- )
60
-
53
if envs.VLLM_USE_MODELSCOPE:
54
from modelscope import AutoConfig
55
else:
@@ -68,9 +60,8 @@ MISTRAL_CONFIG_NAME = "params.json"
60
logger = init_logger(__name__)
61
62
if Version(version("transformers")) < Version("5.0.0"):
71
- logger.warning(
72
- "Support for Transformers v4 is deprecated. The Transformers v4 codepath will "
73
- "become unmaintained in vLLM v0.22.0 and will be removed in vLLM v0.24.0. "
63
+ raise ImportError(
64
+ "Support for Transformers v4 is deprecated and was removed in vLLM v0.24.0. "
65
"Please upgrade to Transformers v5: pip install --upgrade transformers"
66
)
67
@@ -159,7 +150,7 @@ def is_rope_parameters_nested(rope_parameters: dict[str, Any]) -> bool:
150
# Cannot be nested if rope_parameters is empty
151
if not rope_parameters:
152
return False
162
- return set(rope_parameters.keys()).issubset(ALLOWED_ATTENTION_LAYER_TYPES)
153
+ return set(rope_parameters.keys()).issubset(ALLOWED_LAYER_TYPES)
154
155
156
@contextmanager
@@ -183,24 +174,21 @@ def _patch_hf_transformers_validate_rope():
174
hf transformers (from v5 onwards)
175
"""
176
186
- if Version(version("transformers")) >= Version("5.0.0"):
187
- if hasattr(PretrainedConfig.validate_rope, "__vllm_patched__"):
188
- return
177
+ if hasattr(PretrainedConfig.validate_rope, "__vllm_patched__"):
178
+ return
179
190
- _original_validate_rope = PretrainedConfig.validate_rope
180
+ _original_validate_rope = PretrainedConfig.validate_rope
181
192
- @wraps(_original_validate_rope)
193
- def patched_validate_rope(self, *args, **kwargs):
194
- ignore_keys_param = kwargs.pop("ignore_keys", None)
195
- original_ignore_keys = self.ignore_keys_at_rope_validation
196
- self.ignore_keys_at_rope_validation = (
197
- original_ignore_keys or ignore_keys_param
198
- )
199
- result = _original_validate_rope(self, *args, **kwargs)
200
- return result
182
+ @wraps(_original_validate_rope)
183
+ def patched_validate_rope(self, *args, **kwargs):
184
+ ignore_keys_param = kwargs.pop("ignore_keys", None)
185
+ original_ignore_keys = self.ignore_keys_at_rope_validation
186
+ self.ignore_keys_at_rope_validation = original_ignore_keys or ignore_keys_param
187
+ result = _original_validate_rope(self, *args, **kwargs)
188
+ return result
189
202
- patched_validate_rope.__vllm_patched__ = True # type: ignore[attr-defined]
203
- PretrainedConfig.validate_rope = patched_validate_rope
190
+ patched_validate_rope.__vllm_patched__ = True # type: ignore[attr-defined]
191
+ PretrainedConfig.validate_rope = patched_validate_rope
192
193
194
class HFConfigParser(ConfigParserBase):
@@ -493,39 +481,13 @@ def patch_rope_parameters(config: PretrainedConfig) -> None:
481
"""Provide backwards compatibility for RoPE."""
482
from vllm.config.utils import getattr_iter
483
496
- # Older custom models may use non-standard field names
497
- # which need patching for both Transformers v4 and v5.
484
+ # Older custom models may use non-standard field names which need patching.
485
names = ["rope_theta", "rotary_emb_base"]
486
rope_theta = getattr_iter(config, names, None, warn=True)
487
names = ["partial_rotary_factor", "rotary_pct", "rotary_emb_fraction"]
488
partial_rotary_factor = getattr_iter(config, names, None, warn=True)
502
- ompe = getattr(config, "original_max_position_embeddings", None)
503
-
504
- if Version(version("transformers")) < Version("5.0.0"):
505
- # Transformers v4 installed, legacy config fields may be present.
506
- if is_rope_parameters_nested(getattr(config, "rope_parameters", {})):
507
- # Loading nested rope_parameters (from Transformers v5) in Transformers v4.
508
- # Skip legacy patching since it should already be in the correct format.
509
- pass
510
- else:
511
- if (rope_scaling := getattr(config, "rope_scaling", None)) is not None:
512
- config.rope_parameters = rope_scaling
513
- if (
514
- rope_theta is not None
515
- or partial_rotary_factor is not None
516
- or ompe is not None
517
- ) and not getattr(config, "rope_parameters", None):
518
- config.rope_parameters = {"rope_type": "default"}
519
- # Patch legacy fields into rope_parameters
520
- if rope_theta is not None:
521
- config.rope_parameters["rope_theta"] = rope_theta
522
- if partial_rotary_factor is not None:
523
- config.rope_parameters["partial_rotary_factor"] = partial_rotary_factor
524
- if ompe is not None:
525
- config.rope_parameters["original_max_position_embeddings"] = ompe
526
- patch_legacy_rope_type(getattr(config, "rope_parameters", None))
527
- elif rope_theta is not None or getattr(config, "rope_parameters", None):
528
- # Transformers v5 installed
489
+
490
+ if rope_theta is not None or getattr(config, "rope_parameters", None):
491
# Patch these fields in case they used non-standard names
492
if rope_theta is not None:
493
config.rope_theta = rope_theta
vllm/transformers_utils/configs/deepseek_vl2.py
+4
-10
@@ -3,6 +3,7 @@
3
4
# adapted from https://github.com/deepseek-ai/DeepSeek-VL2/blob/faf18023f24b962b32d9f0a2d89e402a8d383a78/deepseek_vl2/models/modeling_deepseek_vl_v2.py#L115-L268
5
6
+from huggingface_hub.dataclasses import strict
7
from transformers import DeepseekV2Config, PretrainedConfig
8
9
@@ -87,16 +88,9 @@ class MlpProjectorConfig(PretrainedConfig):
88
super().__init__(**kwargs)
89
90
90
-if hasattr(DeepseekV2Config, "validate"):
91
- # Transformers v5
92
- from huggingface_hub.dataclasses import strict
93
-
94
- @strict
95
- class DeepseekVLV2TextConfig(DeepseekV2Config):
96
- kv_lora_rank: int | None = None
97
-else:
98
- # Transformers v4
99
- DeepseekVLV2TextConfig = DeepseekV2Config # type: ignore[misc]
91
+@strict
92
+class DeepseekVLV2TextConfig(DeepseekV2Config):
93
+ kv_lora_rank: int | None = None
94
95
96
class DeepseekVLV2Config(PretrainedConfig):
vllm/transformers_utils/configs/olmo_hybrid.py
+2
-9
@@ -228,15 +228,8 @@ class OlmoHybridConfig(PretrainedConfig):
228
if "full_attention" not in layer_types:
229
layer_types[-1] = "full_attention"
230
231
- if hasattr(self, "validate_layer_type"):
232
- # Transformers v5
233
- self.layer_types = layer_types
234
- self.validate_layer_type()
235
- else:
236
- # Transformers v4
237
- from transformers.configuration_utils import layer_type_validation
238
-
239
- layer_type_validation(layer_types, num_hidden_layers)
231
+ self.layer_types = layer_types
232
+ self.validate_layer_type()
233
if "linear_attention" not in layer_types:
234
raise ValueError(
235
"OLMoHybrid expects at least one 'linear_attention' layer."
vllm/transformers_utils/configs/qwen3_5.py
+5
-12
@@ -94,18 +94,11 @@ class Qwen3_5TextConfig(PretrainedConfig):
94
else "full_attention"
95
for i in range(self.num_hidden_layers)
96
]
97
- if hasattr(self, "validate_layer_type"):
98
- # Transformers v5
99
- kwargs["ignore_keys_at_rope_validation"] = {
100
- "mrope_section",
101
- "mrope_interleaved",
102
- }
103
- self.validate_layer_type()
104
- else:
105
- # Transformers v4
106
- from transformers.configuration_utils import layer_type_validation
107
-
108
- layer_type_validation(self.layer_types, self.num_hidden_layers)
97
+ kwargs["ignore_keys_at_rope_validation"] = {
98
+ "mrope_section",
99
+ "mrope_interleaved",
100
+ }
101
+ self.validate_layer_type()
102
103
# linear attention part
104
self.linear_conv_kernel_dim = linear_conv_kernel_dim
vllm/transformers_utils/configs/qwen3_5_moe.py
+5
-12
@@ -100,18 +100,11 @@ class Qwen3_5MoeTextConfig(PretrainedConfig):
100
else "full_attention"
101
for i in range(self.num_hidden_layers)
102
]
103
- if hasattr(self, "validate_layer_type"):
104
- # Transformers v5
105
- kwargs["ignore_keys_at_rope_validation"] = {
106
- "mrope_section",
107
- "mrope_interleaved",
108
- }
109
- self.validate_layer_type()
110
- else:
111
- # Transformers v4
112
- from transformers.configuration_utils import layer_type_validation
113
-
114
- layer_type_validation(self.layer_types, self.num_hidden_layers)
103
+ kwargs["ignore_keys_at_rope_validation"] = {
104
+ "mrope_section",
105
+ "mrope_interleaved",
106
+ }
107
+ self.validate_layer_type()
108
109
# linear attention part
110
self.linear_conv_kernel_dim = linear_conv_kernel_dim
vllm/transformers_utils/configs/qwen3_next.py
+1
-8
@@ -252,14 +252,7 @@ class Qwen3NextConfig(PretrainedConfig):
252
"linear_attention" if bool((i + 1) % 4) else "full_attention"
253
for i in range(self.num_hidden_layers)
254
]
255
- if hasattr(self, "validate_layer_type"):
256
- # Transformers v5
257
- self.validate_layer_type()
258
- else:
259
- # Transformers v4
260
- from transformers.configuration_utils import layer_type_validation
261
-
262
- layer_type_validation(self.layer_types)
255
+ self.validate_layer_type()
256
257
# linear attention part
258
self.linear_conv_kernel_dim = linear_conv_kernel_dim
vllm/transformers_utils/configs/speculators/base.py
+3
-6
@@ -1,7 +1,7 @@
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
import os
4
-from dataclasses import fields, is_dataclass
4
+from dataclasses import fields
5
from typing import Any
6
7
from transformers import PretrainedConfig
@@ -16,11 +16,8 @@ class SpeculatorsConfig(PretrainedConfig):
16
model_type = "speculators"
17
18
def __init__(self, **kwargs):
19
- # Transformers v4 - super().__init__ which sets all kwargs as attributes
20
- if not is_dataclass(PretrainedConfig):
21
- return super().__init__(**kwargs)
22
- # Transformers v5 - super().__init__ performs some validation before
23
- # setting all kwargs as attributes, so we set them first to be safe
19
+ # super().__init__ performs some validation before setting all kwargs as
20
+ # attributes, so we set them first to be safe
21
pre_trained_config_fields = {f.name for f in fields(PretrainedConfig)}
22
super_kwargs = dict()
23
for key, value in kwargs.items():
vllm/transformers_utils/processor.py
-4
@@ -59,10 +59,6 @@ def _transformers_v4_compatibility_init() -> Any:
59
60
This can be removed if `Molmo2ForConditionalGeneration` is upstreamed to
61
Transformers."""
62
- # Transformers v4
63
- if hasattr(ProcessorMixin, "optional_attributes"):
64
- return
65
- # Transformers v5
62
if hasattr(ProcessorMixin.__init__, "_vllm_patched"):
63
return
64
vllm/transformers_utils/processors/pixtral.py
-5
@@ -56,11 +56,6 @@ class MistralCommonPixtralProcessor(ProcessorMixin):
56
image_processor: MistralCommonImageProcessor,
57
) -> None:
58
self.tokenizer = tokenizer.transformers_tokenizer
59
-
60
- # Back-compatibility for Transformers v4
61
- if not hasattr(self.tokenizer, "init_kwargs"):
62
- self.tokenizer.init_kwargs = {}
63
-
59
self.image_processor = image_processor
60
61
image_special_ids = self.image_processor.mm_encoder.special_ids
vllm/transformers_utils/processors/voxtral.py
-5
@@ -111,11 +111,6 @@ class MistralCommonVoxtralProcessor(ProcessorMixin):
111
feature_extractor: MistralCommonFeatureExtractor,
112
) -> None:
113
self.tokenizer = tokenizer.transformers_tokenizer
114
-
115
- # Back-compatibility for Transformers v4
116
- if not hasattr(self.tokenizer, "init_kwargs"):
117
- self.tokenizer.init_kwargs = {}
118
-
114
self.feature_extractor = feature_extractor
115
116
audio_special_ids = self.feature_extractor.audio_encoder.special_ids