Bump Transformers version to 5.15.0 (#51668)

Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com>

Harry Mellor committed Aug 11, 2026 at 17:00 UTC c65aa2ee6cd8286ebe83615afdfab9b77d21f035
11 files changed +23 -17
requirements/test/cpu.txt
+1 -1
@@ -1169,7 +1169,7 @@ tqdm==4.67.3
1169 # segmentation-models-pytorch
1170 # sentence-transformers
1171 # transformers
1172 -transformers==5.14.1
1172 +transformers==5.15.0
1173 # via
1174 # -r requirements/test/../common.txt
1175 # -r requirements/test/cuda.in
requirements/test/cuda.in
+1 -1
@@ -39,7 +39,7 @@ open_clip_torch==2.32.0 # Required for nemotron_vl test, Nemotron Parse in test_
39 datamodel_code_generator # required for minicpm3 test
40 lm-eval[api]>=0.4.12 # required for model evaluation test
41 mteb[bm25s]>=2, <3 # required for mteb test
42 -transformers==5.14.1
42 +transformers==5.15.0
43 tokenizers==0.22.2
44 schemathesis>=4.0.0 # Required for openai schema test.
45 # quantization
requirements/test/cuda.txt
+1 -1
@@ -1272,7 +1272,7 @@ tqdm==4.67.3
1272 # segmentation-models-pytorch
1273 # sentence-transformers
1274 # transformers
1275 -transformers==5.14.1
1275 +transformers==5.15.0
1276 # via
1277 # -c requirements/common.txt
1278 # -r requirements/test/../common.txt
requirements/test/nightly-torch.txt
+1 -1
@@ -29,7 +29,7 @@ opencv-python-headless >= 4.13.0 # required for video test
29 datamodel_code_generator # required for minicpm3 test
30 lm-eval[api]>=0.4.12 # required for model evaluation test
31 mteb[bm25s]>=2, <3 # required for mteb test
32 -transformers==5.14.1
32 +transformers==5.15.0
33 tokenizers==0.22.2
34 schemathesis>=4.0.0 # Required for openai schema test.
35 # quantization
requirements/test/rocm.in
+1 -1
@@ -35,7 +35,7 @@ open_clip_torch==2.32.0 # Required for nemotron_vl test, Nemotron Parse in test_
35 datamodel_code_generator # required for minicpm3 test
36 lm-eval[api]>=0.4.12 # required for model evaluation test
37 mteb[bm25s]>=2, <3 # required for mteb test
38 -transformers==5.14.1
38 +transformers==5.15.0
39 tokenizers==0.22.2
40 schemathesis>=4.0.0 # Required for openai schema test
41 # quantization
requirements/test/rocm.txt
+1 -1
@@ -1222,7 +1222,7 @@ tqdm==4.67.3
1222 # sentence-transformers
1223 # tilelang
1224 # transformers
1225 -transformers==5.14.1
1225 +transformers==5.15.0
1226 # via
1227 # -c requirements/common.txt
1228 # -r requirements/test/../common.txt
requirements/test/xpu.in
+1 -1
@@ -17,7 +17,7 @@ accelerate
17 arctic-inference
18 lm_eval[api]>=0.4.12
19 modelscope<1.38
20 -transformers==5.14.1
20 +transformers==5.15.0
21
22 # --- Audio Processing ---
23 librosa
requirements/test/xpu.txt
+1 -1
@@ -940,7 +940,7 @@ tqdm==4.67.3
940 # pqdm
941 # sentence-transformers
942 # transformers
943 -transformers==5.14.1
943 +transformers==5.15.0
944 # via
945 # -c requirements/common.txt
946 # -r requirements/test/../common.txt
tests/config/test_model_arch_config.py
+5 -7
@@ -371,19 +371,17 @@ def test_gemma4_uniform_head_dims_are_homogeneous():
371
372
373 class _HeterogeneousConfig(PretrainedConfig):
374 - """A stand-in for the Transformers >= 5.15.0 heterogeneous config API.
374 + """A heterogeneous config with no convertor of its own.
375
376 - No released Transformers has it, so the default per-layer seam has no other
377 - way to be exercised. Mirrors the parts vLLM uses: per-layer configs are
378 - shallow copies with the varying attributes applied and heterogeneity
379 - stripped, so they do not recurse.
380 - """
376 + Mirrors the parts vLLM uses: per-layer configs are shallow copies with the
377 + varying attributes applied and heterogeneity stripped, so they do not recurse."""
378
379 is_heterogeneous = True
380
381 def __init__(self, per_layer: dict[str, list], **kwargs):
385 - super().__init__(**kwargs)
382 + # Set before `super().__init__` because it validates `per_layer_config`
383 self._per_layer = per_layer
384 + super().__init__(**kwargs)
385
386 @property
387 def per_layer_config(self) -> list[PretrainedConfig]:
tests/models/transformers/test_backend.py
+1 -1
@@ -151,7 +151,7 @@ def test_mla(vllm_runner: type[VllmRunner], example_prompts: list[str]) -> None:
151 f"transformers>={required}, but got {installed}"
152 )
153
154 - model = get_model("DeepseekV2ForCausalLM") # DeepSeek-V2-Lite, MLA + MoE
154 + model = "hmellor/tiny-random-DeepseekV2ForCausalLM"
155 args = (example_prompts, 32, 5)
156 kwargs: dict[str, Any] = {"max_model_len": 2048, "enforce_eager": True}
157
vllm/model_executor/models/transformers/multimodal.py
+9 -1
@@ -390,6 +390,14 @@ class MultiModalProcessor(BaseMultiModalProcessor[MultiModalProcessingInfo]):
390 mm_placeholders: dict[str, list[PlaceholderRange]] = {}
391 split_sizes = mm_tokens_per_modality["num_image_tokens"]
392 if split_sizes:
393 + image_token_ids = getattr(hf_processor, "image_token_ids", None)
394 + if image_token_ids is None:
395 + # Transformers <5.10.0
396 + image_token_ids = [hf_processor.image_token_id]
397 + image_token_ids = torch.tensor(
398 + [i for i in image_token_ids if i is not None]
399 + )
400 +
401 chunked_mm_positions = torch.split(mm_positions, split_sizes)
402 mm_tokens = torch.tensor(prompt_ids)[mm_token_type_ids[0].bool()]
403 chunked_mm_tokens = torch.split(mm_tokens, split_sizes)
@@ -397,7 +405,7 @@ class MultiModalProcessor(BaseMultiModalProcessor[MultiModalProcessingInfo]):
405 PlaceholderRange(
406 offset=positions[0].item(),
407 length=positions.shape[0],
400 - is_embed=(mm_tokens == hf_processor.image_token_id).bool(),
408 + is_embed=torch.isin(mm_tokens, image_token_ids),
409 )
410 for positions, mm_tokens in zip(chunked_mm_positions, chunked_mm_tokens)
411 ]