[Multimodal] Type dummy options per modality (#57576)

Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com> Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>

Harry Mellor committed Sep 18, 2026 at 17:29 UTC 8a5cf5438728180210aea43897d6a717de4b46ec
93 files changed +461 -720
tests/models/multimodal/processing/test_audioflamingo3.py
+2 -1
@@ -25,6 +25,7 @@ import torch
25 from transformers import PretrainedConfig
26
27 from tests.models.registry import HF_EXAMPLE_MODELS
28 +from vllm.config.multimodal import MultiModalDummyOptions
29
30
31 class MockAudioFlamingo3Config(PretrainedConfig):
@@ -127,7 +128,7 @@ def test_dummy_data_generation(mock_ctx):
128 builder = AudioFlamingo3DummyInputsBuilder(info)
129
130 mm_counts = {"audio": 2}
130 - dummy_data = builder.get_dummy_mm_data(100, mm_counts, {})
131 + dummy_data = builder.get_dummy_mm_data(100, mm_counts, MultiModalDummyOptions())
132
133 assert "audio" in dummy_data
134 assert len(dummy_data["audio"]) == 2
tests/models/multimodal/processing/test_common.py
+9 -6
@@ -13,6 +13,7 @@ from vllm.config.multimodal import (
13 AudioDummyOptions,
14 BaseDummyOptions,
15 ImageDummyOptions,
16 + MultiModalDummyOptions,
17 VideoDummyOptions,
18 )
19 from vllm.inputs import MultiModalDataDict, MultiModalInput
@@ -174,7 +175,7 @@ def get_token_prompt(
175 inputs = dummy_inputs.get_dummy_processor_inputs(
176 model_config.max_model_len,
177 mm_counts,
177 - mm_options={},
178 + mm_options=MultiModalDummyOptions(),
179 # Assume all Mistral models define this extra argument
180 mm_data=mm_data, # type: ignore[call-arg]
181 )
@@ -182,7 +183,7 @@ def get_token_prompt(
183 inputs = dummy_inputs.get_dummy_processor_inputs(
184 model_config.max_model_len,
185 mm_counts,
185 - mm_options={},
186 + mm_options=MultiModalDummyOptions(),
187 )
188
189 if not isinstance(inputs.prompt, list):
@@ -278,10 +279,12 @@ def _test_processing_correctness(
279 return BaseDummyOptions(count=count)
280
281 # Assign normalized DummyOptions to the model config
281 - model_config.get_multimodal_config().limit_per_prompt = {
282 - modality: _to_dummy_options(modality, count)
283 - for modality, count in limit_mm_per_prompt_ints.items()
284 - }
282 + model_config.get_multimodal_config().limit_per_prompt = MultiModalDummyOptions(
283 + {
284 + modality: _to_dummy_options(modality, count)
285 + for modality, count in limit_mm_per_prompt_ints.items()
286 + }
287 + )
288
289 baseline_processor = factories.build_processor(ctx, cache=None)
290 cached_processor = factories.build_processor(ctx, cache=cache)
tests/models/multimodal/processing/test_molmo2.py
+4 -2
@@ -6,7 +6,7 @@ from types import SimpleNamespace
6 import pytest
7 import torch
8
9 -from vllm.config.multimodal import VideoDummyOptions
9 +from vllm.config.multimodal import MultiModalDummyOptions, VideoDummyOptions
10 from vllm.model_executor.models.molmo2 import (
11 Molmo2DummyInputsBuilder,
12 build_flat_image_bool_length,
@@ -83,7 +83,9 @@ def test_dummy_video_num_frames_override_honors_min_of_two(
83 data = builder.get_dummy_mm_data(
84 seq_len=128,
85 mm_counts={"image": 0, "video": 1},
86 - mm_options={"video": VideoDummyOptions(num_frames=num_frames_override)},
86 + mm_options=MultiModalDummyOptions(
87 + video=VideoDummyOptions(num_frames=num_frames_override)
88 + ),
89 )
90
91 video, _metadata = data["video"][0]
tests/models/multimodal/processing/test_qwen3_vl.py
+7 -2
@@ -12,6 +12,7 @@ import numpy as np
12 import pytest
13
14 from vllm.config import ModelConfig
15 +from vllm.config.multimodal import MultiModalDummyOptions
16 from vllm.multimodal import MULTIMODAL_REGISTRY
17
18 from ...registry import HF_EXAMPLE_MODELS
@@ -339,7 +340,9 @@ def test_dummy_video_spreads_budget_when_frame_cap_enabled(model_id: str) -> Non
340 limit_mm_per_prompt={"image": 0, "video": 1},
341 )
342 capped = MULTIMODAL_REGISTRY.create_processor(capped_ctx.model_config)
342 - capped_dummy = capped.dummy_inputs.get_dummy_mm_data(1024, {"video": 1}, {})
343 + capped_dummy = capped.dummy_inputs.get_dummy_mm_data(
344 + 1024, {"video": 1}, MultiModalDummyOptions()
345 + )
346 capped_frames = capped_dummy["video"][0][0].shape[0]
347 assert capped_frames == 16, (
348 f"Expected the dummy to spread the budget over 16 frames, got {capped_frames}"
@@ -351,7 +354,9 @@ def test_dummy_video_spreads_budget_when_frame_cap_enabled(model_id: str) -> Non
354 limit_mm_per_prompt={"image": 0, "video": 1},
355 )
356 uncapped = MULTIMODAL_REGISTRY.create_processor(uncapped_ctx.model_config)
354 - uncapped_dummy = uncapped.dummy_inputs.get_dummy_mm_data(1024, {"video": 1}, {})
357 + uncapped_dummy = uncapped.dummy_inputs.get_dummy_mm_data(
358 + 1024, {"video": 1}, MultiModalDummyOptions()
359 + )
360 uncapped_frames = uncapped_dummy["video"][0][0].shape[0]
361 assert uncapped_frames == 2, (
362 f"Expected the uncapped dummy to keep 2 frames, got {uncapped_frames}"
tests/models/multimodal/processing/test_tensor_schema.py
+8 -5
@@ -18,6 +18,7 @@ from vllm.config.multimodal import (
18 AudioDummyOptions,
19 BaseDummyOptions,
20 ImageDummyOptions,
21 + MultiModalDummyOptions,
22 VideoDummyOptions,
23 )
24 from vllm.distributed import (
@@ -98,7 +99,7 @@ def create_batched_mm_kwargs(
99 processor_inputs = dummy_inputs.get_dummy_processor_inputs(
100 seq_len=model_config.max_model_len,
101 mm_counts=mm_counts,
101 - mm_options={},
102 + mm_options=MultiModalDummyOptions(),
103 )
104 mm_items = processor_inputs.mm_data_items
105 resized_mm_data = {
@@ -248,10 +249,12 @@ def test_model_tensor_schema(model_id: str):
249 return AudioDummyOptions(count=count)
250 return BaseDummyOptions(count=count)
251
251 - model_config.get_multimodal_config().limit_per_prompt = {
252 - modality: _to_dummy_options(modality, count)
253 - for modality, count in limit_mm_per_prompt.items()
254 - }
252 + model_config.get_multimodal_config().limit_per_prompt = MultiModalDummyOptions(
253 + {
254 + modality: _to_dummy_options(modality, count)
255 + for modality, count in limit_mm_per_prompt.items()
256 + }
257 + )
258 processor = factories.build_processor(ctx, cache=None)
259
260 with initialize_dummy_model(model_cls, model_config) as model:
vllm/config/multimodal.py
+57 -22
@@ -3,11 +3,18 @@
3
4 from collections.abc import Mapping
5 from pathlib import Path
6 -from typing import Any, Literal, TypeAlias, TypedDict, final
6 +from typing import Any, Literal, TypeAlias, TypeVar, final, overload
7
8 import torch
9 -from pydantic import ConfigDict, Field, field_validator, model_validator
9 +from pydantic import (
10 + ConfigDict,
11 + Field,
12 + GetCoreSchemaHandler,
13 + field_validator,
14 + model_validator,
15 +)
16 from pydantic.dataclasses import dataclass
17 +from pydantic_core import core_schema
18
19 import vllm.envs as envs
20 from vllm.config.ec_transfer import ECTransferConfig
@@ -18,6 +25,8 @@ from vllm.v1.attention.backends.registry import AttentionBackendEnum
25
26 logger = init_logger(__name__)
27
28 +_T = TypeVar("_T")
29 +
30
31 @dataclass
32 class BaseDummyOptions:
@@ -51,17 +60,50 @@ class AudioDummyOptions(BaseDummyOptions):
60
61
62 @final
54 -class MultiModalDummyOptionsBuiltins(TypedDict, total=False):
55 - """Type annotations for modality types predefined by vLLM."""
63 +class MultiModalDummyOptions(dict[str, BaseDummyOptions]):
64 + """Dummy data options for each modality.
65 +
66 + Lookups of the modalities predefined by vLLM return their own options
67 + class, while any other modality returns
68 + [`BaseDummyOptions`][vllm.config.multimodal.BaseDummyOptions].
69 + """
70 +
71 + @overload # type: ignore[override]
72 + def get(self, key: Literal["image"], /) -> ImageDummyOptions | None: ...
73 +
74 + @overload
75 + def get(self, key: Literal["image"], default: _T, /) -> ImageDummyOptions | _T: ...
76 +
77 + @overload
78 + def get(self, key: Literal["video"], /) -> VideoDummyOptions | None: ...
79 +
80 + @overload
81 + def get(self, key: Literal["video"], default: _T, /) -> VideoDummyOptions | _T: ...
82 +
83 + @overload
84 + def get(self, key: Literal["audio"], /) -> AudioDummyOptions | None: ...
85
57 - image: ImageDummyOptions
58 - """Options for dummy images."""
86 + @overload
87 + def get(self, key: Literal["audio"], default: _T, /) -> AudioDummyOptions | _T: ...
88
60 - video: VideoDummyOptions
61 - """Options for dummy videos."""
89 + @overload
90 + def get(self, key: str, /) -> BaseDummyOptions | None: ...
91
63 - audio: AudioDummyOptions
64 - """Options for dummy audios."""
92 + @overload
93 + def get(self, key: str, default: _T, /) -> BaseDummyOptions | _T: ...
94 +
95 + def get(self, key: str, default: object = None, /) -> object:
96 + return super().get(key, default)
97 +
98 + @classmethod
99 + def __get_pydantic_core_schema__(
100 + cls,
101 + source_type: Any,
102 + handler: GetCoreSchemaHandler,
103 + ) -> core_schema.CoreSchema:
104 + return core_schema.no_info_after_validator_function(
105 + cls, handler.generate_schema(dict[str, BaseDummyOptions])
106 + )
107
108
109 MMEncoderTPMode = Literal["weights", "data"]
@@ -75,15 +117,6 @@ MMProcessorDevice: TypeAlias = str
117 `"xpu"` on XPU). Validated against that set by the CLI."""
118
119
78 -MMDummyOptions: TypeAlias = dict[str, BaseDummyOptions]
79 -"""
80 -A dictionary containing an entry for each modality type of dummy data.
81 -
82 -The built-in modalities are defined by
83 -[`MultiModalDummyOptionsBuiltins`][vllm.config.multimodal.MultiModalDummyOptionsBuiltins].
84 -"""
85 -
86 -
120 @config
121 class MultiModalConfig:
122 """Controls the behavior of multimodal models."""
@@ -91,7 +124,9 @@ class MultiModalConfig:
124 language_model_only: bool = False
125 """If True, disables all multimodal inputs by setting all modality limits to 0.
126 Equivalent to setting `--limit-mm-per-prompt` to 0 for every modality."""
94 - limit_per_prompt: MMDummyOptions = Field(default_factory=dict)
127 + limit_per_prompt: MultiModalDummyOptions = Field(
128 + default_factory=MultiModalDummyOptions
129 + )
130 """The maximum number of input items and options allowed per
131 prompt for each modality.
132
@@ -257,8 +292,8 @@ class MultiModalConfig:
292 def _validate_limit_per_prompt(
293 cls,
294 value: dict[str, int | dict[str, int]],
260 - ) -> MMDummyOptions:
261 - out: MMDummyOptions = {}
295 + ) -> MultiModalDummyOptions:
296 + out = MultiModalDummyOptions()
297
298 for k, v in value.items():
299 # Handle legacy format where only count is specified
vllm/engine/arg_utils.py
+15
@@ -22,6 +22,7 @@ from typing import (
22 cast,
23 get_args,
24 get_origin,
25 + is_typeddict,
26 )
27
28 import huggingface_hub
@@ -183,6 +184,18 @@ def is_type(type_hint: TypeHint, type: TypeHintT) -> TypeIs[TypeHintT]:
184 return type_hint is type or get_origin(type_hint) is type
185
186
187 +def is_dict_subclass(type_hint: TypeHint) -> bool:
188 + """Check if the type hint is a subclass of `dict`.
189 +
190 + `TypedDict`s are excluded because they do not support class checks.
191 + """
192 + return (
193 + isinstance(type_hint, type)
194 + and not is_typeddict(type_hint)
195 + and issubclass(type_hint, dict)
196 + )
197 +
198 +
199 def contains_type(type_hints: set[TypeHint], type: TypeHintT) -> bool:
200 """Check if the type hints contain a specific type."""
201 return any(is_type(type_hint, type) for type_hint in type_hints)
@@ -305,6 +318,8 @@ def _compute_kwargs(cls: ConfigType) -> dict[str, dict[str, Any]]:
318 for field in fields(cls):
319 # Get the set of possible types for the field
320 type_hints: set[TypeHint] = get_type_hints(field.type)
321 + # Subclasses of dict (e.g. MultiModalDummyOptions) are CLI dicts
322 + type_hints = {dict if is_dict_subclass(th) else th for th in type_hints}
323
324 # If the field is a dataclass, we can use the model_validate_json
325 generator = (th for th in type_hints if is_dataclass(th))
vllm/model_executor/models/aria.py
+4 -8
@@ -10,7 +10,7 @@ from transformers.models.aria.modeling_aria import AriaCrossAttention
10 from transformers.models.aria.processing_aria import AriaProcessor
11
12 from vllm.config import VllmConfig
13 -from vllm.config.multimodal import BaseDummyOptions, ImageDummyOptions
13 +from vllm.config.multimodal import MultiModalDummyOptions
14 from vllm.inputs import MultiModalDataDict
15 from vllm.model_executor.layers.activation import get_act_fn
16 from vllm.model_executor.layers.fused_moe import FusedMoEFactory
@@ -315,22 +315,18 @@ class AriaDummyInputsBuilder(BaseDummyInputsBuilder[AriaProcessingInfo]):
315 self,
316 seq_len: int,
317 mm_counts: Mapping[str, int],
318 - mm_options: Mapping[str, BaseDummyOptions],
318 + mm_options: MultiModalDummyOptions,
319 ) -> MultiModalDataDict:
320 vision_config = self.info.get_vision_config()
321
322 max_image_size = vision_config.image_size
323 - num_images = mm_counts.get("image", 0)
324 -
325 - image_overrides = mm_options.get("image")
326 - assert image_overrides is None or isinstance(image_overrides, ImageDummyOptions)
323
324 return {
325 "image": self._get_dummy_images(
326 width=max_image_size,
327 height=max_image_size,
332 - num_images=num_images,
333 - overrides=image_overrides,
328 + num_images=mm_counts.get("image", 0),
329 + overrides=mm_options.get("image"),
330 )
331 }
332
vllm/model_executor/models/audioflamingo3.py
+4 -7
@@ -30,7 +30,7 @@ from transformers.models.audioflamingo3 import (
30 from transformers.models.qwen2_audio import Qwen2AudioEncoder
31
32 from vllm.config import VllmConfig
33 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
33 +from vllm.config.multimodal import MultiModalDummyOptions
34 from vllm.inputs import ModalityData, MultiModalDataDict
35 from vllm.model_executor.layers.activation import get_act_fn
36 from vllm.model_executor.models.module_mapping import MultiModelKeys
@@ -216,21 +216,18 @@ class AudioFlamingo3DummyInputsBuilder(
216 self,
217 seq_len: int,
218 mm_counts: Mapping[str, int],
219 - mm_options: Mapping[str, BaseDummyOptions],
219 + mm_options: MultiModalDummyOptions,
220 ) -> MultiModalDataDict:
221 hf_processor = self.info.get_hf_processor()
222 feature_extractor = self.info.get_feature_extractor()
223 sampling_rate = feature_extractor.sampling_rate
224 audio_len = int(hf_processor.max_audio_len * sampling_rate)
225 - num_audios = mm_counts.get("audio", 0)
226 - audio_overrides = mm_options.get("audio")
227 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
225
226 return {
227 "audio": self._get_dummy_audios(
228 length=audio_len,
232 - num_audios=num_audios,
233 - overrides=audio_overrides,
229 + num_audios=mm_counts.get("audio", 0),
230 + overrides=mm_options.get("audio"),
231 )
232 }
233
vllm/model_executor/models/bagel.py
+4 -7
@@ -14,7 +14,7 @@ import torch
14 import torch.nn as nn
15
16 from vllm.config import VllmConfig
17 -from vllm.config.multimodal import BaseDummyOptions, ImageDummyOptions
17 +from vllm.config.multimodal import MultiModalDummyOptions
18 from vllm.inputs import MultiModalDataDict
19 from vllm.logger import init_logger
20 from vllm.model_executor.layers.activation import get_act_fn
@@ -248,23 +248,20 @@ class BagelDummyInputsBuilder(BaseDummyInputsBuilder[BagelProcessingInfo]):
248 self,
249 seq_len: int,
250 mm_counts: Mapping[str, int],
251 - mm_options: Mapping[str, BaseDummyOptions],
251 + mm_options: MultiModalDummyOptions,
252 ) -> MultiModalDataDict:
253 - num_images = mm_counts.get("image", 0)
253 hf_config = self.info.get_hf_config()
254 vit_config = hf_config.vit_config
255
256 # Use the configured image size
257 image_size = vit_config.image_size
259 - image_overrides = mm_options.get("image")
260 - assert image_overrides is None or isinstance(image_overrides, ImageDummyOptions)
258
259 return {
260 "image": self._get_dummy_images(
261 width=image_size,
262 height=image_size,
266 - num_images=num_images,
267 - overrides=image_overrides,
263 + num_images=mm_counts.get("image", 0),
264 + overrides=mm_options.get("image"),
265 ),
266 }
267
vllm/model_executor/models/bailing_moe_v3_vl.py
+2 -2
@@ -13,7 +13,7 @@ import torch.nn as nn
13 from transformers import AutoProcessor, BatchFeature
14
15 from vllm.config import VllmConfig
16 -from vllm.config.multimodal import BaseDummyOptions
16 +from vllm.config.multimodal import MultiModalDummyOptions
17 from vllm.inputs import MultiModalDataDict
18 from vllm.model_executor.layers.linear import (
19 ColumnParallelLinear,
@@ -103,7 +103,7 @@ class BailingMoeV3VLDummyInputsBuilder(
103 self,
104 seq_len: int,
105 mm_counts: Mapping[str, int],
106 - mm_options: Mapping[str, BaseDummyOptions],
106 + mm_options: MultiModalDummyOptions,
107 ) -> MultiModalDataDict:
108 target_width, target_height = self.info.get_image_size_with_most_features()
109 return {
vllm/model_executor/models/bee.py
+4 -9
@@ -8,7 +8,7 @@ import torch.nn as nn
8 from transformers.activations import GELUActivation
9
10 from vllm.config import VllmConfig
11 -from vllm.config.multimodal import BaseDummyOptions, ImageDummyOptions
11 +from vllm.config.multimodal import MultiModalDummyOptions
12 from vllm.inputs import MultiModalDataDict
13 from vllm.multimodal import MULTIMODAL_REGISTRY
14
@@ -90,21 +90,16 @@ class BeeDummyInputsBuilder(LlavaDummyInputsBuilder[BeeProcessingInfo]):
90 self,
91 seq_len: int,
92 mm_counts: Mapping[str, int],
93 - mm_options: Mapping[str, BaseDummyOptions],
93 + mm_options: MultiModalDummyOptions,
94 ) -> MultiModalDataDict:
95 - num_images = mm_counts.get("image", 0)
96 -
95 target_width, target_height = self.info.get_image_size_with_most_features()
96
99 - image_overrides = mm_options.get("image")
100 - assert image_overrides is None or isinstance(image_overrides, ImageDummyOptions)
101 -
97 return {
98 "image": self._get_dummy_images(
99 width=target_width,
100 height=target_height,
106 - num_images=num_images,
107 - overrides=image_overrides,
101 + num_images=mm_counts.get("image", 0),
102 + overrides=mm_options.get("image"),
103 ),
104 }
105
vllm/model_executor/models/blip2.py
+4 -8
@@ -15,7 +15,7 @@ from transformers import (
15 )
16
17 from vllm.config import CacheConfig, VllmConfig
18 -from vllm.config.multimodal import BaseDummyOptions, ImageDummyOptions
18 +from vllm.config.multimodal import MultiModalDummyOptions
19 from vllm.inputs import MultiModalDataDict
20 from vllm.model_executor.layers.activation import get_act_fn
21 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -444,23 +444,19 @@ class Blip2DummyInputsBuilder(BaseDummyInputsBuilder[Blip2ProcessingInfo]):
444 self,
445 seq_len: int,
446 mm_counts: Mapping[str, int],
447 - mm_options: Mapping[str, BaseDummyOptions],
447 + mm_options: MultiModalDummyOptions,
448 ) -> MultiModalDataDict:
449 hf_config = self.info.get_hf_config()
450 vision_config = hf_config.vision_config
451
452 max_image_size = vision_config.image_size
453 - num_images = mm_counts.get("image", 0)
454 -
455 - image_overrides = mm_options.get("image")
456 - assert image_overrides is None or isinstance(image_overrides, ImageDummyOptions)
453
454 return {
455 "image": self._get_dummy_images(
456 width=max_image_size,
457 height=max_image_size,
462 - num_images=num_images,
463 - overrides=image_overrides,
458 + num_images=mm_counts.get("image", 0),
459 + overrides=mm_options.get("image"),
460 )
461 }
462
vllm/model_executor/models/clip.py
+4 -8
@@ -15,7 +15,7 @@ from transformers import (
15 )
16
17 from vllm.config import VllmConfig
18 -from vllm.config.multimodal import BaseDummyOptions
18 +from vllm.config.multimodal import MultiModalDummyOptions
19 from vllm.distributed import divide, get_tensor_model_parallel_world_size
20 from vllm.inputs import MultiModalDataDict, MultiModalInput
21 from vllm.model_executor.layers.activation import get_act_fn
@@ -205,20 +205,16 @@ class CLIPDummyInputsBuilder(BaseDummyInputsBuilder[CLIPProcessingInfo]):
205 self,
206 seq_len: int,
207 mm_counts: Mapping[str, int],
208 - mm_options: Mapping[str, BaseDummyOptions],
208 + mm_options: MultiModalDummyOptions,
209 ) -> MultiModalDataDict:
210 - num_images = mm_counts.get("image", 0)
211 -
210 target_width, target_height = self.info.get_image_size_with_most_features()
211
214 - image_overrides = mm_options.get("image")
215 -
212 return {
213 "image": self._get_dummy_images(
214 width=target_width,
215 height=target_height,
220 - num_images=num_images,
221 - overrides=image_overrides,
216 + num_images=mm_counts.get("image", 0),
217 + overrides=mm_options.get("image"),
218 )
219 }
220
vllm/model_executor/models/cohere2_vision.py
+4 -7
@@ -18,7 +18,7 @@ from transformers.models.cohere2_vision.processing_cohere2_vision import (
18 )
19
20 from vllm.config import VllmConfig
21 -from vllm.config.multimodal import BaseDummyOptions
21 +from vllm.config.multimodal import MultiModalDummyOptions
22 from vllm.inputs import MultiModalDataDict
23 from vllm.model_executor.layers.activation import MulAndSilu
24 from vllm.model_executor.layers.linear import (
@@ -202,19 +202,16 @@ class Cohere2VisionDummyInputsBuilder(
202 self,
203 seq_len: int,
204 mm_counts: Mapping[str, int],
205 - mm_options: Mapping[str, BaseDummyOptions],
205 + mm_options: MultiModalDummyOptions,
206 ) -> MultiModalDataDict:
207 - num_images = mm_counts.get("image", 0)
207 image_size = self.info.get_image_size_with_most_features()
208
210 - image_overrides = mm_options.get("image")
211 -
209 return {
210 "image": self._get_dummy_images(
211 width=image_size.width,
212 height=image_size.height,
216 - num_images=num_images,
217 - overrides=image_overrides,
213 + num_images=mm_counts.get("image", 0),
214 + overrides=mm_options.get("image"),
215 )
216 }
217
vllm/model_executor/models/cohere_asr.py
+2 -2
@@ -12,7 +12,7 @@ from transformers import PretrainedConfig
12
13 from vllm.compilation.decorators import support_torch_compile
14 from vllm.config import CacheConfig, ModelConfig, SpeechToTextConfig, VllmConfig
15 -from vllm.config.multimodal import BaseDummyOptions
15 +from vllm.config.multimodal import MultiModalDummyOptions
16 from vllm.config.speech_to_text import SpeechToTextParams
17 from vllm.distributed import get_tensor_model_parallel_world_size
18 from vllm.inputs import MultiModalDataDict, PromptType, TokensPrompt
@@ -1944,7 +1944,7 @@ class CohereASRDummyInputsBuilder(BaseDummyInputsBuilder[CohereASRProcessingInfo
1944 self,
1945 seq_len: int,
1946 mm_counts: Mapping[str, int],
1947 - mm_options: Mapping[str, BaseDummyOptions],
1947 + mm_options: MultiModalDummyOptions,
1948 mm_processor_kwargs=None,
1949 ) -> MultiModalDataDict:
1950 feature_extractor = self.info.get_feature_extractor()
vllm/model_executor/models/cohere_compass.py
+4 -7
@@ -51,7 +51,7 @@ from transformers.models.cohere_compass.image_processing_cohere_compass import (
51
52 from vllm.compilation.decorators import support_torch_compile
53 from vllm.config import CacheConfig, VllmConfig
54 -from vllm.config.multimodal import BaseDummyOptions
54 +from vllm.config.multimodal import MultiModalDummyOptions
55 from vllm.distributed import (
56 get_pp_group,
57 get_tensor_model_parallel_world_size,
@@ -1238,11 +1238,8 @@ class CohereCompassDummyInputsBuilder(
1238 self,
1239 seq_len: int,
1240 mm_counts: Mapping[str, int],
1241 - mm_options: Mapping[str, BaseDummyOptions],
1241 + mm_options: MultiModalDummyOptions,
1242 ) -> MultiModalDataDict:
1243 - num_images = mm_counts.get("image", 0)
1244 - image_overrides = mm_options.get("image")
1245 -
1243 target_image_width, target_image_height = (
1244 self.info.get_image_size_with_most_features()
1245 )
@@ -1251,8 +1248,8 @@ class CohereCompassDummyInputsBuilder(
1248 "image": self._get_dummy_images(
1249 width=target_image_width,
1250 height=target_image_height,
1254 - num_images=num_images,
1255 - overrides=image_overrides,
1251 + num_images=mm_counts.get("image", 0),
1252 + overrides=mm_options.get("image"),
1253 ),
1254 }
1255
vllm/model_executor/models/colmodernvbert.py
+4 -6
@@ -15,7 +15,7 @@ from torch import nn
15 from transformers import BatchFeature
16
17 from vllm.config import VllmConfig
18 -from vllm.config.multimodal import BaseDummyOptions
18 +from vllm.config.multimodal import MultiModalDummyOptions
19 from vllm.inputs import MultiModalDataDict
20 from vllm.model_executor.layers.pooler.tokwise import pooler_for_token_embed
21 from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -135,18 +135,16 @@ class ColModernVBertDummyInputsBuilder(
135 self,
136 seq_len: int,
137 mm_counts: Mapping[str, int],
138 - mm_options: Mapping[str, BaseDummyOptions],
138 + mm_options: MultiModalDummyOptions,
139 ) -> MultiModalDataDict:
140 - num_images = mm_counts.get("image", 0)
140 target_width, target_height = self.info.get_image_size_with_most_features()
142 - image_overrides = mm_options.get("image")
141
142 return {
143 "image": self._get_dummy_images(
144 width=target_width,
145 height=target_height,
148 - num_images=num_images,
149 - overrides=image_overrides,
146 + num_images=mm_counts.get("image", 0),
147 + overrides=mm_options.get("image"),
148 )
149 }
150
vllm/model_executor/models/deepseek_ocr.py
+3 -5
@@ -11,7 +11,7 @@ import torch.nn as nn
11 from transformers import BatchFeature, CLIPVisionConfig
12
13 from vllm.config import VllmConfig
14 -from vllm.config.multimodal import BaseDummyOptions
14 +from vllm.config.multimodal import MultiModalDummyOptions
15 from vllm.inputs import MultiModalDataDict
16 from vllm.model_executor.models.interfaces import (
17 MultiModalEmbeddings,
@@ -268,17 +268,15 @@ class DeepseekOCRDummyInputsBuilder(BaseDummyInputsBuilder[DeepseekOCRProcessing
268 self,
269 seq_len: int,
270 mm_counts: Mapping[str, int],
271 - mm_options: Mapping[str, BaseDummyOptions],
271 + mm_options: MultiModalDummyOptions,
272 ) -> MultiModalDataDict:
273 - num_images = mm_counts.get("image", 0)
274 -
273 max_image_size = self.info.get_image_size_with_most_features()
274
275 return {
276 "image": self._get_dummy_images(
277 width=max_image_size.width,
278 height=max_image_size.height,
281 - num_images=num_images,
279 + num_images=mm_counts.get("image", 0),
280 )
281 }
282
vllm/model_executor/models/deepseek_ocr2.py
+3 -5
@@ -11,7 +11,7 @@ import torch.nn as nn
11 from transformers import BatchFeature
12
13 from vllm.config import VllmConfig
14 -from vllm.config.multimodal import BaseDummyOptions
14 +from vllm.config.multimodal import MultiModalDummyOptions
15 from vllm.inputs import MultiModalDataDict
16 from vllm.model_executor.models.interfaces import (
17 MultiModalEmbeddings,
@@ -140,17 +140,15 @@ class DeepseekOCR2DummyInputsBuilder(
140 self,
141 seq_len: int,
142 mm_counts: Mapping[str, int],
143 - mm_options: Mapping[str, BaseDummyOptions],
143 + mm_options: MultiModalDummyOptions,
144 ) -> MultiModalDataDict:
145 - num_images = mm_counts.get("image", 0)
146 -
145 max_image_size = self.info.get_image_size_with_most_features()
146
147 return {
148 "image": self._get_dummy_images(
149 width=max_image_size.width,
150 height=max_image_size.height,
153 - num_images=num_images,
151 + num_images=mm_counts.get("image", 0),
152 )
153 }
154
vllm/model_executor/models/deepseek_vl2.py
+4 -8
@@ -15,7 +15,7 @@ from einops import rearrange, repeat
15 from transformers import BatchFeature
16
17 from vllm.config import VllmConfig
18 -from vllm.config.multimodal import BaseDummyOptions
18 +from vllm.config.multimodal import MultiModalDummyOptions
19 from vllm.distributed import get_tensor_model_parallel_world_size
20 from vllm.inputs import MultiModalDataDict
21 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -212,20 +212,16 @@ class DeepseekVL2DummyInputsBuilder(BaseDummyInputsBuilder[DeepseekVL2Processing
212 self,
213 seq_len: int,
214 mm_counts: Mapping[str, int],
215 - mm_options: Mapping[str, BaseDummyOptions],
215 + mm_options: MultiModalDummyOptions,
216 ) -> MultiModalDataDict:
217 - num_images = mm_counts.get("image", 0)
218 -
217 max_image_size = self.info.get_image_size_with_most_features()
218
221 - image_overrides = mm_options.get("image")
222 -
219 return {
220 "image": self._get_dummy_images(
221 width=max_image_size.width,
222 height=max_image_size.height,
227 - num_images=num_images,
228 - overrides=image_overrides,
223 + num_images=mm_counts.get("image", 0),
224 + overrides=mm_options.get("image"),
225 )
226 }
227
vllm/model_executor/models/dots_ocr.py
+4 -8
@@ -9,7 +9,7 @@ from torch.nn import LayerNorm
9 from transformers.models.qwen2_vl import Qwen2VLProcessor
10
11 from vllm.config import VllmConfig
12 -from vllm.config.multimodal import BaseDummyOptions
12 +from vllm.config.multimodal import MultiModalDummyOptions
13 from vllm.distributed import utils as dist_utils
14 from vllm.distributed.parallel_state import (
15 get_tensor_model_parallel_rank,
@@ -104,20 +104,16 @@ class DotsOCRDummyInputsBuilder(Qwen2VLDummyInputsBuilder):
104 self,
105 seq_len: int,
106 mm_counts: Mapping[str, int],
107 - mm_options: Mapping[str, BaseDummyOptions],
107 + mm_options: MultiModalDummyOptions,
108 ) -> MultiModalDataDict:
109 - num_images = mm_counts.get("image", 0)
110 -
109 target_width, target_height = self.info.get_image_size_with_most_features()
110
113 - image_overrides = mm_options.get("image")
114 -
111 return {
112 "image": self._get_dummy_images(
113 width=target_width,
114 height=target_height,
119 - num_images=num_images,
120 - overrides=image_overrides,
115 + num_images=mm_counts.get("image", 0),
116 + overrides=mm_options.get("image"),
117 ),
118 }
119
vllm/model_executor/models/ernie45_vl.py
+6 -13
@@ -36,7 +36,7 @@ from einops import rearrange
36 from transformers import BaseImageProcessor, BatchFeature
37
38 from vllm.config import VllmConfig
39 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
39 +from vllm.config.multimodal import MultiModalDummyOptions, VideoDummyOptions
40 from vllm.distributed import parallel_state
41 from vllm.distributed import utils as dist_utils
42 from vllm.inputs import MultiModalDataDict
@@ -1276,33 +1276,26 @@ class Ernie4_5_VLDummyInputsBuilder(BaseDummyInputsBuilder[Ernie4_5_VLProcessing
1276 self,
1277 seq_len: int,
1278 mm_counts: Mapping[str, int],
1279 - mm_options: Mapping[str, BaseDummyOptions],
1279 + mm_options: MultiModalDummyOptions,
1280 ) -> MultiModalDataDict:
1281 - num_images = mm_counts.get("image", 0)
1282 - num_videos = mm_counts.get("video", 0)
1283 -
1281 target_width, target_height = self.info.get_image_size_with_most_features()
1282 target_num_frames = self.info.get_num_frames_with_most_features(
1283 seq_len, mm_counts
1284 )
1285
1289 - image_overrides = mm_options.get("image")
1290 - video_overrides = mm_options.get("video")
1291 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
1292 -
1286 return {
1287 "image": self._get_dummy_images(
1288 width=target_width,
1289 height=target_height,
1297 - num_images=num_images,
1298 - overrides=image_overrides,
1290 + num_images=mm_counts.get("image", 0),
1291 + overrides=mm_options.get("image"),
1292 ),
1293 "video": self._get_dummy_videos(
1294 width=target_width,
1295 height=target_height,
1296 num_frames=target_num_frames,
1304 - num_videos=num_videos,
1305 - overrides=video_overrides,
1297 + num_videos=mm_counts.get("video", 0),
1298 + overrides=mm_options.get("video"),
1299 ),
1300 }
1301
vllm/model_executor/models/fireredasr2.py
+5 -7
@@ -12,7 +12,7 @@ from transformers import (
12 )
13
14 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
15 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
15 +from vllm.config.multimodal import MultiModalDummyOptions
16 from vllm.config.speech_to_text import SpeechToTextParams
17 from vllm.inputs import MultiModalDataDict, PromptType
18 from vllm.logger import init_logger
@@ -207,20 +207,18 @@ class FireRedASR2DummyInputsBuilder(BaseDummyInputsBuilder[FireRedASR2Processing
207 self,
208 seq_len: int,
209 mm_counts: Mapping[str, int],
210 - mm_options: Mapping[str, BaseDummyOptions],
210 + mm_options: MultiModalDummyOptions,
211 ) -> MultiModalDataDict:
212 feature_extractor = self.info.get_feature_extractor()
213
214 sampling_rate = feature_extractor.sampling_rate
215 audio_len = feature_extractor.chunk_length * sampling_rate
216 - num_audios = mm_counts.get("audio", 0)
217 -
218 - audio_overrides = mm_options.get("audio")
219 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
216
217 ret = {
218 "audio": self._get_dummy_audios(
223 - length=audio_len, num_audios=num_audios, overrides=audio_overrides
219 + length=audio_len,
220 + num_audios=mm_counts.get("audio", 0),
221 + overrides=mm_options.get("audio"),
222 )
223 }
224 return ret
vllm/model_executor/models/funasr.py
+4 -8
@@ -14,7 +14,7 @@ from transformers import (
14 )
15
16 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
17 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
17 +from vllm.config.multimodal import MultiModalDummyOptions
18 from vllm.config.speech_to_text import SpeechToTextParams
19 from vllm.distributed import get_tensor_model_parallel_world_size
20 from vllm.inputs import MultiModalDataDict, PromptType
@@ -734,22 +734,18 @@ class FunASRDummyInputsBuilder(BaseDummyInputsBuilder[FunASRProcessingInfo]):
734 self,
735 seq_len: int,
736 mm_counts: Mapping[str, int],
737 - mm_options: Mapping[str, BaseDummyOptions],
737 + mm_options: MultiModalDummyOptions,
738 ) -> MultiModalDataDict:
739 feature_extractor = self.info.get_feature_extractor()
740
741 sampling_rate = feature_extractor.sampling_rate
742 audio_len = feature_extractor.chunk_length * sampling_rate
743 - num_audios = mm_counts.get("audio", 0)
744 -
745 - audio_overrides = mm_options.get("audio")
746 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
743
744 return {
745 "audio": self._get_dummy_audios(
746 length=audio_len,
751 - num_audios=num_audios,
752 - overrides=audio_overrides,
747 + num_audios=mm_counts.get("audio", 0),
748 + overrides=mm_options.get("audio"),
749 ),
750 }
751
vllm/model_executor/models/funaudiochat.py
+4 -7
@@ -26,7 +26,7 @@ from transformers.feature_extraction_utils import BatchFeature
26 from transformers.modeling_outputs import BaseModelOutput
27
28 from vllm.config import VllmConfig
29 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
29 +from vllm.config.multimodal import MultiModalDummyOptions
30 from vllm.inputs import MultiModalDataDict
31 from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
32 from vllm.model_executor.layers.linear import QKVParallelLinear, RowParallelLinear
@@ -580,7 +580,7 @@ class FunAudioChatDummyInputsBuilder(
580 self,
581 seq_len: int,
582 mm_counts: Mapping[str, int],
583 - mm_options: Mapping[str, BaseDummyOptions],
583 + mm_options: MultiModalDummyOptions,
584 ) -> MultiModalDataDict:
585 feature_extractor = self.info.get_feature_extractor()
586 sampling_rate = int(feature_extractor.sampling_rate)
@@ -597,15 +597,12 @@ class FunAudioChatDummyInputsBuilder(
597 1,
598 (target_num_frames * sampling_rate + token_fps - 1) // token_fps,
599 )
600 - num_audios = int(mm_counts.get("audio", 0))
600
602 - audio_overrides = mm_options.get("audio")
603 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
601 return {
602 "audio": self._get_dummy_audios(
603 length=audio_len,
607 - num_audios=num_audios,
608 - overrides=audio_overrides,
604 + num_audios=int(mm_counts.get("audio", 0)),
605 + overrides=mm_options.get("audio"),
606 )
607 }
608
vllm/model_executor/models/gemma3_mm.py
+4 -8
@@ -11,7 +11,7 @@ from transformers.models.gemma3.image_processing_gemma3 import Gemma3ImageProces
11 from transformers.models.gemma3.processing_gemma3 import Gemma3ProcessorKwargs
12
13 from vllm.config import VllmConfig
14 -from vllm.config.multimodal import BaseDummyOptions
14 +from vllm.config.multimodal import MultiModalDummyOptions
15 from vllm.inputs import MultiModalDataDict
16 from vllm.logger import init_logger
17 from vllm.model_executor.layers.layernorm import GemmaRMSNorm
@@ -244,20 +244,16 @@ class Gemma3DummyInputsBuilder(BaseDummyInputsBuilder[Gemma3ProcessingInfo]):
244 self,
245 seq_len: int,
246 mm_counts: Mapping[str, int],
247 - mm_options: Mapping[str, BaseDummyOptions],
247 + mm_options: MultiModalDummyOptions,
248 ) -> MultiModalDataDict:
249 - num_images = mm_counts.get("image", 0)
250 -
249 target_width, target_height = self.info.get_image_size_with_most_features()
250
253 - image_overrides = mm_options.get("image")
254 -
251 return {
252 "image": self._get_dummy_images(
253 width=target_width,
254 height=target_height,
259 - num_images=num_images,
260 - overrides=image_overrides,
255 + num_images=mm_counts.get("image", 0),
256 + overrides=mm_options.get("image"),
257 )
258 }
259
vllm/model_executor/models/gemma3n_mm.py
+6 -12
@@ -18,7 +18,7 @@ from transformers.models.gemma3n import (
18 from transformers.models.siglip import SiglipImageProcessorFast
19
20 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
21 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
21 +from vllm.config.multimodal import MultiModalDummyOptions
22 from vllm.config.speech_to_text import SpeechToTextParams
23 from vllm.inputs import MultiModalDataDict, PromptType, TextPrompt
24 from vllm.logger import init_logger
@@ -232,10 +232,8 @@ class Gemma3nDummyInputsBuilder(BaseDummyInputsBuilder[Gemma3nProcessingInfo]):
232 self,
233 seq_len: int,
234 mm_counts: Mapping[str, int],
235 - mm_options: Mapping[str, BaseDummyOptions],
235 + mm_options: MultiModalDummyOptions,
236 ) -> MultiModalDataDict:
237 - num_images = mm_counts.get("image", 0)
238 - num_audios = mm_counts.get("audio", 0)
237 processor = self.info.get_hf_processor()
238 audio_feature_extractor: Gemma3nAudioFeatureExtractor = (
239 processor.feature_extractor
@@ -245,21 +243,17 @@ class Gemma3nDummyInputsBuilder(BaseDummyInputsBuilder[Gemma3nProcessingInfo]):
243 img_width = image_processor.size.get("width", 224)
244 img_height = image_processor.size.get("height", 224)
245
248 - image_overrides = mm_options.get("image")
249 - audio_overrides = mm_options.get("audio")
250 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
251 -
246 return {
247 "image": self._get_dummy_images(
248 width=img_width,
249 height=img_height,
256 - num_images=num_images,
257 - overrides=image_overrides,
250 + num_images=mm_counts.get("image", 0),
251 + overrides=mm_options.get("image"),
252 ),
253 "audio": self._get_dummy_audios(
254 length=audio_len,
261 - num_audios=num_audios,
262 - overrides=audio_overrides,
255 + num_audios=mm_counts.get("audio", 0),
256 + overrides=mm_options.get("audio"),
257 ),
258 }
259
vllm/model_executor/models/gemma4_mm.py
+7 -21
@@ -36,11 +36,7 @@ from transformers.models.gemma4.configuration_gemma4 import (
36
37 from vllm.config import VllmConfig
38 from vllm.config.model import get_served_model_name
39 -from vllm.config.multimodal import (
40 - AudioDummyOptions,
41 - BaseDummyOptions,
42 - VideoDummyOptions,
43 -)
39 +from vllm.config.multimodal import MultiModalDummyOptions, VideoDummyOptions
40 from vllm.inputs import MultiModalDataDict
41 from vllm.logger import init_logger
42 from vllm.model_executor.layers.layernorm import RMSNorm
@@ -273,10 +269,7 @@ class Gemma4ProcessingInfo(BaseProcessingInfo):
269 num_frames = _VIDEO_MAX_FRAMES
270 mm_config = self.ctx.model_config.get_multimodal_config()
271 video_opts = mm_config.limit_per_prompt.get("video")
276 - if (
277 - isinstance(video_opts, VideoDummyOptions)
278 - and video_opts.num_frames is not None
279 - ):
272 + if video_opts is not None and video_opts.num_frames is not None:
273 num_frames = min(num_frames, video_opts.num_frames)
274 tokens["video"] = num_frames * (_VIDEO_MAX_SOFT_TOKENS + 2 + 6)
275 return tokens
@@ -502,9 +495,8 @@ class Gemma4DummyInputsBuilder(BaseDummyInputsBuilder[Gemma4ProcessingInfo]):
495 self,
496 seq_len: int,
497 mm_counts: Mapping[str, int],
505 - mm_options: Mapping[str, BaseDummyOptions] | None = None,
498 + mm_options: MultiModalDummyOptions | None = None,
499 ) -> MultiModalDataDict:
507 - num_images = mm_counts.get("image", 0)
500 num_audios = mm_counts.get("audio", 0)
501 num_videos = mm_counts.get("video", 0)
502 processor = self.info.get_hf_processor()
@@ -517,18 +509,12 @@ class Gemma4DummyInputsBuilder(BaseDummyInputsBuilder[Gemma4ProcessingInfo]):
509 img_width = size.get("width", 224)
510 img_height = size.get("height", 224)
511
520 - image_overrides = mm_options.get("image") if mm_options else None
521 - audio_overrides = mm_options.get("audio") if mm_options else None
522 - video_overrides = mm_options.get("video") if mm_options else None
523 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
524 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
525 -
512 data: dict[str, Any] = {
513 "image": self._get_dummy_images(
514 width=img_width,
515 height=img_height,
530 - num_images=num_images,
531 - overrides=image_overrides,
516 + num_images=mm_counts.get("image", 0),
517 + overrides=mm_options.get("image") if mm_options else None,
518 ),
519 }
520
@@ -537,7 +523,7 @@ class Gemma4DummyInputsBuilder(BaseDummyInputsBuilder[Gemma4ProcessingInfo]):
523 data["audio"] = self._get_dummy_audios(
524 length=audio_len,
525 num_audios=num_audios,
540 - overrides=audio_overrides,
526 + overrides=mm_options.get("audio") if mm_options else None,
527 )
528
529 if num_videos > 0:
@@ -546,7 +532,7 @@ class Gemma4DummyInputsBuilder(BaseDummyInputsBuilder[Gemma4ProcessingInfo]):
532 height=img_height,
533 num_frames=_VIDEO_MAX_FRAMES,
534 num_videos=num_videos,
549 - overrides=video_overrides,
535 + overrides=mm_options.get("video") if mm_options else None,
536 )
537
538 return data
vllm/model_executor/models/gemma4_unified.py
+1 -5
@@ -28,7 +28,6 @@ from transformers.models.gemma4_unified.processing_gemma4_unified import (
28 )
29
30 from vllm.config import VllmConfig
31 -from vllm.config.multimodal import VideoDummyOptions
31 from vllm.model_executor.layers.linear import ColumnParallelLinear
32 from vllm.model_executor.models.gemma3n_mm import batch_audio_features
33 from vllm.model_executor.models.gemma4 import Gemma4ForCausalLM
@@ -177,10 +176,7 @@ class Gemma4UnifiedProcessingInfo(Gemma4ProcessingInfo):
176 num_frames = _VIDEO_MAX_FRAMES
177 mm_config = self.ctx.model_config.get_multimodal_config()
178 video_opts = mm_config.limit_per_prompt.get("video")
180 - if (
181 - isinstance(video_opts, VideoDummyOptions)
182 - and video_opts.num_frames is not None
183 - ):
179 + if video_opts is not None and video_opts.num_frames is not None:
180 num_frames = min(num_frames, video_opts.num_frames)
181 tokens["video"] = num_frames * (_VIDEO_MAX_SOFT_TOKENS + 2 + 6)
182 return tokens
vllm/model_executor/models/glm4_1v.py
+6 -13
@@ -52,7 +52,7 @@ from transformers.video_processing_utils import BaseVideoProcessor
52 from transformers.video_utils import VideoMetadata
53
54 from vllm.config import VllmConfig
55 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
55 +from vllm.config.multimodal import MultiModalDummyOptions, VideoDummyOptions
56 from vllm.distributed import get_tensor_model_parallel_world_size, parallel_state
57 from vllm.distributed import utils as dist_utils
58 from vllm.inputs import MultiModalDataDict
@@ -1455,33 +1455,26 @@ class Glm4vDummyInputsBuilder(BaseDummyInputsBuilder[Glm4vProcessingInfo]):
1455 self,
1456 seq_len: int,
1457 mm_counts: Mapping[str, int],
1458 - mm_options: Mapping[str, BaseDummyOptions],
1458 + mm_options: MultiModalDummyOptions,
1459 ) -> MultiModalDataDict:
1460 - num_images = mm_counts.get("image", 0)
1461 - num_videos = mm_counts.get("video", 0)
1462 -
1460 target_width, target_height = self.info.get_image_size_with_most_features()
1461 target_num_frames = self.info.get_num_frames_with_most_features(
1462 seq_len, mm_counts
1463 )
1464
1468 - image_overrides = mm_options.get("image")
1469 - video_overrides = mm_options.get("video")
1470 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
1471 -
1465 return {
1466 "image": self._get_dummy_images(
1467 width=target_width,
1468 height=target_height,
1476 - num_images=num_images,
1477 - overrides=image_overrides,
1469 + num_images=mm_counts.get("image", 0),
1470 + overrides=mm_options.get("image"),
1471 ),
1472 "video": self._get_dummy_videos(
1473 width=target_width,
1474 height=target_height,
1475 num_frames=target_num_frames,
1483 - num_videos=num_videos,
1484 - overrides=video_overrides,
1476 + num_videos=mm_counts.get("video", 0),
1477 + overrides=mm_options.get("video"),
1478 ),
1479 }
1480
vllm/model_executor/models/glm4v.py
+4 -7
@@ -16,7 +16,7 @@ from torch.nn import LayerNorm
16 from transformers import BatchFeature
17
18 from vllm.config import VllmConfig
19 -from vllm.config.multimodal import BaseDummyOptions
19 +from vllm.config.multimodal import MultiModalDummyOptions
20 from vllm.distributed import get_tensor_model_parallel_world_size
21 from vllm.inputs import MultiModalDataDict
22 from vllm.model_executor.layers.activation import SiluAndMul, get_act_fn
@@ -445,22 +445,19 @@ class GLM4VDummyInputsBuilder(BaseDummyInputsBuilder[GLM4VProcessingInfo]):
445 self,
446 seq_len: int,
447 mm_counts: Mapping[str, int],
448 - mm_options: Mapping[str, BaseDummyOptions],
448 + mm_options: MultiModalDummyOptions,
449 ) -> MultiModalDataDict:
450 hf_config = self.info.get_hf_config()
451 vision_config = hf_config.vision_config
452
453 target_width = target_height = vision_config["image_size"]
454 - num_images = mm_counts.get("image", 0)
455 -
456 - image_overrides = mm_options.get("image")
454
455 return {
456 "image": self._get_dummy_images(
457 width=target_width,
458 height=target_height,
462 - num_images=num_images,
463 - overrides=image_overrides,
459 + num_images=mm_counts.get("image", 0),
460 + overrides=mm_options.get("image"),
461 )
462 }
463
vllm/model_executor/models/glmasr.py
+4 -7
@@ -11,7 +11,7 @@ from transformers.models.glmasr import GlmAsrConfig, GlmAsrProcessor
11 from transformers.models.whisper import WhisperFeatureExtractor
12
13 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
14 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
14 +from vllm.config.multimodal import MultiModalDummyOptions
15 from vllm.config.speech_to_text import SpeechToTextParams
16 from vllm.distributed.parallel_state import get_tensor_model_parallel_world_size
17 from vllm.inputs import ModalityData, MultiModalDataDict, PromptType, TokensPrompt
@@ -694,13 +694,10 @@ class GlmAsrDummyInputsBuilder(BaseDummyInputsBuilder[GlmAsrProcessingInfo]):
694 self,
695 seq_len: int,
696 mm_counts: Mapping[str, int],
697 - mm_options: Mapping[str, BaseDummyOptions],
697 + mm_options: MultiModalDummyOptions,
698 ) -> MultiModalDataDict:
699 feature_extractor = self.info.get_feature_extractor()
700 sampling_rate = feature_extractor.sampling_rate
701 - num_audios = mm_counts.get("audio", 0)
702 - audio_overrides = mm_options.get("audio")
703 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
701
702 max_audio_len = getattr(
703 self.info.get_hf_processor(), "max_audio_len", DEFAULT_MAX_AUDIO_LEN_S
@@ -710,8 +707,8 @@ class GlmAsrDummyInputsBuilder(BaseDummyInputsBuilder[GlmAsrProcessingInfo]):
707 return {
708 "audio": self._get_dummy_audios(
709 length=audio_len,
713 - num_audios=num_audios,
714 - overrides=audio_overrides,
710 + num_audios=mm_counts.get("audio", 0),
711 + overrides=mm_options.get("audio"),
712 )
713 }
714
vllm/model_executor/models/granite_speech.py
+4 -8
@@ -34,7 +34,7 @@ from torch import nn
34 from transformers import BatchFeature, PretrainedConfig
35
36 from vllm.config import CacheConfig, ModelConfig, SpeechToTextConfig, VllmConfig
37 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
37 +from vllm.config.multimodal import MultiModalDummyOptions
38 from vllm.config.speech_to_text import SpeechToTextParams
39 from vllm.inputs import MultiModalDataDict, PromptType, TokensPrompt
40 from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
@@ -208,17 +208,13 @@ class GraniteSpeechDummyInputsBuilder(
208 self,
209 seq_len: int,
210 mm_counts: Mapping[str, int],
211 - mm_options: Mapping[str, BaseDummyOptions],
211 + mm_options: MultiModalDummyOptions,
212 ) -> MultiModalDataDict:
213 - num_audios = mm_counts.get("audio", 0)
214 - audio_overrides = mm_options.get("audio")
215 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
216 -
213 return {
214 "audio": self._get_dummy_audios(
215 length=self.info.get_max_audio_len(),
220 - num_audios=num_audios,
221 - overrides=audio_overrides,
216 + num_audios=mm_counts.get("audio", 0),
217 + overrides=mm_options.get("audio"),
218 )
219 }
220
vllm/model_executor/models/hyperclovax_vision_v2.py
+7 -13
@@ -18,7 +18,7 @@ import torch.nn as nn
18 from transformers import BatchFeature
19
20 from vllm.config import VllmConfig
21 -from vllm.config.multimodal import BaseDummyOptions
21 +from vllm.config.multimodal import MultiModalDummyOptions
22 from vllm.forward_context import set_forward_context
23 from vllm.inputs import MultiModalDataDict
24 from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -193,7 +193,7 @@ class HCXVisionV2DummyInputsBuilder(BaseDummyInputsBuilder[HCXVisionV2Processing
193 self,
194 seq_len: int,
195 mm_counts: Mapping[str, int],
196 - mm_options: Mapping[str, BaseDummyOptions] | None = None,
196 + mm_options: MultiModalDummyOptions | None = None,
197 mm_processor_kwargs: Mapping[str, object] | None = None,
198 ) -> ProcessorInputs:
199 """Build dummy processor inputs for memory profiling."""
@@ -225,31 +225,25 @@ class HCXVisionV2DummyInputsBuilder(BaseDummyInputsBuilder[HCXVisionV2Processing
225 self,
226 seq_len: int,
227 mm_counts: Mapping[str, int],
228 - mm_options: Mapping[str, BaseDummyOptions] | None = None,
228 + mm_options: MultiModalDummyOptions | None = None,
229 mm_processor_kwargs: Mapping[str, object] | None = None,
230 ) -> MultiModalDataDict:
231 - num_images = mm_counts.get("image", 0)
232 - num_videos = mm_counts.get("video", 0)
233 -
231 target_width, target_height = self.info.get_image_size_with_most_features()
232 target_num_frames = 16 # Default for video
233
237 - image_overrides = mm_options.get("image") if mm_options else None
238 - video_overrides = mm_options.get("video") if mm_options else None
239 -
234 result: MultiModalDataDict = {
235 "image": self._get_dummy_images(
236 width=target_width,
237 height=target_height,
244 - num_images=num_images,
245 - overrides=image_overrides, # type: ignore
238 + num_images=mm_counts.get("image", 0),
239 + overrides=mm_options.get("image") if mm_options else None,
240 ),
241 "video": self._get_dummy_videos(
242 width=target_width,
243 height=target_height,
244 num_frames=target_num_frames,
251 - num_videos=num_videos,
252 - overrides=video_overrides, # type: ignore
245 + num_videos=mm_counts.get("video", 0),
246 + overrides=mm_options.get("video") if mm_options else None,
247 ),
248 }
249
vllm/model_executor/models/idefics3.py
+4 -7
@@ -29,7 +29,7 @@ from transformers import (
29 )
30
31 from vllm.config import VllmConfig
32 -from vllm.config.multimodal import BaseDummyOptions
32 +from vllm.config.multimodal import MultiModalDummyOptions
33 from vllm.inputs import MultiModalDataDict
34 from vllm.model_executor.layers.linear import ReplicatedLinear
35 from vllm.model_executor.layers.logits_processor import LogitsProcessor
@@ -221,21 +221,18 @@ class Idefics3DummyInputsBuilder(BaseDummyInputsBuilder[Idefics3ProcessingInfo])
221 self,
222 seq_len: int,
223 mm_counts: Mapping[str, int],
224 - mm_options: Mapping[str, BaseDummyOptions],
224 + mm_options: MultiModalDummyOptions,
225 ) -> MultiModalDataDict:
226 - num_images = mm_counts.get("image", 0)
226 hf_processor = self.info.get_hf_processor()
227 image_processor: Idefics3ImageProcessor = hf_processor.image_processor
228 longest_edge = image_processor.max_image_size["longest_edge"]
229
231 - image_overrides = mm_options.get("image")
232 -
230 return {
231 "image": self._get_dummy_images(
232 width=longest_edge,
233 height=longest_edge,
237 - num_images=num_images,
238 - overrides=image_overrides,
234 + num_images=mm_counts.get("image", 0),
235 + overrides=mm_options.get("image"),
236 )
237 }
238
vllm/model_executor/models/interns1.py
+6 -12
@@ -22,7 +22,7 @@ from transformers.models.internvl.video_processing_internvl import (
22 )
23
24 from vllm.config import VllmConfig
25 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
25 +from vllm.config.multimodal import MultiModalDummyOptions
26 from vllm.inputs import MultiModalDataDict
27 from vllm.model_executor.layers.quantization import QuantizationConfig
28 from vllm.model_executor.models.interns1_vit import InternS1VisionModel
@@ -299,35 +299,29 @@ class InternS1DummyInputsBuilder(BaseDummyInputsBuilder[InternS1ProcessingInfo])
299 self,
300 seq_len: int,
301 mm_counts: Mapping[str, int],
302 - mm_options: Mapping[str, BaseDummyOptions],
302 + mm_options: MultiModalDummyOptions,
303 ) -> MultiModalDataDict:
304 target_width, target_height = self.info.get_image_size_with_most_features()
305 target_num_frames = self.info.get_num_frames_with_most_features(
306 seq_len, mm_counts
307 )
308 - num_images = mm_counts.get("image", 0)
309 - num_videos = mm_counts.get("video", 0)
308
309 config = self.info.get_hf_config()
310 image_size_h, image_size_w = config.vision_config.image_size
311
314 - image_overrides = mm_options.get("image")
315 - video_overrides = mm_options.get("video")
316 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
317 -
312 return {
313 "image": self._get_dummy_images(
314 width=target_width,
315 height=target_height,
322 - num_images=num_images,
323 - overrides=image_overrides,
316 + num_images=mm_counts.get("image", 0),
317 + overrides=mm_options.get("image"),
318 ),
319 "video": self._get_dummy_videos(
320 width=image_size_w,
321 height=image_size_h,
322 num_frames=target_num_frames,
329 - num_videos=num_videos,
330 - overrides=video_overrides,
323 + num_videos=mm_counts.get("video", 0),
324 + overrides=mm_options.get("video"),
325 ),
326 }
327
vllm/model_executor/models/internvl.py
+5 -11
@@ -17,7 +17,7 @@ import torch.nn as nn
17 from transformers import BatchFeature, PretrainedConfig
18
19 from vllm.config import VllmConfig
20 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
20 +from vllm.config.multimodal import MultiModalDummyOptions
21 from vllm.inputs import MultiModalDataDict
22 from vllm.model_executor.layers.quantization import QuantizationConfig
23 from vllm.model_executor.layers.quantization.auto_awq import AutoAWQConfig
@@ -203,19 +203,16 @@ class BaseInternVLDummyInputsBuilder(BaseDummyInputsBuilder[_I]):
203 self,
204 seq_len: int,
205 mm_counts: Mapping[str, int],
206 - mm_options: Mapping[str, BaseDummyOptions],
206 + mm_options: MultiModalDummyOptions,
207 ) -> MultiModalDataDict:
208 target_width, target_height = self.info.get_image_size_with_most_features()
209 - num_images = mm_counts.get("image", 0)
210 -
211 - image_overrides = mm_options.get("image")
209
210 return {
211 "image": self._get_dummy_images(
212 width=target_width,
213 height=target_height,
217 - num_images=num_images,
218 - overrides=image_overrides,
214 + num_images=mm_counts.get("image", 0),
215 + overrides=mm_options.get("image"),
216 )
217 }
218
@@ -425,7 +422,7 @@ class InternVLDummyInputsBuilder(
422 self,
423 seq_len: int,
424 mm_counts: Mapping[str, int],
428 - mm_options: Mapping[str, BaseDummyOptions],
425 + mm_options: MultiModalDummyOptions,
426 ) -> MultiModalDataDict:
427 dummy_image = super().get_dummy_mm_data(seq_len, mm_counts, mm_options)
428 if self.info.ctx_video_token:
@@ -436,9 +433,6 @@ class InternVLDummyInputsBuilder(
433 )
434 num_videos = mm_counts.get("video", 0)
435 video_overrides = mm_options.get("video")
439 - assert video_overrides is None or isinstance(
440 - video_overrides, VideoDummyOptions
441 - )
436 dummy_video = {
437 "video": self._get_dummy_videos(
438 width=image_size,
vllm/model_executor/models/isaac.py
+4 -7
@@ -13,7 +13,7 @@ from einops import rearrange
13 from transformers.image_processing_utils import BatchFeature
14
15 from vllm.config import ModelConfig, VllmConfig
16 -from vllm.config.multimodal import BaseDummyOptions
16 +from vllm.config.multimodal import MultiModalDummyOptions
17 from vllm.distributed import parallel_state
18 from vllm.distributed import utils as dist_utils
19 from vllm.inputs import MultiModalDataDict
@@ -386,19 +386,16 @@ class IsaacDummyInputsBuilder(BaseDummyInputsBuilder[IsaacProcessingInfo]):
386 self,
387 seq_len: int,
388 mm_counts: Mapping[str, int],
389 - mm_options: Mapping[str, BaseDummyOptions],
389 + mm_options: MultiModalDummyOptions,
390 ) -> MultiModalDataDict:
391 - num_images = mm_counts.get("image", 0)
392 -
391 target_width, target_height = self.info.get_image_size_with_most_features()
394 - image_overrides = mm_options.get("image")
392
393 return {
394 "image": self._get_dummy_images(
395 width=target_width,
396 height=target_height,
400 - num_images=num_images,
401 - overrides=image_overrides,
397 + num_images=mm_counts.get("image", 0),
398 + overrides=mm_options.get("image"),
399 ),
400 }
401
vllm/model_executor/models/kanana_v.py
+2 -2
@@ -18,7 +18,7 @@ from transformers.modeling_outputs import BaseModelOutput
18 from transformers.models.qwen2_vl.configuration_qwen2_vl import Qwen2VLVisionConfig
19
20 from vllm.config import VllmConfig
21 -from vllm.config.multimodal import BaseDummyOptions
21 +from vllm.config.multimodal import MultiModalDummyOptions
22 from vllm.inputs import MultiModalDataDict
23 from vllm.logger import init_logger
24 from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -442,7 +442,7 @@ class KananaVDummyInputsBuilder(BaseDummyInputsBuilder[KananaVProcessingInfo]):
442 self,
443 seq_len: int,
444 mm_counts: Mapping[str, int],
445 - mm_options: Mapping[str, BaseDummyOptions],
445 + mm_options: MultiModalDummyOptions,
446 ) -> MultiModalDataDict:
447 num_images = mm_counts.get("image", 0)
448 return {
vllm/model_executor/models/keye.py
+6 -12
@@ -17,7 +17,7 @@ from transformers.modeling_outputs import BaseModelOutput, BaseModelOutputWithPo
17 from transformers.utils import torch_int
18
19 from vllm.config import VllmConfig
20 -from vllm.config.multimodal import BaseDummyOptions
20 +from vllm.config.multimodal import MultiModalDummyOptions
21 from vllm.distributed import get_tensor_model_parallel_world_size
22 from vllm.inputs import ModalityData, MultiModalDataDict
23 from vllm.logger import init_logger
@@ -1124,30 +1124,24 @@ class KeyeBaseDummyInputsBuilder(BaseDummyInputsBuilder[_I]):
1124 self,
1125 seq_len: int,
1126 mm_counts: Mapping[str, int],
1127 - mm_options: Mapping[str, BaseDummyOptions],
1127 + mm_options: MultiModalDummyOptions,
1128 ) -> MultiModalDataDict:
1129 - num_images = mm_counts.get("image", 0)
1130 - num_videos = mm_counts.get("video", 0)
1131 -
1129 target_width, target_height = self.info.get_image_size_with_most_features()
1130 target_num_frames = self.info.get_num_frames_with_most_features(seq_len)
1131
1135 - image_overrides = mm_options.get("image")
1136 - video_overrides = mm_options.get("video")
1137 -
1132 mm_data = {
1133 "image": self._get_dummy_images(
1134 width=target_width,
1135 height=target_height,
1142 - num_images=num_images,
1143 - overrides=image_overrides,
1136 + num_images=mm_counts.get("image", 0),
1137 + overrides=mm_options.get("image"),
1138 ),
1139 "video": self._get_dummy_videos(
1140 width=target_width,
1141 height=target_height,
1142 num_frames=target_num_frames,
1149 - num_videos=num_videos,
1150 - overrides=video_overrides,
1143 + num_videos=mm_counts.get("video", 0),
1144 + overrides=mm_options.get("video"),
1145 ),
1146 }
1147
vllm/model_executor/models/kimi_audio.py
+2 -2
@@ -13,7 +13,7 @@ from transformers import BatchFeature
13 from transformers import WhisperConfig as HFWhisperConfig
14
15 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
16 -from vllm.config.multimodal import BaseDummyOptions
16 +from vllm.config.multimodal import MultiModalDummyOptions
17 from vllm.config.speech_to_text import SpeechToTextParams
18 from vllm.inputs import PromptType, TokensPrompt
19 from vllm.model_executor.model_loader import DefaultModelLoader
@@ -180,7 +180,7 @@ class KimiAudioDummyInputsBuilder(BaseDummyInputsBuilder[KimiAudioProcessingInfo
180 self,
181 seq_len: int,
182 mm_counts: Mapping[str, int],
183 - mm_options: Mapping[str, BaseDummyOptions],
183 + mm_options: MultiModalDummyOptions,
184 ) -> ProcessorInputs:
185 dummy_mm_data = self.get_dummy_mm_data(seq_len, mm_counts, mm_options)
186 dummy_mm_items = self.info.parse_mm_data(dummy_mm_data)
vllm/model_executor/models/kimi_k25.py
+2 -2
@@ -14,7 +14,7 @@ from torch import nn
14 from transformers import BatchFeature
15
16 from vllm.config import VllmConfig
17 -from vllm.config.multimodal import BaseDummyOptions
17 +from vllm.config.multimodal import MultiModalDummyOptions
18 from vllm.inputs import MultiModalDataDict
19 from vllm.logger import init_logger
20 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -216,7 +216,7 @@ class KimiK25DummyInputsBuilder(BaseDummyInputsBuilder[KimiK25ProcessingInfo]):
216 self,
217 seq_len: int,
218 mm_counts: Mapping[str, int],
219 - mm_options: Mapping[str, BaseDummyOptions],
219 + mm_options: MultiModalDummyOptions,
220 ) -> MultiModalDataDict:
221 # TODO: Support mm_options for vision_chunk to allow user configuration
222 dummy_items = self.get_dummy_mm_items()
vllm/model_executor/models/kimi_vl.py
+4 -8
@@ -53,7 +53,7 @@ from transformers import BatchFeature
53 from transformers.activations import GELUActivation
54
55 from vllm.config import VllmConfig
56 -from vllm.config.multimodal import BaseDummyOptions
56 +from vllm.config.multimodal import MultiModalDummyOptions
57 from vllm.inputs import MultiModalDataDict
58 from vllm.model_executor.layers.linear import ReplicatedLinear
59 from vllm.model_executor.models.interfaces import (
@@ -219,18 +219,14 @@ class KimiVLDummyInputsBuilder(BaseDummyInputsBuilder[KimiVLProcessingInfo]):
219 self,
220 seq_len: int,
221 mm_counts: Mapping[str, int],
222 - mm_options: Mapping[str, BaseDummyOptions],
222 + mm_options: MultiModalDummyOptions,
223 ) -> MultiModalDataDict:
224 - num_images = mm_counts.get("image", 0)
225 -
226 - image_overrides = mm_options.get("image")
227 -
224 return {
225 "image": self._get_dummy_images(
226 width=MaxImageTokenMeta.width,
227 height=MaxImageTokenMeta.height,
232 - num_images=num_images,
233 - overrides=image_overrides,
228 + num_images=mm_counts.get("image", 0),
229 + overrides=mm_options.get("image"),
230 )
231 }
232
vllm/model_executor/models/lfm2_vl.py
+4 -8
@@ -21,7 +21,7 @@ from transformers.models.lfm2_vl.image_processing_lfm2_vl_fast import (
21 from typing_extensions import Buffer
22
23 from vllm.config import VllmConfig
24 -from vllm.config.multimodal import BaseDummyOptions
24 +from vllm.config.multimodal import MultiModalDummyOptions
25 from vllm.forward_context import set_forward_context
26 from vllm.inputs import MultiModalDataDict
27 from vllm.model_executor.layers.linear import ReplicatedLinear
@@ -387,20 +387,16 @@ class Lfm2VLDummyInputsBuilder(BaseDummyInputsBuilder[Lfm2VLProcessingInfo]):
387 self,
388 seq_len: int,
389 mm_counts: Mapping[str, int],
390 - mm_options: Mapping[str, BaseDummyOptions],
390 + mm_options: MultiModalDummyOptions,
391 ) -> MultiModalDataDict:
392 - num_images = mm_counts.get("image", 0)
393 -
392 target_width, target_height = self.info.get_image_size_with_most_features()
393
396 - image_overrides = mm_options.get("image")
397 -
394 return {
395 "image": self._get_dummy_images(
396 width=target_width,
397 height=target_height,
402 - num_images=num_images,
403 - overrides=image_overrides,
398 + num_images=mm_counts.get("image", 0),
399 + overrides=mm_options.get("image"),
400 ),
401 }
402
vllm/model_executor/models/llava.py
+4 -8
@@ -19,7 +19,7 @@ from transformers.models.llava import LlavaProcessor
19 from transformers.models.pixtral import PixtralProcessor
20
21 from vllm.config import VllmConfig
22 -from vllm.config.multimodal import BaseDummyOptions
22 +from vllm.config.multimodal import MultiModalDummyOptions
23 from vllm.inputs import MultiModalDataDict
24 from vllm.model_executor.layers.activation import get_act_fn
25 from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
@@ -228,20 +228,16 @@ class LlavaDummyInputsBuilder(BaseDummyInputsBuilder[_I]):
228 self,
229 seq_len: int,
230 mm_counts: Mapping[str, int],
231 - mm_options: Mapping[str, BaseDummyOptions],
231 + mm_options: MultiModalDummyOptions,
232 ) -> MultiModalDataDict:
233 - num_images = mm_counts.get("image", 0)
234 -
233 target_width, target_height = self.info.get_image_size_with_most_features()
234
237 - image_overrides = mm_options.get("image")
238 -
235 return {
236 "image": self._get_dummy_images(
237 width=target_width,
238 height=target_height,
243 - num_images=num_images,
244 - overrides=image_overrides,
239 + num_images=mm_counts.get("image", 0),
240 + overrides=mm_options.get("image"),
241 )
242 }
243
vllm/model_executor/models/llava_next_video.py
+4 -9
@@ -10,7 +10,7 @@ import torch.nn as nn
10 from transformers import BatchFeature, LlavaNextVideoConfig, LlavaNextVideoProcessor
11
12 from vllm.config import VllmConfig
13 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
13 +from vllm.config.multimodal import MultiModalDummyOptions
14 from vllm.inputs import MultiModalDataDict
15 from vllm.model_executor.layers.activation import get_act_fn
16 from vllm.model_executor.models.clip import CLIPVisionModel
@@ -171,25 +171,20 @@ class LlavaNextVideoDummyInputsBuilder(
171 self,
172 seq_len: int,
173 mm_counts: Mapping[str, int],
174 - mm_options: Mapping[str, BaseDummyOptions],
174 + mm_options: MultiModalDummyOptions,
175 ) -> MultiModalDataDict:
176 - num_videos = mm_counts.get("video", 0)
177 -
176 target_width, target_height = self.info.get_image_size_with_most_features()
177 target_num_frames = self.info.get_num_frames_with_most_features(
178 seq_len, mm_counts
179 )
180
183 - video_overrides = mm_options.get("video")
184 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
185 -
181 return {
182 "video": self._get_dummy_videos(
183 width=target_width,
184 height=target_height,
185 num_frames=target_num_frames,
191 - num_videos=num_videos,
192 - overrides=video_overrides,
186 + num_videos=mm_counts.get("video", 0),
187 + overrides=mm_options.get("video"),
188 )
189 }
190
vllm/model_executor/models/llava_onevision.py
+6 -13
@@ -14,7 +14,7 @@ from transformers.models.llava_onevision.modeling_llava_onevision import (
14 )
15
16 from vllm.config import VllmConfig
17 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
17 +from vllm.config.multimodal import MultiModalDummyOptions
18 from vllm.inputs import MultiModalDataDict
19 from vllm.model_executor.layers.activation import get_act_fn
20 from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -278,33 +278,26 @@ class LlavaOnevisionDummyInputsBuilder(
278 self,
279 seq_len: int,
280 mm_counts: Mapping[str, int],
281 - mm_options: Mapping[str, BaseDummyOptions],
281 + mm_options: MultiModalDummyOptions,
282 ) -> MultiModalDataDict:
283 - num_images = mm_counts.get("image", 0)
284 - num_videos = mm_counts.get("video", 0)
285 -
283 target_width, target_height = self.info.get_image_size_with_most_features()
284 target_num_frames = self.info.get_num_frames_with_most_features(
285 seq_len, mm_counts
286 )
287
291 - image_overrides = mm_options.get("image")
292 - video_overrides = mm_options.get("video")
293 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
294 -
288 return {
289 "image": self._get_dummy_images(
290 width=target_width,
291 height=target_height,
299 - num_images=num_images,
300 - overrides=image_overrides,
292 + num_images=mm_counts.get("image", 0),
293 + overrides=mm_options.get("image"),
294 ),
295 "video": self._get_dummy_videos(
296 width=target_width,
297 height=target_height,
298 num_frames=target_num_frames,
306 - num_videos=num_videos,
307 - overrides=video_overrides,
299 + num_videos=mm_counts.get("video", 0),
300 + overrides=mm_options.get("video"),
301 ),
302 }
303
vllm/model_executor/models/llava_onevision2.py
+2 -2
@@ -54,7 +54,7 @@ from vllm.compilation.decorators import (
54 support_torch_compile,
55 )
56 from vllm.config import VllmConfig
57 -from vllm.config.multimodal import BaseDummyOptions
57 +from vllm.config.multimodal import MultiModalDummyOptions
58 from vllm.distributed import parallel_state
59 from vllm.distributed import utils as dist_utils
60 from vllm.inputs import ModalityData, MultiModalDataDict
@@ -1471,7 +1471,7 @@ class LlavaOnevision2DummyInputsBuilder(
1471 self,
1472 seq_len: int,
1473 mm_counts: Mapping[str, int],
1474 - mm_options: Mapping[str, BaseDummyOptions] | None = None,
1474 + mm_options: MultiModalDummyOptions | None = None,
1475 ) -> MultiModalDataDict:
1476 n_img = mm_counts.get("image", 0)
1477 n_vid = mm_counts.get("video", 0)
vllm/model_executor/models/midashenglm.py
+4 -9
@@ -36,7 +36,7 @@ from torch.nn.functional import scaled_dot_product_attention
36 from transformers import BatchFeature
37
38 from vllm.config import VllmConfig
39 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
39 +from vllm.config.multimodal import MultiModalDummyOptions
40 from vllm.distributed import get_tensor_model_parallel_world_size
41 from vllm.inputs import MultiModalDataDict
42 from vllm.model_executor.layers.activation import get_act_fn
@@ -564,18 +564,13 @@ class MiDashengLMDummyInputsBuilder(BaseDummyInputsBuilder[MiDashengLMProcessing
564 self,
565 seq_len: int,
566 mm_counts: Mapping[str, int],
567 - mm_options: Mapping[str, BaseDummyOptions],
567 + mm_options: MultiModalDummyOptions,
568 ) -> MultiModalDataDict:
569 - num_audios = mm_counts.get("audio", 0)
570 -
571 - audio_overrides = mm_options.get("audio")
572 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
573 -
569 return {
570 "audio": self._get_dummy_audios(
571 length=self.info.get_max_audio_len(),
577 - num_audios=num_audios,
578 - overrides=audio_overrides,
572 + num_audios=mm_counts.get("audio", 0),
573 + overrides=mm_options.get("audio"),
574 )
575 }
576
vllm/model_executor/models/mimo_v2_omni.py
+6 -17
@@ -15,11 +15,7 @@ from transformers.models.qwen2_vl.image_processing_qwen2_vl import smart_resize
15 from typing_extensions import TypedDict
16
17 from vllm.config import VllmConfig
18 -from vllm.config.multimodal import (
19 - BaseDummyOptions,
20 - ImageDummyOptions,
21 - VideoDummyOptions,
22 -)
18 +from vllm.config.multimodal import MultiModalDummyOptions
19 from vllm.distributed import parallel_state
20 from vllm.distributed import utils as dist_utils
21 from vllm.inputs import MultiModalDataDict
@@ -1184,33 +1180,26 @@ class MiMoV2OmniDummyInputsBuilder(BaseDummyInputsBuilder[MiMoV2OmniProcessingIn
1180 self,
1181 seq_len: int,
1182 mm_counts: Mapping[str, int],
1187 - mm_options: Mapping[str, BaseDummyOptions],
1183 + mm_options: MultiModalDummyOptions,
1184 ) -> MultiModalDataDict:
1189 - num_images = mm_counts.get("image", 0)
1190 - num_videos = mm_counts.get("video", 0)
1191 -
1185 target_width, target_height = self.info.get_image_size_with_most_features()
1186 target_num_frames = self.info.get_num_frames_with_most_features(
1187 seq_len, mm_counts
1188 )
1196 - image_overrides = mm_options.get("image")
1197 - video_overrides = mm_options.get("video")
1198 - assert image_overrides is None or isinstance(image_overrides, ImageDummyOptions)
1199 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
1189
1190 return {
1191 "image": self._get_dummy_images(
1192 width=target_width,
1193 height=target_height,
1205 - num_images=num_images,
1206 - overrides=image_overrides,
1194 + num_images=mm_counts.get("image", 0),
1195 + overrides=mm_options.get("image"),
1196 ),
1197 "video": self._get_dummy_videos(
1198 width=target_width,
1199 height=target_height,
1200 num_frames=target_num_frames,
1212 - num_videos=num_videos,
1213 - overrides=video_overrides,
1201 + num_videos=mm_counts.get("video", 0),
1202 + overrides=mm_options.get("video"),
1203 ),
1204 }
1205
vllm/model_executor/models/minicpmo.py
+4 -8
@@ -40,7 +40,7 @@ from transformers.models.whisper.modeling_whisper import (
40 )
41
42 from vllm.config import VllmConfig
43 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
43 +from vllm.config.multimodal import MultiModalDummyOptions
44 from vllm.inputs import ModalityData, MultiModalDataDict
45 from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalKwargsItems
46 from vllm.multimodal.inputs import (
@@ -402,22 +402,18 @@ class MiniCPMODummyInputsBuilder(MiniCPMVDummyInputsBuilder[MiniCPMOProcessingIn
402 self,
403 seq_len: int,
404 mm_counts: Mapping[str, int],
405 - mm_options: Mapping[str, BaseDummyOptions],
405 + mm_options: MultiModalDummyOptions,
406 ) -> MultiModalDataDict:
407 - num_audios = mm_counts.get("audio", 0)
407 audio_len = (
408 self.info.get_max_audio_chunks_with_most_features()
409 * self.info.get_default_audio_sampling_rate()
410 )
411
413 - audio_overrides = mm_options.get("audio")
414 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
415 -
412 audio_mm_data = {
413 "audio": self._get_dummy_audios(
414 length=audio_len,
419 - num_audios=num_audios,
420 - overrides=audio_overrides,
415 + num_audios=mm_counts.get("audio", 0),
416 + overrides=mm_options.get("audio"),
417 )
418 }
419
vllm/model_executor/models/minicpmv.py
+5 -9
@@ -45,9 +45,8 @@ from typing_extensions import TypedDict, TypeVar
45
46 from vllm.config import VllmConfig
47 from vllm.config.multimodal import (
48 - BaseDummyOptions,
48 ImageDummyOptions,
50 - VideoDummyOptions,
49 + MultiModalDummyOptions,
50 )
51 from vllm.inputs import ModalityData, MultiModalDataDict
52 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -848,9 +847,8 @@ class MiniCPMVDummyInputsBuilder(BaseDummyInputsBuilder[_I]):
847 self,
848 seq_len: int,
849 mm_counts: Mapping[str, int],
851 - mm_options: Mapping[str, BaseDummyOptions],
850 + mm_options: MultiModalDummyOptions,
851 ) -> MultiModalDataDict:
853 - num_images = mm_counts.get("image", 0)
852 num_videos = mm_counts.get("video", 0)
853
854 image_width, image_height = self.info.get_image_size_with_most_features()
@@ -859,14 +857,12 @@ class MiniCPMVDummyInputsBuilder(BaseDummyInputsBuilder[_I]):
857 seq_len, mm_counts
858 )
859
862 - image_overrides = mm_options.get("image")
860 video_overrides = mm_options.get("video")
864 - assert image_overrides is None or isinstance(image_overrides, ImageDummyOptions)
861
862 # Convert video overrides to image overrides for per-frame image generation,
863 # and apply num_frames override to num_video_frames.
864 video_frame_overrides: ImageDummyOptions | None = None
869 - if isinstance(video_overrides, VideoDummyOptions):
865 + if video_overrides is not None:
866 if video_overrides.num_frames:
867 num_video_frames = min(num_video_frames, video_overrides.num_frames)
868 if video_overrides.width or video_overrides.height:
@@ -880,8 +876,8 @@ class MiniCPMVDummyInputsBuilder(BaseDummyInputsBuilder[_I]):
876 "image": self._get_dummy_images(
877 width=image_width,
878 height=image_height,
883 - num_images=num_images,
884 - overrides=image_overrides,
879 + num_images=mm_counts.get("image", 0),
880 + overrides=mm_options.get("image"),
881 ),
882 "video": [
883 self._get_dummy_images(
vllm/model_executor/models/mistral3.py
+4 -8
@@ -11,7 +11,7 @@ from transformers import BatchFeature, Mistral3Config, PixtralVisionConfig
11 from transformers.models.pixtral import PixtralProcessor
12
13 from vllm.config import VllmConfig
14 -from vllm.config.multimodal import BaseDummyOptions
14 +from vllm.config.multimodal import MultiModalDummyOptions
15 from vllm.inputs import MultiModalDataDict
16 from vllm.model_executor.layers.activation import get_act_fn
17 from vllm.model_executor.layers.layernorm import RMSNorm
@@ -261,20 +261,16 @@ class Mistral3DummyInputsBuilder(BaseDummyInputsBuilder):
261 self,
262 seq_len: int,
263 mm_counts: Mapping[str, int],
264 - mm_options: Mapping[str, BaseDummyOptions],
264 + mm_options: MultiModalDummyOptions,
265 ) -> MultiModalDataDict:
266 - num_images = mm_counts.get("image", 0)
267 -
266 target_width, target_height = self.info.get_image_size_with_most_features()
267
270 - image_overrides = mm_options.get("image")
271 -
268 return {
269 "image": self._get_dummy_images(
270 width=target_width,
271 height=target_height,
276 - num_images=num_images,
277 - overrides=image_overrides,
272 + num_images=mm_counts.get("image", 0),
273 + overrides=mm_options.get("image"),
274 )
275 }
276
vllm/model_executor/models/mllama4.py
+4 -8
@@ -36,7 +36,7 @@ from vllm.compilation.decorators import (
36 support_torch_compile,
37 )
38 from vllm.config import VllmConfig, set_current_vllm_config
39 -from vllm.config.multimodal import BaseDummyOptions
39 +from vllm.config.multimodal import MultiModalDummyOptions
40 from vllm.distributed import get_tensor_model_parallel_world_size
41 from vllm.inputs import MultiModalDataDict
42 from vllm.model_executor.layers.attention import MMEncoderAttention
@@ -709,20 +709,16 @@ class Mllama4DummyInputsBuilder(BaseDummyInputsBuilder[Mllama4ProcessingInfo]):
709 self,
710 seq_len: int,
711 mm_counts: Mapping[str, int],
712 - mm_options: Mapping[str, BaseDummyOptions],
712 + mm_options: MultiModalDummyOptions,
713 ) -> MultiModalDataDict:
714 - num_images = mm_counts.get("image", 0)
715 -
714 (target_width, target_height) = self.info.get_image_size_with_most_features()
715
718 - image_overrides = mm_options.get("image")
719 -
716 return {
717 "image": self._get_dummy_images(
718 width=target_width,
719 height=target_height,
724 - num_images=num_images,
725 - overrides=image_overrides,
720 + num_images=mm_counts.get("image", 0),
721 + overrides=mm_options.get("image"),
722 )
723 }
724
vllm/model_executor/models/molmo.py
+4 -7
@@ -21,7 +21,7 @@ from transformers import (
21
22 from vllm.compilation.decorators import support_torch_compile
23 from vllm.config import CacheConfig, VllmConfig
24 -from vllm.config.multimodal import BaseDummyOptions
24 +from vllm.config.multimodal import MultiModalDummyOptions
25 from vllm.distributed import (
26 get_pp_group,
27 get_tensor_model_parallel_rank,
@@ -1104,19 +1104,16 @@ class MolmoDummyInputsBuilder(BaseDummyInputsBuilder[MolmoProcessingInfo]):
1104 self,
1105 seq_len: int,
1106 mm_counts: Mapping[str, int],
1107 - mm_options: Mapping[str, BaseDummyOptions],
1107 + mm_options: MultiModalDummyOptions,
1108 ) -> MultiModalDataDict:
1109 target_width, target_height = self.info.get_image_size_with_most_features()
1110 - num_images = mm_counts.get("image", 0)
1111 -
1112 - image_overrides = mm_options.get("image")
1110
1111 return {
1112 "image": self._get_dummy_images(
1113 width=target_width,
1114 height=target_height,
1118 - num_images=num_images,
1119 - overrides=image_overrides,
1115 + num_images=mm_counts.get("image", 0),
1116 + overrides=mm_options.get("image"),
1117 )
1118 }
1119
vllm/model_executor/models/molmo2.py
+3 -6
@@ -26,7 +26,7 @@ from typing_extensions import TypedDict
26
27 from vllm.compilation.decorators import support_torch_compile
28 from vllm.config import CacheConfig, VllmConfig
29 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
29 +from vllm.config.multimodal import MultiModalDummyOptions, VideoDummyOptions
30 from vllm.distributed import (
31 get_pp_group,
32 get_tensor_model_parallel_rank,
@@ -1834,7 +1834,7 @@ class Molmo2DummyInputsBuilder(BaseDummyInputsBuilder[Molmo2ProcessingInfo]):
1834 self,
1835 seq_len: int,
1836 mm_counts: Mapping[str, int],
1837 - mm_options: Mapping[str, BaseDummyOptions],
1837 + mm_options: MultiModalDummyOptions,
1838 ) -> MultiModalDataDict:
1839 num_images = mm_counts.get("image", 0)
1840 num_videos = mm_counts.get("video", 0)
@@ -1845,13 +1845,11 @@ class Molmo2DummyInputsBuilder(BaseDummyInputsBuilder[Molmo2ProcessingInfo]):
1845 if num_images > 0:
1846 target_width, target_height = self.info.get_image_size_with_most_features()
1847
1848 - image_overrides = mm_options.get("image")
1849 -
1848 dummy_images = self._get_dummy_images(
1849 width=target_width,
1850 height=target_height,
1851 num_images=num_images,
1854 - overrides=image_overrides,
1852 + overrides=mm_options.get("image"),
1853 )
1854
1855 if num_videos > 0:
@@ -1864,7 +1862,6 @@ class Molmo2DummyInputsBuilder(BaseDummyInputsBuilder[Molmo2ProcessingInfo]):
1862 video_overrides = mm_options.get("video")
1863
1864 if video_overrides:
1867 - assert isinstance(video_overrides, VideoDummyOptions)
1865 num_frames_override = video_overrides.num_frames
1866 if num_frames_override:
1867 if num_frames_override > target_num_frames:
vllm/model_executor/models/moondream3.py
+3 -4
@@ -13,7 +13,7 @@ import torch.nn.functional as F
13 from transformers import BatchFeature
14
15 from vllm.config import VllmConfig
16 -from vllm.config.multimodal import BaseDummyOptions
16 +from vllm.config.multimodal import MultiModalDummyOptions
17 from vllm.distributed import (
18 get_pp_group,
19 get_tensor_model_parallel_rank,
@@ -943,15 +943,14 @@ class Moondream3DummyInputsBuilder(BaseDummyInputsBuilder[Moondream3ProcessingIn
943 self,
944 seq_len: int,
945 mm_counts: Mapping[str, int],
946 - mm_options: Mapping[str, BaseDummyOptions] | None = None,
946 + mm_options: MultiModalDummyOptions | None = None,
947 mm_processor_kwargs: Mapping[str, object] | None = None,
948 ) -> MultiModalDataDict:
949 - num_images = mm_counts.get("image", 0)
949 return {
950 "image": self._get_dummy_images(
951 width=378,
952 height=378,
954 - num_images=num_images,
953 + num_images=mm_counts.get("image", 0),
954 )
955 }
956
vllm/model_executor/models/moss_audio.py
+4 -7
@@ -19,7 +19,7 @@ from typing_extensions import TypedDict
19
20 from vllm.compilation.decorators import support_torch_compile
21 from vllm.config import VllmConfig
22 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
22 +from vllm.config.multimodal import MultiModalDummyOptions
23 from vllm.distributed import (
24 get_pp_group,
25 get_tensor_model_parallel_world_size,
@@ -1341,16 +1341,13 @@ class MossAudioDummyInputsBuilder(BaseDummyInputsBuilder[MossAudioProcessingInfo
1341 self,
1342 seq_len: int,
1343 mm_counts: Mapping[str, int],
1344 - mm_options: Mapping[str, BaseDummyOptions],
1344 + mm_options: MultiModalDummyOptions,
1345 ) -> MultiModalDataDict:
1346 - num_audios = mm_counts.get("audio", 0)
1347 - audio_overrides = mm_options.get("audio")
1348 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
1346 return {
1347 "audio": self._get_dummy_audios(
1348 length=16000,
1352 - num_audios=num_audios,
1353 - overrides=audio_overrides,
1349 + num_audios=mm_counts.get("audio", 0),
1350 + overrides=mm_options.get("audio"),
1351 )
1352 }
1353
vllm/model_executor/models/moss_transcribe_diarize.py
+4 -6
@@ -20,7 +20,7 @@ from torch import nn
20 from transformers import BatchFeature
21
22 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
23 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
23 +from vllm.config.multimodal import MultiModalDummyOptions
24 from vllm.config.speech_to_text import SpeechToTextParams
25 from vllm.inputs import ModalityData, MultiModalDataDict, PromptType, TextPrompt
26 from vllm.model_executor.models.interfaces import (
@@ -423,20 +423,18 @@ class MossTranscribeDiarizeDummyInputsBuilder(
423 self,
424 seq_len: int,
425 mm_counts: Mapping[str, int],
426 - mm_options: Mapping[str, BaseDummyOptions],
426 + mm_options: MultiModalDummyOptions,
427 ) -> MultiModalDataDict:
428 num_audios = mm_counts.get("audio", 0)
429 if num_audios == 0:
430 return {}
431
432 feature_extractor = self.info.get_feature_extractor()
433 - audio_overrides = mm_options.get("audio")
434 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
433 return {
434 "audio": self._get_dummy_audios(
435 length=_get_max_audio_samples(feature_extractor),
436 num_audios=num_audios,
439 - overrides=audio_overrides,
437 + overrides=mm_options.get("audio"),
438 )
439 }
440
@@ -444,7 +442,7 @@ class MossTranscribeDiarizeDummyInputsBuilder(
442 self,
443 seq_len: int,
444 mm_counts: Mapping[str, int],
447 - mm_options: Mapping[str, BaseDummyOptions],
445 + mm_options: MultiModalDummyOptions,
446 ) -> ProcessorInputs:
447 dummy_mm_data = self.get_dummy_mm_data(seq_len, mm_counts, mm_options)
448 dummy_mm_items = self.info.parse_mm_data(dummy_mm_data)
vllm/model_executor/models/muse_glimmer.py
+4 -12
@@ -45,11 +45,7 @@ from transformers import BatchFeature
45
46 from vllm.compilation.decorators import support_torch_compile
47 from vllm.config import CacheConfig, VllmConfig
48 -from vllm.config.multimodal import (
49 - BaseDummyOptions,
50 - ImageDummyOptions,
51 - VideoDummyOptions,
52 -)
48 +from vllm.config.multimodal import MultiModalDummyOptions
49 from vllm.distributed import (
50 divide,
51 get_pp_group,
@@ -234,7 +230,7 @@ class MuseGlimmerDummyInputsBuilder(BaseDummyInputsBuilder[MuseGlimmerProcessing
230 self,
231 seq_len: int,
232 mm_counts: Mapping[str, int],
237 - mm_options: Mapping[str, BaseDummyOptions],
233 + mm_options: MultiModalDummyOptions,
234 ) -> MultiModalDataDict:
235 processor = self.info.get_hf_processor()
236 video_processor = processor.video_processor
@@ -245,16 +241,12 @@ class MuseGlimmerDummyInputsBuilder(BaseDummyInputsBuilder[MuseGlimmerProcessing
241 * int(video_processor.downsample_factor)
242 * video_grid
243 )
248 - image_overrides = mm_options.get("image")
249 - video_overrides = mm_options.get("video")
250 - assert image_overrides is None or isinstance(image_overrides, ImageDummyOptions)
251 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
244 return {
245 "image": self._get_dummy_images(
246 width=image_width,
247 height=image_height,
248 num_images=mm_counts.get("image", 0),
257 - overrides=image_overrides,
249 + overrides=mm_options.get("image"),
250 ),
251 "video": self._get_dummy_videos(
252 width=video_size,
@@ -263,7 +255,7 @@ class MuseGlimmerDummyInputsBuilder(BaseDummyInputsBuilder[MuseGlimmerProcessing
255 seq_len, mm_counts
256 ),
257 num_videos=mm_counts.get("video", 0),
266 - overrides=video_overrides,
258 + overrides=mm_options.get("video"),
259 ),
260 }
261
vllm/model_executor/models/nano_nemotron_vl.py
+4 -14
@@ -21,8 +21,7 @@ from transformers import BatchFeature, PretrainedConfig
21 from vllm import envs
22 from vllm.config import VllmConfig
23 from vllm.config.multimodal import (
24 - AudioDummyOptions,
25 - BaseDummyOptions,
24 + MultiModalDummyOptions,
25 VideoDummyOptions,
26 )
27 from vllm.inputs import MultiModalDataDict, MultiModalInput
@@ -839,22 +838,19 @@ class NanoNemotronVLDummyInputsBuilder(
838 self,
839 seq_len: int,
840 mm_counts: Mapping[str, int],
842 - mm_options: Mapping[str, BaseDummyOptions],
841 + mm_options: MultiModalDummyOptions,
842 ) -> MultiModalDataDict:
844 - num_images = mm_counts.get("image", 0)
843 (target_width, target_height), _ = (
844 self.info.get_dummy_image_size_and_max_tokens(mm_counts)
845 )
846 processor = self.info.get_hf_processor()
847
850 - image_overrides = mm_options.get("image")
851 -
848 dummy_image = {
849 "image": self._get_dummy_images(
850 width=target_width,
851 height=target_height,
856 - num_images=num_images,
857 - overrides=image_overrides,
852 + num_images=mm_counts.get("image", 0),
853 + overrides=mm_options.get("image"),
854 )
855 }
856
@@ -889,9 +885,6 @@ class NanoNemotronVLDummyInputsBuilder(
885 target_num_frames = num_frames
886 num_videos = mm_counts.get("video", 0)
887 video_overrides = mm_options.get("video")
892 - assert video_overrides is None or isinstance(
893 - video_overrides, VideoDummyOptions
894 - )
888 dummy_video = {
889 "video": self._get_dummy_videos(
890 width=video_width,
@@ -907,9 +900,6 @@ class NanoNemotronVLDummyInputsBuilder(
900 if sound_config := self.info.sound_config:
901 num_audios = mm_counts.get("audio", 0)
902 audio_overrides = mm_options.get("audio") if mm_options else None
910 - assert audio_overrides is None or isinstance(
911 - audio_overrides, AudioDummyOptions
912 - )
903 tokens_per_audio = max(1, seq_len // max(num_audios, 1))
904 max_audio_num_samples = MAX_AUDIO_LEN_S * sound_config.sampling_rate
905 calculated_max_audio_num_samples = ParakeetExtractor.audio_length(
vllm/model_executor/models/nemotron_parse.py
+2 -2
@@ -22,7 +22,7 @@ from transformers import (
22
23 from vllm.config import CacheConfig, VllmConfig
24 from vllm.config.lora import LoRAConfig
25 -from vllm.config.multimodal import BaseDummyOptions
25 +from vllm.config.multimodal import MultiModalDummyOptions
26 from vllm.inputs import MultiModalDataDict
27 from vllm.logger import init_logger
28 from vllm.model_executor.layers.activation import get_act_fn
@@ -388,7 +388,7 @@ class NemotronParseDummyInputsBuilder(
388 self,
389 seq_len: int,
390 mm_counts: Mapping[str, int],
391 - mm_options: Mapping[str, BaseDummyOptions],
391 + mm_options: MultiModalDummyOptions,
392 ) -> MultiModalDataDict:
393 num_images = mm_counts.get("image", 0)
394
vllm/model_executor/models/nvlm_d.py
+4 -7
@@ -13,7 +13,7 @@ import torch
13 import torch.nn as nn
14 from transformers import PretrainedConfig
15
16 -from vllm.config.multimodal import BaseDummyOptions
16 +from vllm.config.multimodal import MultiModalDummyOptions
17 from vllm.inputs import MultiModalDataDict
18 from vllm.model_executor.layers.quantization import QuantizationConfig
19 from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -83,19 +83,16 @@ class NVLMDummyInputsBuilder(BaseInternVLDummyInputsBuilder[NVLMProcessingInfo])
83 self,
84 seq_len: int,
85 mm_counts: Mapping[str, int],
86 - mm_options: Mapping[str, BaseDummyOptions],
86 + mm_options: MultiModalDummyOptions,
87 ) -> MultiModalDataDict:
88 target_width, target_height = self.info.get_image_size_with_most_features()
89 - num_images = mm_counts.get("image", 0)
90 -
91 - image_overrides = mm_options.get("image")
89
90 return {
91 "image": self._get_dummy_images(
92 width=target_width,
93 height=target_height,
97 - num_images=num_images,
98 - overrides=image_overrides,
94 + num_images=mm_counts.get("image", 0),
95 + overrides=mm_options.get("image"),
96 )
97 }
98
vllm/model_executor/models/openvla.py
+4 -6
@@ -9,7 +9,7 @@ import torch.nn as nn
9 from transformers import BatchFeature
10
11 from vllm.config import VllmConfig
12 -from vllm.config.multimodal import BaseDummyOptions
12 +from vllm.config.multimodal import MultiModalDummyOptions
13 from vllm.inputs import MultiModalDataDict
14 from vllm.model_executor.layers.activation import get_act_fn
15 from vllm.model_executor.layers.linear import (
@@ -299,18 +299,16 @@ class OpenVLADummyInputsBuilder(BaseDummyInputsBuilder[OpenVLAProcessingInfo]):
299 self,
300 seq_len: int,
301 mm_counts: Mapping[str, int],
302 - mm_options: Mapping[str, BaseDummyOptions],
302 + mm_options: MultiModalDummyOptions,
303 ) -> MultiModalDataDict:
304 - num_images = mm_counts.get("image", 0)
305 - image_overrides = mm_options.get("image")
304 image_size = self.info.get_image_size_with_most_features()
305
306 return {
307 "image": self._get_dummy_images(
308 width=image_size.width,
309 height=image_size.height,
312 - num_images=num_images,
313 - overrides=image_overrides,
310 + num_images=mm_counts.get("image", 0),
311 + overrides=mm_options.get("image"),
312 )
313 }
314
vllm/model_executor/models/ovis.py
+4 -8
@@ -29,7 +29,7 @@ from torch.nn.functional import gumbel_softmax, pad, softmax
29 from transformers import BatchFeature, PretrainedConfig
30
31 from vllm.config import VllmConfig
32 -from vllm.config.multimodal import BaseDummyOptions
32 +from vllm.config.multimodal import MultiModalDummyOptions
33 from vllm.inputs import MultiModalDataDict
34 from vllm.model_executor.layers.linear import ReplicatedLinear
35 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -311,20 +311,16 @@ class OvisDummyInputsBuilder(BaseDummyInputsBuilder[OvisProcessingInfo]):
311 self,
312 seq_len: int,
313 mm_counts: Mapping[str, int],
314 - mm_options: Mapping[str, BaseDummyOptions],
314 + mm_options: MultiModalDummyOptions,
315 ) -> MultiModalDataDict:
316 - num_images = mm_counts.get("image", 0)
317 -
316 target_width, target_height = self.info.get_image_size_with_most_features()
317
320 - image_overrides = mm_options.get("image")
321 -
318 mm_data = {
319 "image": self._get_dummy_images(
320 width=target_width,
321 height=target_height,
326 - num_images=num_images,
327 - overrides=image_overrides,
322 + num_images=mm_counts.get("image", 0),
323 + overrides=mm_options.get("image"),
324 ),
325 }
326 return mm_data
vllm/model_executor/models/ovis2_5.py
+6 -13
@@ -11,7 +11,7 @@ import torch.nn as nn
11 from transformers import BaseImageProcessor, BatchFeature, PretrainedConfig
12
13 from vllm.config import VllmConfig
14 -from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
14 +from vllm.config.multimodal import MultiModalDummyOptions
15 from vllm.inputs import MultiModalDataDict
16 from vllm.model_executor.layers.linear import ReplicatedLinear
17 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -290,33 +290,26 @@ class Ovis2_5DummyInputsBuilder(BaseDummyInputsBuilder[Ovis2_5ProcessingInfo]):
290 self,
291 seq_len: int,
292 mm_counts: Mapping[str, int],
293 - mm_options: Mapping[str, BaseDummyOptions],
293 + mm_options: MultiModalDummyOptions,
294 ) -> MultiModalDataDict:
295 - num_images = mm_counts.get("image", 0)
296 - num_videos = mm_counts.get("video", 0)
297 -
295 target_width, target_height = self.info.get_image_size_with_most_features()
296 target_num_frames = self.info.get_num_frames_with_most_features(
297 seq_len, mm_counts
298 )
299
303 - image_overrides = mm_options.get("image")
304 - video_overrides = mm_options.get("video")
305 - assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
306 -
300 mm_data = {
301 "image": self._get_dummy_images(
302 width=target_width,
303 height=target_height,
311 - num_images=num_images,
312 - overrides=image_overrides,
304 + num_images=mm_counts.get("image", 0),
305 + overrides=mm_options.get("image"),
306 ),
307 "video": self._get_dummy_videos(
308 width=target_width,
309 height=target_height,
310 num_frames=target_num_frames,
318 - num_videos=num_videos,
319 - overrides=video_overrides,
311 + num_videos=mm_counts.get("video", 0),
312 + overrides=mm_options.get("video"),
313 ),
314 }
315 return mm_data
vllm/model_executor/models/paddleocr_vl.py
+4 -7
@@ -32,7 +32,7 @@ from transformers.modeling_outputs import (
32 from transformers.utils import torch_int
33
34 from vllm.config import VllmConfig
35 -from vllm.config.multimodal import BaseDummyOptions
35 +from vllm.config.multimodal import MultiModalDummyOptions
36 from vllm.distributed import parallel_state
37 from vllm.distributed import utils as dist_utils
38 from vllm.inputs import MultiModalDataDict
@@ -223,19 +223,16 @@ class PaddleOCRVLDummyInputsBuilder(BaseDummyInputsBuilder[PaddleOCRVLProcessing
223 self,
224 seq_len: int,
225 mm_counts: Mapping[str, int],
226 - mm_options: Mapping[str, BaseDummyOptions],
226 + mm_options: MultiModalDummyOptions,
227 ) -> MultiModalDataDict:
228 - num_images = mm_counts.get("image", 0)
229 -
228 max_image_size = self.info.get_image_size_with_most_features()
231 - image_overrides = mm_options.get("image")
229
230 return {
231 "image": self._get_dummy_images(
232 width=max_image_size.width,
233 height=max_image_size.height,
237 - num_images=num_images,
238 - overrides=image_overrides,
234 + num_images=mm_counts.get("image", 0),
235 + overrides=mm_options.get("image"),
236 )
237 }
238
vllm/model_executor/models/paligemma.py
+4 -8
@@ -8,7 +8,7 @@ from torch import nn
8 from transformers import BatchFeature, PaliGemmaConfig
9
10 from vllm.config import VllmConfig
11 -from vllm.config.multimodal import BaseDummyOptions
11 +from vllm.config.multimodal import MultiModalDummyOptions
12 from vllm.inputs import MultiModalDataDict, MultiModalInput
13 from vllm.logger import init_logger
14 from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -130,22 +130,18 @@ class PaliGemmaDummyInputsBuilder(BaseDummyInputsBuilder[PaliGemmaProcessingInfo
130 self,
131 seq_len: int,
132 mm_counts: Mapping[str, int],
133 - mm_options: Mapping[str, BaseDummyOptions],
133 + mm_options: MultiModalDummyOptions,
134 ) -> MultiModalDataDict:
135 hf_config = self.info.get_hf_config()
136 vision_config = hf_config.vision_config
137 max_image_size = vision_config.image_size
138
139 - num_images = mm_counts.get("image", 0)
140 -
141 - image_overrides = mm_options.get("image")
142 -
139 return {
140 "image": self._get_dummy_images(
141 width=max_image_size,
142 height=max_image_size,
147 - num_images=num_images,
148 - overrides=image_overrides,
143 + num_images=mm_counts.get("image", 0),
144 + overrides=mm_options.get("image"),
145 )
146 }
147
vllm/model_executor/models/phi3v.py
+4 -8
@@ -29,7 +29,7 @@ from transformers import (
29 )
30
31 from vllm.config import VllmConfig
32 -from vllm.config.multimodal import BaseDummyOptions
32 +from vllm.config.multimodal import MultiModalDummyOptions
33 from vllm.inputs import MultiModalDataDict
34 from vllm.logger import init_logger
35 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -371,20 +371,16 @@ class Phi3VDummyInputsBuilder(BaseDummyInputsBuilder[Phi3VProcessingInfo]):
371 self,
372 seq_len: int,
373 mm_counts: Mapping[str, int],
374 - mm_options: Mapping[str, BaseDummyOptions],
374 + mm_options: MultiModalDummyOptions,
375 ) -> MultiModalDataDict:
376 - num_images = mm_counts.get("image", 0)
377 -
376 target_width, target_height = self.info.get_image_size_with_most_features()
377
380 - image_overrides = mm_options.get("image")
381 -
378 return {
379 "image": self._get_dummy_images(
380 width=target_width,
381 height=target_height,
386 - num_images=num_images,
387 - overrides=image_overrides,
382 + num_images=mm_counts.get("image", 0),
383 + overrides=mm_options.get("image"),
384 )
385 }
386
vllm/model_executor/models/phi4mm.py
+6 -13
@@ -17,7 +17,7 @@ from transformers import (
17 )
18
19 from vllm.config import VllmConfig
20 -from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
20 +from vllm.config.multimodal import MultiModalDummyOptions
21 from vllm.distributed import get_pp_group
22 from vllm.inputs import MultiModalDataDict
23 from vllm.model_executor.layers.logits_processor import LogitsProcessor
@@ -839,28 +839,21 @@ class Phi4MMDummyInputsBuilder(BaseDummyInputsBuilder[Phi4MMProcessingInfo]):
839 self,
840 seq_len: int,
841 mm_counts: Mapping[str, int],
842 - mm_options: Mapping[str, BaseDummyOptions],
842 + mm_options: MultiModalDummyOptions,
843 ) -> MultiModalDataDict:
844 - num_audios = mm_counts.get("audio", 0)
845 - num_images = mm_counts.get("image", 0)
846 -
844 target_width, target_height = self.info.get_image_size_with_most_features()
845
849 - image_overrides = mm_options.get("image")
850 - audio_overrides = mm_options.get("audio")
851 - assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
852 -
846 mm_data = {
847 "image": self._get_dummy_images(
848 width=target_width,
849 height=target_height,
857 - num_images=num_images,
858 - overrides=image_overrides,
850 + num_images=mm_counts.get("image", 0),
851 + overrides=mm_options.get("image"),
852 ),
853 "audio": self._get_dummy_audios(
854 length=_AUDIO_MAX_SOUNDFILE_SIZE,
862 - num_audios=num_audios,
863 - overrides=audio_overrides,
855 + num_audios=mm_counts.get("audio", 0),
856 + overrides=mm_options.get("audio"),
857 ),
858 }
859
vllm/model_executor/models/phi4siglip.py
+3 -4
@@ -14,7 +14,7 @@ import torch.nn as nn
14 from transformers import BatchFeature, PretrainedConfig, Siglip2VisionConfig
15
16 from vllm.config import VllmConfig
17 -from vllm.config.multimodal import BaseDummyOptions
17 +from vllm.config.multimodal import MultiModalDummyOptions
18 from vllm.inputs import MultiModalDataDict
19 from vllm.logger import init_logger
20 from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -126,15 +126,14 @@ class Phi4SiglipDummyInputsBuilder(
126 self,
127 seq_len: int,
128 mm_counts: Mapping[str, int],
129 - mm_options: Mapping[str, BaseDummyOptions],
129 + mm_options: MultiModalDummyOptions,
130 ) -> MultiModalDataDict:
131 - num_images = mm_counts.get("image", 0)
131 size = self.info.get_image_size_with_most_features()
132 return {
133 "image": self._get_dummy_images(
134 width=size.width,
135 height=size.height,
137 - num_images=num_images,
136 + num_images=mm_counts.get("image", 0),
137 overrides=mm_options.get("image"),
138 ),
139 }
vllm/model_executor/models/pixtral.py
+5 -9
@@ -21,7 +21,7 @@ from transformers.models.pixtral.image_processing_pixtral import (
21 from transformers.models.pixtral.modeling_pixtral import apply_rotary_pos_emb
22
23 from vllm.config import VllmConfig
24 -from vllm.config.multimodal import BaseDummyOptions
24 +from vllm.config.multimodal import MultiModalDummyOptions
25 from vllm.distributed import divide, get_tensor_model_parallel_world_size
26 from vllm.inputs import MultiModalDataDict
27 from vllm.model_executor.layers.activation import SiluAndMul, get_act_and_mul_fn
@@ -208,20 +208,16 @@ class PixtralDummyInputsBuilder(BaseDummyInputsBuilder[PixtralProcessingInfo]):
208 self,
209 seq_len: int,
210 mm_counts: Mapping[str, int],
211 - mm_options: Mapping[str, BaseDummyOptions],
211 + mm_options: MultiModalDummyOptions,
212 ) -> MultiModalDataDict:
213 - num_images = mm_counts.get("image", 0)
214 -
213 target_width, target_height = self.info.get_image_size_with_most_features()
214
217 - image_overrides = mm_options.get("image")
218 -
215 return {
216 "image": self._get_dummy_images(
217 width=target_width,
218 height=target_height,
223 - num_images=num_images,
224 - overrides=image_overrides,
219 + num_images=mm_counts.get("image", 0),
220 + overrides=mm_options.get("image"),
221 )
222 }
223
@@ -229,7 +225,7 @@ class PixtralDummyInputsBuilder(BaseDummyInputsBuilder[PixtralProcessingInfo]):
225 self,
226 seq_len: int,
227 mm_counts: Mapping[str, int],
232 - mm_options: Mapping[str, BaseDummyOptions],
228 + mm_options: MultiModalDummyOptions,
229 mm_data: MultiModalDataDict | None = None,
230 ) -> ProcessorInputs:
231 tokenizer = self.info.get_tokenizer()
vllm/model_executor/models/qwen2_5_omni_thinker.py
+8 -16
@@ -44,7 +44,7 @@ from transformers.models.qwen2_5_omni.processing_qwen2_5_omni import (
44 from transformers.models.whisper import WhisperFeatureExtractor
45
46 from vllm.config import VllmConfig
47 -from vllm.config.multimodal import BaseDummyOptions
47 +from vllm.config.multimodal import MultiModalDummyOptions
48 from vllm.forward_context import set_forward_context
49 from vllm.inputs import ModalityData, MultiModalDataDict
50 from vllm.logger import init_logger
@@ -448,12 +448,8 @@ class Qwen2_5OmniThinkerDummyInputsBuilder(
448 self,
449 seq_len: int,
450 mm_counts: Mapping[str, int],
451 - mm_options: Mapping[str, BaseDummyOptions],
451 + mm_options: MultiModalDummyOptions,
452 ) -> MultiModalDataDict:
453 - num_audios = mm_counts.get("audio", 0)
454 - num_images = mm_counts.get("image", 0)
455 - num_videos = mm_counts.get("video", 0)
456 -
453 feature_extractor = self.info.get_feature_extractor()
454
455 target_audio_length = (
@@ -469,28 +465,24 @@ class Qwen2_5OmniThinkerDummyInputsBuilder(
465 seq_len, mm_counts
466 )
467
472 - image_overrides = mm_options.get("image")
473 - video_overrides = mm_options.get("video")
474 - audio_overrides = mm_options.get("audio")
475 -
468 mm_data = {
469 "audio": self._get_dummy_audios(
470 length=target_audio_length,
479 - num_audios=num_audios,
480 - overrides=audio_overrides,
471 + num_audios=mm_counts.get("audio", 0),
472 + overrides=mm_options.get("audio"),
473 ),
474 "image": self._get_dummy_images(
475 width=target_width,
476 height=target_height,
485 - num_images=num_images,
486 - overrides=image_overrides,
477 + num_images=mm_counts.get("image", 0),
478 + overrides=mm_options.get("image"),
479 ),
480 "video": self._get_dummy_videos(
481 width=target_width,
482 height=target_height,
483 num_frames=target_num_frames,
492 - num_videos=num_videos,
493 - overrides=video_overrides,
484 + num_videos=mm_counts.get("video", 0),
485 + overrides=mm_options.get("video"),
486 ),
487 }
488
vllm/model_executor/models/qwen2_audio.py
+4 -7
@@ -37,7 +37,7 @@ from transformers.models.qwen2_audio import (
37 from transformers.models.whisper import WhisperFeatureExtractor
38
39 from vllm.config import VllmConfig
40 -from vllm.config.multimodal import BaseDummyOptions
40 +from vllm.config.multimodal import MultiModalDummyOptions
41 from vllm.inputs import ModalityData, MultiModalDataDict
42 from vllm.multimodal import MULTIMODAL_REGISTRY
43 from vllm.multimodal.inputs import (
@@ -214,21 +214,18 @@ class Qwen2AudioDummyInputsBuilder(BaseDummyInputsBuilder[Qwen2AudioProcessingIn
214 self,
215 seq_len: int,
216 mm_counts: Mapping[str, int],
217 - mm_options: Mapping[str, BaseDummyOptions],
217 + mm_options: MultiModalDummyOptions,
218 ) -> MultiModalDataDict:
219 feature_extractor = self.info.get_feature_extractor()
220
221 sampling_rate = feature_extractor.sampling_rate
222 audio_len = feature_extractor.chunk_length * sampling_rate
223 - num_audios = mm_counts.get("audio", 0)
224 -
225 - audio_overrides = mm_options.get("audio")
223
224 return {
225 "audio": self._get_dummy_audios(
226 length=audio_len,
230 - num_audios=num_audios,
231 - overrides=audio_overrides,
227 + num_audios=mm_counts.get("audio", 0),
228 + overrides=mm_options.get("audio"),
229 )
230 }
231
vllm/model_executor/models/qwen2_vl.py
+6 -12
@@ -43,7 +43,7 @@ from transformers.models.qwen2_vl.configuration_qwen2_vl import (
43 from transformers.models.qwen2_vl.image_processing_qwen2_vl import smart_resize
44
45 from vllm.config import VllmConfig
46 -from vllm.config.multimodal import BaseDummyOptions
46 +from vllm.config.multimodal import MultiModalDummyOptions
47 from vllm.distributed import parallel_state, tensor_model_parallel_all_gather
48 from vllm.distributed import utils as dist_utils
49 from vllm.inputs import ModalityData, MultiModalDataDict
@@ -1096,32 +1096,26 @@ class Qwen2VLDummyInputsBuilder(BaseDummyInputsBuilder[Qwen2VLProcessingInfo]):
1096 self,
1097 seq_len: int,
1098 mm_counts: Mapping[str, int],
1099 - mm_options: Mapping[str, BaseDummyOptions],
1099 + mm_options: MultiModalDummyOptions,
1100 ) -> MultiModalDataDict:
1101 - num_images = mm_counts.get("image", 0)
1102 - num_videos = mm_counts.get("video", 0)
1103 -
1101 target_width, target_height = self.info.get_image_size_with_most_features()
1102 target_num_frames = self.info.get_num_frames_with_most_features(
1103 seq_len, mm_counts
1104 )
1105
1109 - image_overrides = mm_options.get("image")
1110 - video_overrides = mm_options.get("video")
1111 -
1106 return {
1107 "image": self._get_dummy_images(
1108 width=target_width,
1109 height=target_height,
1116 - num_images=num_images,
1117 - overrides=image_overrides,
1110 + num_images=mm_counts.get("image", 0),
1111 + overrides=mm_options.get("image"),
1112 ),
1113 "video": self._get_dummy_videos(
1114 width=target_width,
1115 height=target_height,
1116 num_frames=target_num_frames,
1123 - num_videos=num_videos,
1124 - overrides=video_overrides,
1117 + num_videos=mm_counts.get("video", 0),
1118 + overrides=mm_options.get("video"),
1119 ),
1120 }
1121
vllm/model_executor/models/qwen3_asr.py
+4 -8
@@ -32,7 +32,7 @@ from transformers.feature_extraction_utils import BatchFeature
32 from transformers.models.whisper import WhisperFeatureExtractor
33
34 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
35 -from vllm.config.multimodal import BaseDummyOptions
35 +from vllm.config.multimodal import MultiModalDummyOptions
36 from vllm.config.speech_to_text import SpeechToTextParams
37 from vllm.inputs import ModalityData, MultiModalDataDict, PromptType, TokensPrompt
38 from vllm.logger import init_logger
@@ -226,10 +226,8 @@ class Qwen3ASRDummyInputsBuilder(BaseDummyInputsBuilder[Qwen3ASRProcessingInfo])
226 self,
227 seq_len: int,
228 mm_counts: Mapping[str, int],
229 - mm_options: Mapping[str, BaseDummyOptions],
229 + mm_options: MultiModalDummyOptions,
230 ) -> MultiModalDataDict:
231 - num_audios = mm_counts.get("audio", 0)
232 -
231 feature_extractor = self.info.get_feature_extractor()
232
233 target_audio_length = (
@@ -240,13 +238,11 @@ class Qwen3ASRDummyInputsBuilder(BaseDummyInputsBuilder[Qwen3ASRProcessingInfo])
238 * feature_extractor.sampling_rate
239 )
240
243 - audio_overrides = mm_options.get("audio")
244 -
241 return {
242 "audio": self._get_dummy_audios(
243 length=target_audio_length,
248 - num_audios=num_audios,
249 - overrides=audio_overrides,
244 + num_audios=mm_counts.get("audio", 0),
245 + overrides=mm_options.get("audio"),
246 ),
247 }
248
vllm/model_executor/models/qwen3_vl.py
+5 -10
@@ -54,8 +54,8 @@ from vllm.compilation.decorators import (
54 )
55 from vllm.config import VllmConfig
56 from vllm.config.multimodal import (
57 - BaseDummyOptions,
57 MultiModalConfig,
58 + MultiModalDummyOptions,
59 VideoDummyOptions,
60 VideoPruningMethod,
61 )
@@ -1119,11 +1119,8 @@ class Qwen3VLDummyInputsBuilder(BaseDummyInputsBuilder[Qwen3VLProcessingInfo]):
1119 self,
1120 seq_len: int,
1121 mm_counts: Mapping[str, int],
1122 - mm_options: Mapping[str, BaseDummyOptions],
1122 + mm_options: MultiModalDummyOptions,
1123 ) -> MultiModalDataDict:
1124 - num_images = mm_counts.get("image", 0)
1125 - num_videos = mm_counts.get("video", 0)
1126 - image_overrides = mm_options.get("image")
1124 video_overrides = mm_options.get("video")
1125
1126 target_image_width, target_image_height = (
@@ -1133,7 +1130,6 @@ class Qwen3VLDummyInputsBuilder(BaseDummyInputsBuilder[Qwen3VLProcessingInfo]):
1130 # treat videos as special images
1131 target_num_frames = 2
1132 if video_overrides:
1136 - assert isinstance(video_overrides, VideoDummyOptions)
1133 num_frames_override = video_overrides.num_frames
1134 if num_frames_override:
1135 if num_frames_override > target_num_frames:
@@ -1204,7 +1200,6 @@ class Qwen3VLDummyInputsBuilder(BaseDummyInputsBuilder[Qwen3VLProcessingInfo]):
1200 target_video_size.height,
1201 )
1202 if video_overrides:
1207 - assert isinstance(video_overrides, VideoDummyOptions)
1203 width_override = video_overrides.width
1204 if width_override:
1205 if width_override > target_video_width:
@@ -1230,14 +1225,14 @@ class Qwen3VLDummyInputsBuilder(BaseDummyInputsBuilder[Qwen3VLProcessingInfo]):
1225 "image": self._get_dummy_images(
1226 width=target_image_width,
1227 height=target_image_height,
1233 - num_images=num_images,
1234 - overrides=image_overrides,
1228 + num_images=mm_counts.get("image", 0),
1229 + overrides=mm_options.get("image"),
1230 ),
1231 "video": self._get_dummy_videos(
1232 width=target_video_width,
1233 height=target_video_height,
1234 num_frames=target_num_frames,
1240 - num_videos=num_videos,
1235 + num_videos=mm_counts.get("video", 0),
1236 ),
1237 }
1238
vllm/model_executor/models/rvl.py
+4 -8
@@ -8,7 +8,7 @@ import torch.nn as nn
8 from transformers.activations import GELUActivation
9
10 from vllm.config import VllmConfig
11 -from vllm.config.multimodal import BaseDummyOptions
11 +from vllm.config.multimodal import MultiModalDummyOptions
12 from vllm.inputs import MultiModalDataDict
13 from vllm.multimodal import MULTIMODAL_REGISTRY
14
@@ -40,20 +40,16 @@ class RVLDummyInputsBuilder(LlavaDummyInputsBuilder[RVLProcessingInfo]):
40 self,
41 seq_len: int,
42 mm_counts: Mapping[str, int],
43 - mm_options: Mapping[str, BaseDummyOptions],
43 + mm_options: MultiModalDummyOptions,
44 ) -> MultiModalDataDict:
45 - num_images = mm_counts.get("image", 0)
46 -
45 target_width, target_height = self.info.get_image_size_with_most_features()
46
49 - image_overrides = mm_options.get("image")
50 -
47 return {
48 "image": self._get_dummy_images(
49 width=target_width,
50 height=target_height,
55 - num_images=num_images,
56 - overrides=image_overrides,
51 + num_images=mm_counts.get("image", 0),
52 + overrides=mm_options.get("image"),
53 ),
54 }
55
vllm/model_executor/models/siglip.py
+4 -8
@@ -16,7 +16,7 @@ from transformers import (
16 )
17
18 from vllm.config import VllmConfig
19 -from vllm.config.multimodal import BaseDummyOptions
19 +from vllm.config.multimodal import MultiModalDummyOptions
20 from vllm.distributed import divide, get_tensor_model_parallel_world_size
21 from vllm.inputs import MultiModalDataDict, MultiModalInput
22 from vllm.model_executor.layers.activation import get_act_fn
@@ -158,20 +158,16 @@ class SiglipDummyInputsBuilder(BaseDummyInputsBuilder[SiglipProcessingInfo]):
158 self,
159 seq_len: int,
160 mm_counts: Mapping[str, int],
161 - mm_options: Mapping[str, BaseDummyOptions],
161 + mm_options: MultiModalDummyOptions,
162 ) -> MultiModalDataDict:
163 - num_images = mm_counts.get("image", 0)
164 -
163 target_width, target_height = self.info.get_image_size_with_most_features()
164
167 - image_overrides = mm_options.get("image")
168 -
165 return {
166 "image": self._get_dummy_images(
167 width=target_width,
168 height=target_height,
173 - num_images=num_images,
174 - overrides=image_overrides,
169 + num_images=mm_counts.get("image", 0),
170 + overrides=mm_options.get("image"),
171 )
172 }
173
vllm/model_executor/models/step3_vl.py
+4 -7
@@ -11,7 +11,7 @@ import torch.nn.functional as F
11 from transformers import BatchFeature
12
13 from vllm.config import VllmConfig
14 -from vllm.config.multimodal import BaseDummyOptions
14 +from vllm.config.multimodal import MultiModalDummyOptions
15 from vllm.distributed import get_tensor_model_parallel_world_size
16 from vllm.inputs import MultiModalDataDict
17 from vllm.model_executor.layers.activation import get_act_fn
@@ -139,19 +139,16 @@ class Step3VLDummyInputsBuilder(BaseDummyInputsBuilder[Step3VLProcessingInfo]):
139 self,
140 seq_len: int,
141 mm_counts: Mapping[str, int],
142 - mm_options: Mapping[str, BaseDummyOptions],
142 + mm_options: MultiModalDummyOptions,
143 ) -> MultiModalDataDict:
144 target_width, target_height = self.info.get_image_size_with_most_features()
145 - num_images = mm_counts.get("image", 0)
146 -
147 - image_overrides = mm_options.get("image")
145
146 return {
147 "image": self._get_dummy_images(
148 width=target_width,
149 height=target_height,
153 - num_images=num_images,
154 - overrides=image_overrides,
150 + num_images=mm_counts.get("image", 0),
151 + overrides=mm_options.get("image"),
152 )
153 }
154
vllm/model_executor/models/terratorch.py
+2 -2
@@ -33,7 +33,7 @@ from terratorch.vllm import (
33 from transformers import BatchFeature
34
35 from vllm.config import VllmConfig
36 -from vllm.config.multimodal import BaseDummyOptions
36 +from vllm.config.multimodal import MultiModalDummyOptions
37 from vllm.inputs import ModalityData, MultiModalDataDict, MultiModalInput, mm_input
38 from vllm.logger import init_logger
39 from vllm.model_executor.layers.pooler import IdentityPooler
@@ -153,7 +153,7 @@ class TerratorchInputBuilder(BaseDummyInputsBuilder[TerratorchProcessingInfo]):
153 self,
154 seq_len: int,
155 mm_counts: Mapping[str, int],
156 - mm_options: Mapping[str, BaseDummyOptions],
156 + mm_options: MultiModalDummyOptions,
157 ) -> MultiModalDataDict:
158 # Dummy data is generated based on the 'input' section
159 # defined in the HF configuration file
vllm/model_executor/models/transformers/multimodal.py
+7 -13
@@ -27,7 +27,6 @@ from packaging.version import Version
27 from transformers.utils.generic import ModelOutput
28
29 from vllm.compilation.decorators import should_torch_compile_mm_encoder
30 -from vllm.config.multimodal import AudioDummyOptions
30 from vllm.config.utils import getattr_iter
31 from vllm.inputs import (
32 MultiModalDataBuiltins,
@@ -75,7 +74,7 @@ if TYPE_CHECKING:
74 from transformers import BatchFeature, PreTrainedModel
75
76 from vllm.config import VllmConfig
78 - from vllm.config.multimodal import BaseDummyOptions
77 + from vllm.config.multimodal import MultiModalDummyOptions
78
79 logger = init_logger(__name__)
80
@@ -195,7 +194,7 @@ class MultiModalDummyInputsBuilder(BaseDummyInputsBuilder[MultiModalProcessingIn
194 self,
195 seq_len: int,
196 mm_counts: Mapping[str, int],
198 - mm_options: Mapping[str, "BaseDummyOptions"],
197 + mm_options: "MultiModalDummyOptions",
198 ) -> MultiModalDataDict:
199 data = MultiModalDataBuiltins()
200 if self.info._is_audio_model() and (num_audios := mm_counts.get("audio", 0)):
@@ -204,21 +203,16 @@ class MultiModalDummyInputsBuilder(BaseDummyInputsBuilder[MultiModalProcessingIn
203 chunk_length = getattr(sub, "chunk_length", None) if sub else None
204 if chunk_length is None:
205 chunk_length = 30
207 - audio_len = int(chunk_length * sampling_rate)
208 - audio_overrides = mm_options.get("audio")
209 - assert audio_overrides is None or isinstance(
210 - audio_overrides, AudioDummyOptions
211 - )
206 data["audio"] = self._get_dummy_audios(
213 - length=audio_len,
207 + length=int(chunk_length * sampling_rate),
208 num_audios=num_audios,
215 - overrides=audio_overrides,
209 + overrides=mm_options.get("audio"),
210 )
211 if self.info._is_image_model() and (num_images := mm_counts.get("image", 0)):
218 - target_width, target_height = self.info.get_image_size_with_most_features()
212 + width, height = self.info.get_image_size_with_most_features()
213 data["image"] = self._get_dummy_images(
220 - width=target_width,
221 - height=target_height,
214 + width=width,
215 + height=height,
216 num_images=num_images,
217 overrides=mm_options.get("image"),
218 )
vllm/model_executor/models/ultravox.py
+4 -7
@@ -16,7 +16,7 @@ from transformers import BatchFeature, ProcessorMixin
16 from transformers.models.whisper import WhisperFeatureExtractor
17
18 from vllm.config import VllmConfig
19 -from vllm.config.multimodal import BaseDummyOptions
19 +from vllm.config.multimodal import MultiModalDummyOptions
20 from vllm.distributed import get_tensor_model_parallel_world_size
21 from vllm.inputs import MultiModalDataDict
22 from vllm.model_executor.layers.activation import MulAndSilu, get_act_fn
@@ -169,7 +169,7 @@ class UltravoxDummyInputsBuilder(BaseDummyInputsBuilder[UltravoxProcessingInfo])
169 self,
170 seq_len: int,
171 mm_counts: Mapping[str, int],
172 - mm_options: Mapping[str, BaseDummyOptions],
172 + mm_options: MultiModalDummyOptions,
173 ) -> MultiModalDataDict:
174 feature_extractor = self.info.get_feature_extractor()
175
@@ -177,15 +177,12 @@ class UltravoxDummyInputsBuilder(BaseDummyInputsBuilder[UltravoxProcessingInfo])
177 audio_len = (
178 feature_extractor.chunk_length * sampling_rate * _MAX_ENCODER_BATCH_SIZE
179 )
180 - num_audios = mm_counts.get("audio", 0)
181 -
182 - audio_overrides = mm_options.get("audio")
180
181 return {
182 "audio": self._get_dummy_audios(
183 length=audio_len,
187 - num_audios=num_audios,
188 - overrides=audio_overrides,
184 + num_audios=mm_counts.get("audio", 0),
185 + overrides=mm_options.get("audio"),
186 )
187 }
188
vllm/model_executor/models/voxtral.py
+5 -9
@@ -19,7 +19,7 @@ from mistral_common.tokens.tokenizers.audio import Audio
19 from transformers import WhisperConfig
20
21 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
22 -from vllm.config.multimodal import BaseDummyOptions
22 +from vllm.config.multimodal import MultiModalDummyOptions
23 from vllm.config.speech_to_text import SpeechToTextParams
24 from vllm.inputs import MultiModalDataDict, PromptType, TokensPrompt
25 from vllm.logger import init_logger
@@ -137,19 +137,15 @@ class VoxtralDummyInputsBuilder(BaseDummyInputsBuilder[VoxtralProcessingInfo]):
137 self,
138 seq_len: int,
139 mm_counts: Mapping[str, int],
140 - mm_options: Mapping[str, BaseDummyOptions],
140 + mm_options: MultiModalDummyOptions,
141 ) -> MultiModalDataDict:
142 - num_audios = mm_counts.get("audio", 0)
143 -
142 target_length = self.info.get_max_audio_array_len()
143
146 - audio_overrides = mm_options.get("audio")
147 -
144 return {
145 "audio": self._get_dummy_audios(
146 length=target_length,
151 - num_audios=num_audios,
152 - overrides=audio_overrides,
147 + num_audios=mm_counts.get("audio", 0),
148 + overrides=mm_options.get("audio"),
149 )
150 }
151
@@ -157,7 +153,7 @@ class VoxtralDummyInputsBuilder(BaseDummyInputsBuilder[VoxtralProcessingInfo]):
153 self,
154 seq_len: int,
155 mm_counts: Mapping[str, int],
160 - mm_options: Mapping[str, BaseDummyOptions],
156 + mm_options: MultiModalDummyOptions,
157 mm_data: MultiModalDataDict | None = None,
158 ) -> ProcessorInputs:
159 tokenizer = self.info.get_tokenizer()
vllm/model_executor/models/whisper.py
+4 -7
@@ -19,7 +19,7 @@ from transformers.models.whisper.modeling_whisper import sinusoids
19
20 from vllm.compilation.decorators import support_torch_compile
21 from vllm.config import CacheConfig, ModelConfig, SpeechToTextConfig, VllmConfig
22 -from vllm.config.multimodal import BaseDummyOptions
22 +from vllm.config.multimodal import MultiModalDummyOptions
23 from vllm.config.speech_to_text import SpeechToTextParams
24 from vllm.distributed import get_tensor_model_parallel_world_size
25 from vllm.inputs import (
@@ -724,21 +724,18 @@ class WhisperDummyInputsBuilder(BaseDummyInputsBuilder[WhisperProcessingInfo]):
724 self,
725 seq_len: int,
726 mm_counts: Mapping[str, int],
727 - mm_options: Mapping[str, BaseDummyOptions],
727 + mm_options: MultiModalDummyOptions,
728 ) -> MultiModalDataDict:
729 feature_extractor = self.info.get_feature_extractor()
730
731 sampling_rate = feature_extractor.sampling_rate
732 audio_len = feature_extractor.chunk_length * sampling_rate
733 - num_audios = mm_counts.get("audio", 0)
734 -
735 - audio_overrides = mm_options.get("audio")
733
734 return {
735 "audio": self._get_dummy_audios(
736 length=audio_len,
740 - num_audios=num_audios,
741 - overrides=audio_overrides,
737 + num_audios=mm_counts.get("audio", 0),
738 + overrides=mm_options.get("audio"),
739 )
740 }
741
vllm/models/deepseek_v4/common/mm_preprocess.py
+4 -4
@@ -22,7 +22,7 @@ reference's out-of-vocab scheme.
22
23 import math
24 from collections.abc import Mapping, Sequence
25 -from typing import Any, cast
25 +from typing import Any
26
27 import numpy as np
28 import torch
@@ -30,7 +30,7 @@ from PIL import Image, ImageOps
30 from transformers import BatchFeature
31 from typing_extensions import assert_never
32
33 -from vllm.config.multimodal import BaseDummyOptions, ImageDummyOptions
33 +from vllm.config.multimodal import MultiModalDummyOptions
34 from vllm.inputs import MultiModalDataDict
35 from vllm.multimodal.inputs import MultiModalFieldConfig, MultiModalKwargsItems
36 from vllm.multimodal.parse import ImageSize, MultiModalDataItems
@@ -375,7 +375,7 @@ class DeepseekV4VLDummyInputsBuilder(
375 self,
376 seq_len: int,
377 mm_counts: Mapping[str, int],
378 - mm_options: Mapping[str, BaseDummyOptions],
378 + mm_options: MultiModalDummyOptions,
379 ) -> MultiModalDataDict:
380 size = self.info.get_image_size_with_most_features()
381 return {
@@ -383,7 +383,7 @@ class DeepseekV4VLDummyInputsBuilder(
383 width=size.width,
384 height=size.height,
385 num_images=mm_counts.get("image", 0),
386 - overrides=cast(ImageDummyOptions | None, mm_options.get("image")),
386 + overrides=mm_options.get("image"),
387 ),
388 }
389
vllm/models/deepseek_v41/common/mm_preprocess.py
+4 -4
@@ -19,14 +19,14 @@ boundaries freely).
19
20 import math
21 from collections.abc import Mapping, Sequence
22 -from typing import Any, cast
22 +from typing import Any
23
24 import numpy as np
25 import torch
26 from PIL import Image, ImageOps
27 from transformers import BatchFeature
28
29 -from vllm.config.multimodal import BaseDummyOptions, ImageDummyOptions
29 +from vllm.config.multimodal import MultiModalDummyOptions
30 from vllm.inputs import MultiModalDataDict
31 from vllm.multimodal.inputs import MultiModalFieldConfig, MultiModalKwargsItems
32 from vllm.multimodal.parse import ImageSize, MultiModalDataItems
@@ -296,7 +296,7 @@ class DeepseekV4VLDummyInputsBuilder(
296 self,
297 seq_len: int,
298 mm_counts: Mapping[str, int],
299 - mm_options: Mapping[str, BaseDummyOptions],
299 + mm_options: MultiModalDummyOptions,
300 ) -> MultiModalDataDict:
301 size = self.info.get_image_size_with_most_features()
302 return {
@@ -304,7 +304,7 @@ class DeepseekV4VLDummyInputsBuilder(
304 width=size.width,
305 height=size.height,
306 num_images=mm_counts.get("image", 0),
307 - overrides=cast(ImageDummyOptions | None, mm_options.get("image")),
307 + overrides=mm_options.get("image"),
308 ),
309 }
310
vllm/models/dots3_note/common/processor.py
+5 -8
@@ -13,10 +13,7 @@ from PIL import Image
13 from transformers import BatchFeature
14
15 from vllm.config.multimodal import (
16 - AudioDummyOptions,
17 - BaseDummyOptions,
18 - ImageDummyOptions,
19 - VideoDummyOptions,
16 + MultiModalDummyOptions,
17 )
18 from vllm.inputs import MultiModalDataDict
19 from vllm.multimodal.inputs import MultiModalFieldConfig, MultiModalKwargsItems
@@ -584,7 +581,7 @@ class Dots3NoteDummyInputsBuilder(BaseDummyInputsBuilder[Dots3NoteProcessingInfo
581 self,
582 seq_len: int,
583 mm_counts: Mapping[str, int],
587 - mm_options: Mapping[str, BaseDummyOptions],
584 + mm_options: MultiModalDummyOptions,
585 ) -> MultiModalDataDict:
586 data: dict[str, Any] = {}
587 num_images = mm_counts.get("image", 0)
@@ -594,7 +591,7 @@ class Dots3NoteDummyInputsBuilder(BaseDummyInputsBuilder[Dots3NoteProcessingInfo
591 width=width,
592 height=height,
593 num_images=num_images,
597 - overrides=cast(ImageDummyOptions | None, mm_options.get("image")),
594 + overrides=mm_options.get("image"),
595 )
596 num_audios = mm_counts.get("audio", 0)
597 if num_audios:
@@ -611,7 +608,7 @@ class Dots3NoteDummyInputsBuilder(BaseDummyInputsBuilder[Dots3NoteProcessingInfo
608 data["audio"] = self._get_dummy_audios(
609 length=min(chunk_samples, max(1, seq_len) * stride),
610 num_audios=num_audios,
614 - overrides=cast(AudioDummyOptions | None, mm_options.get("audio")),
611 + overrides=mm_options.get("audio"),
612 )
613 num_videos = mm_counts.get("video", 0)
614 if num_videos:
@@ -625,7 +622,7 @@ class Dots3NoteDummyInputsBuilder(BaseDummyInputsBuilder[Dots3NoteProcessingInfo
622 height=height,
623 num_frames=num_frames,
624 num_videos=num_videos,
628 - overrides=cast(VideoDummyOptions | None, mm_options.get("video")),
625 + overrides=mm_options.get("video"),
626 )
627 return data
628
vllm/models/inkling/common/mm_preprocess.py
+4 -8
@@ -13,9 +13,7 @@ import torch
13 from transformers.feature_extraction_utils import BatchFeature
14
15 from vllm.config.multimodal import (
16 - AudioDummyOptions,
17 - BaseDummyOptions,
18 - ImageDummyOptions,
16 + MultiModalDummyOptions,
17 )
18 from vllm.inputs import MultiModalDataDict
19 from vllm.multimodal.inputs import (
@@ -145,7 +143,7 @@ class InklingDummyInputsBuilder(BaseDummyInputsBuilder[InklingProcessingInfo]):
143 self,
144 seq_len: int,
145 mm_counts: Mapping[str, int],
148 - mm_options: Mapping[str, BaseDummyOptions],
146 + mm_options: MultiModalDummyOptions,
147 ) -> MultiModalDataDict:
148 config = self.info.get_hf_config()
149 num_images = mm_counts.get("image", 0)
@@ -156,12 +154,11 @@ class InklingDummyInputsBuilder(BaseDummyInputsBuilder[InklingProcessingInfo]):
154 patch_size = getattr(config.vision_config, "patch_size", 40)
155 # A square image ~4 patches wide so the dummy emits several patches.
156 side = patch_size * 4
159 - image_overrides = mm_options.get("image")
157 mm_data["image"] = self._get_dummy_images(
158 width=side,
159 height=side,
160 num_images=num_images,
164 - overrides=cast(ImageDummyOptions | None, image_overrides),
161 + overrides=mm_options.get("image"),
162 )
163 if num_audios:
164 # Size the dummy at the maximum allowed audio so memory/encoder
@@ -169,11 +166,10 @@ class InklingDummyInputsBuilder(BaseDummyInputsBuilder[InklingProcessingInfo]):
166 params = self.info.get_hf_processor().audio_feature_extractor.params
167 hop = int(round(params.audio_token_duration_s * params.sample_rate))
168 audio_len = MAX_AUDIO_TOKENS * hop
172 - audio_overrides = mm_options.get("audio")
169 mm_data["audio"] = self._get_dummy_audios(
170 length=audio_len,
171 num_audios=num_audios,
176 - overrides=cast(AudioDummyOptions | None, audio_overrides),
172 + overrides=mm_options.get("audio"),
173 )
174 return mm_data
175
vllm/models/kimi_k3/common/mm_preprocess.py
+3 -4
@@ -9,7 +9,7 @@ from typing import Any, cast
9 import torch
10 from transformers import BatchFeature
11
12 -from vllm.config.multimodal import BaseDummyOptions, ImageDummyOptions
12 +from vllm.config.multimodal import ImageDummyOptions, MultiModalDummyOptions
13 from vllm.inputs import MultiModalDataDict
14 from vllm.logger import init_logger
15 from vllm.multimodal.inputs import (
@@ -204,7 +204,7 @@ class KimiK3DummyInputsBuilder(BaseDummyInputsBuilder[KimiK3ProcessingInfo]):
204 self,
205 seq_len: int,
206 mm_counts: Mapping[str, int],
207 - mm_options: Mapping[str, BaseDummyOptions] | None = None,
207 + mm_options: MultiModalDummyOptions | None = None,
208 ) -> MultiModalDataDict:
209 media_proc_cfg = self.info.image_processor.media_proc_cfg
210 max_size = self.info.get_max_image_size(
@@ -214,7 +214,6 @@ class KimiK3DummyInputsBuilder(BaseDummyInputsBuilder[KimiK3ProcessingInfo]):
214 media_proc_cfg["patch_limit_on_one_side"],
215 media_proc_cfg["fixed_output_tokens"],
216 )
217 - num_images = mm_counts.get("image", 0)
217 image_overrides = cast(
218 ImageDummyOptions | None,
219 mm_options.get("image") if mm_options else None,
@@ -223,7 +222,7 @@ class KimiK3DummyInputsBuilder(BaseDummyInputsBuilder[KimiK3ProcessingInfo]):
222 "image": self._get_dummy_images(
223 width=max_size.width,
224 height=max_size.height,
226 - num_images=num_images,
225 + num_images=mm_counts.get("image", 0),
226 overrides=image_overrides,
227 )
228 }
vllm/models/minimax_m3/common/mm_preprocess.py
+4 -6
@@ -11,9 +11,7 @@ from transformers import BatchFeature
11 from transformers.video_utils import VideoMetadata
12
13 from vllm.config.multimodal import (
14 - BaseDummyOptions,
15 - ImageDummyOptions,
16 - VideoDummyOptions,
14 + MultiModalDummyOptions,
15 )
16 from vllm.inputs import MultiModalDataDict
17 from vllm.multimodal.inputs import (
@@ -283,7 +281,7 @@ class MiniMaxM3VLDummyInputsBuilder(BaseDummyInputsBuilder[MiniMaxM3VLProcessing
281 self,
282 seq_len: int,
283 mm_counts: Mapping[str, int],
286 - mm_options: Mapping[str, BaseDummyOptions],
284 + mm_options: MultiModalDummyOptions,
285 ) -> MultiModalDataDict:
286 size = self.info.get_image_size_with_most_features()
287 video_size = self.info.get_video_size_with_most_features()
@@ -293,14 +291,14 @@ class MiniMaxM3VLDummyInputsBuilder(BaseDummyInputsBuilder[MiniMaxM3VLProcessing
291 width=size.width,
292 height=size.height,
293 num_images=mm_counts.get("image", 0),
296 - overrides=cast(ImageDummyOptions | None, mm_options.get("image")),
294 + overrides=mm_options.get("image"),
295 ),
296 "video": self._get_dummy_videos(
297 width=video_size.width,
298 height=video_size.height,
299 num_frames=num_frames,
300 num_videos=mm_counts.get("video", 0),
303 - overrides=cast(VideoDummyOptions | None, mm_options.get("video")),
301 + overrides=mm_options.get("video"),
302 ),
303 }
304
vllm/multimodal/processing/dummy_inputs.py
+4 -5
@@ -10,8 +10,8 @@ from PIL import Image
10
11 from vllm.config.multimodal import (
12 AudioDummyOptions,
13 - BaseDummyOptions,
13 ImageDummyOptions,
14 + MultiModalDummyOptions,
15 VideoDummyOptions,
16 )
17 from vllm.inputs import MultiModalDataDict
@@ -45,7 +45,7 @@ class BaseDummyInputsBuilder(ABC, Generic[_I]):
45 self,
46 seq_len: int,
47 mm_counts: Mapping[str, int],
48 - mm_options: Mapping[str, BaseDummyOptions],
48 + mm_options: MultiModalDummyOptions,
49 ) -> MultiModalDataDict:
50 """Build the multimodal input which, after processing, results in
51 the maximum possible number of placeholder tokens.
@@ -65,7 +65,7 @@ class BaseDummyInputsBuilder(ABC, Generic[_I]):
65 self,
66 seq_len: int,
67 mm_counts: Mapping[str, int],
68 - mm_options: Mapping[str, BaseDummyOptions],
68 + mm_options: MultiModalDummyOptions,
69 ) -> ProcessorInputs:
70 """Build the input which, after processing, results in
71 the maximum possible number of placeholder tokens.
@@ -124,9 +124,8 @@ class BaseDummyInputsBuilder(ABC, Generic[_I]):
124 width: int,
125 height: int,
126 num_images: int,
127 - overrides: BaseDummyOptions | None = None,
127 + overrides: ImageDummyOptions | None = None,
128 ) -> list[Image.Image]:
129 - assert overrides is None or isinstance(overrides, ImageDummyOptions)
129 if num_images == 0:
130 return []
131 if overrides: