@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 18d87a87dc
Fork 0

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