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
]