@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / 9ad7f89f55
Fork 0

A high-throughput and memory-efficient inference and serving engine for LLMs

Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git

Synced Nov 9, 16:00 UTC

[Models]: Make Multimodal config implicit in ViT implementation (#31972)

Signed-off-by: Isotr0py <mozf@mail2.sysu.edu.cn>

Isotr0py committed Jan 24, 2026 at 20:34 UTC 9ad7f89f55b7046d0498608eb85b94b2dc5c2666
38 files changed +118 -470
vllm/model_executor/layers/attention/mm_encoder_attention.py
-9
@@ -4,7 +4,6 @@
4
5 import torch
6
7 -from vllm.config import MultiModalConfig
7 from vllm.logger import init_logger
8 from vllm.model_executor.custom_op import CustomOp
9 from vllm.model_executor.models.vision import get_vit_attn_backend
@@ -32,7 +31,6 @@ class MMEncoderAttention(CustomOp):
31 scale: float | None = None,
32 num_kv_heads: int | None = None,
33 prefix: str = "",
35 - multimodal_config: MultiModalConfig | None = None,
34 ) -> None:
35 """
36 Args:
@@ -42,7 +40,6 @@ class MMEncoderAttention(CustomOp):
40 num_kv_heads: number of kv heads.
41 prefix: This has no effect, it is only here to make it easier to
42 swap between Attention and MultiHeadAttention
45 - multimodal_config: configs for multi-modal.
43 """
44 super().__init__()
45
@@ -62,16 +59,10 @@ class MMEncoderAttention(CustomOp):
59 # weight and activation dtype.
60 dtype = torch.get_default_dtype()
61
65 - # Try to get vision attention backend from multimodal_config.
66 - attn_backend_override = None
67 - if multimodal_config is not None:
68 - attn_backend_override = multimodal_config.mm_encoder_attn_backend
69 -
62 # Get device-specific vision attention backend.
63 self.attn_backend = get_vit_attn_backend(
64 head_size=head_size,
65 dtype=dtype,
74 - attn_backend_override=attn_backend_override,
66 )
67
68 self.is_flash_attn_backend = self.attn_backend in {
vllm/model_executor/models/clip.py
+4 -24
@@ -16,7 +16,7 @@ from transformers import (
16
17 from vllm.attention.layer import Attention
18 from vllm.config import VllmConfig
19 -from vllm.config.multimodal import BaseDummyOptions, MultiModalConfig
19 +from vllm.config.multimodal import BaseDummyOptions
20 from vllm.distributed import divide, get_tensor_model_parallel_world_size
21 from vllm.model_executor.layers.activation import get_act_fn
22 from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
@@ -59,6 +59,7 @@ from .vision import (
59 VisionFeatureSelectStrategy,
60 VisionFeatureSelectStrategyStr,
61 get_num_selected_vision_tokens,
62 + is_vit_use_data_parallel,
63 resolve_visual_encoder_outputs,
64 )
65
@@ -353,7 +354,6 @@ class CLIPAttention(nn.Module):
354 self,
355 config: CLIPTextConfig | CLIPVisionConfig,
356 quant_config: QuantizationConfig | None = None,
356 - multimodal_config: MultiModalConfig | None = None,
357 *,
358 prefix: str = "",
359 attn_cls: type[Attention] | type[MMEncoderAttention],
@@ -372,11 +372,7 @@ class CLIPAttention(nn.Module):
372 )
373 self.scale = self.head_dim**-0.5
374
375 - use_data_parallel = (
376 - multimodal_config.mm_encoder_tp_mode == "data"
377 - if multimodal_config
378 - else False
379 - )
375 + use_data_parallel = is_vit_use_data_parallel()
376 self.qkv_proj = QKVParallelLinear(
377 hidden_size=self.embed_dim,
378 head_size=self.head_dim,
@@ -405,7 +401,6 @@ class CLIPAttention(nn.Module):
401 self.head_dim,
402 self.scale,
403 prefix=f"{prefix}.attn",
408 - multimodal_config=multimodal_config,
404 )
405 else:
406 self.attn = attn_cls(
@@ -434,17 +429,12 @@ class CLIPMLP(nn.Module):
429 self,
430 config: CLIPTextConfig | CLIPVisionConfig,
431 quant_config: QuantizationConfig | None = None,
437 - multimodal_config: MultiModalConfig | None = None,
432 prefix: str = "",
433 ) -> None:
434 super().__init__()
435
436 self.config = config
443 - use_data_parallel = (
444 - multimodal_config.mm_encoder_tp_mode == "data"
445 - if multimodal_config
446 - else False
447 - )
437 + use_data_parallel = is_vit_use_data_parallel()
438 self.activation_fn = get_act_fn(config.hidden_act)
439
440 self.fc1 = ColumnParallelLinear(
@@ -477,7 +467,6 @@ class CLIPEncoderLayer(nn.Module):
467 self,
468 config: CLIPTextConfig | CLIPVisionConfig,
469 quant_config: QuantizationConfig | None = None,
480 - multimodal_config: MultiModalConfig | None = None,
470 *,
471 prefix: str = "",
472 attn_cls: type[Attention] | type[MMEncoderAttention],
@@ -487,7 +476,6 @@ class CLIPEncoderLayer(nn.Module):
476 self.self_attn = CLIPAttention(
477 config,
478 quant_config=quant_config,
490 - multimodal_config=multimodal_config,
479 prefix=f"{prefix}.self_attn",
480 attn_cls=attn_cls,
481 )
@@ -495,7 +483,6 @@ class CLIPEncoderLayer(nn.Module):
483 self.mlp = CLIPMLP(
484 config,
485 quant_config=quant_config,
498 - multimodal_config=multimodal_config,
486 prefix=f"{prefix}.mlp",
487 )
488 self.layer_norm2 = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
@@ -528,7 +515,6 @@ class CLIPEncoder(nn.Module):
515 self,
516 config: CLIPTextConfig | CLIPVisionConfig,
517 quant_config: QuantizationConfig | None = None,
531 - multimodal_config: MultiModalConfig | None = None,
518 num_hidden_layers_override: int | None = None,
519 *,
520 prefix: str = "",
@@ -548,7 +534,6 @@ class CLIPEncoder(nn.Module):
534 CLIPEncoderLayer(
535 config=config,
536 quant_config=quant_config,
551 - multimodal_config=multimodal_config,
537 prefix=f"{prefix}.layers.{layer_idx}",
538 attn_cls=attn_cls,
539 )
@@ -658,7 +643,6 @@ class CLIPVisionTransformer(nn.Module):
643 self,
644 config: CLIPVisionConfig,
645 quant_config: QuantizationConfig | None = None,
661 - multimodal_config: MultiModalConfig | None = None,
646 *,
647 num_hidden_layers_override: int | None = None,
648 require_post_norm: bool | None = None,
@@ -678,7 +662,6 @@ class CLIPVisionTransformer(nn.Module):
662 self.encoder = CLIPEncoder(
663 config=config,
664 quant_config=quant_config,
681 - multimodal_config=multimodal_config,
665 num_hidden_layers_override=num_hidden_layers_override,
666 prefix=f"{prefix}.encoder",
667 attn_cls=MMEncoderAttention,
@@ -780,7 +763,6 @@ class CLIPVisionModel(nn.Module):
763 self,
764 config: CLIPVisionConfig,
765 quant_config: QuantizationConfig | None = None,
783 - multimodal_config: MultiModalConfig | None = None,
766 *,
767 num_hidden_layers_override: int | None = None,
768 require_post_norm: bool | None = None,
@@ -791,7 +773,6 @@ class CLIPVisionModel(nn.Module):
773 self.vision_model = CLIPVisionTransformer(
774 config=config,
775 quant_config=quant_config,
794 - multimodal_config=multimodal_config,
776 num_hidden_layers_override=num_hidden_layers_override,
777 require_post_norm=require_post_norm,
778 prefix=f"{prefix}.vision_model",
@@ -869,7 +850,6 @@ class CLIPEmbeddingModel(nn.Module, SupportsMultiModal, SupportsQuant):
850 self.vision_model = CLIPVisionTransformer(
851 vision_config,
852 quant_config=quant_config,
872 - multimodal_config=multimodal_config,
853 prefix=maybe_prefix(prefix, "vision_model"),
854 )
855 self.visual_projection = nn.Linear(
vllm/model_executor/models/deepencoder.py
-3
@@ -18,7 +18,6 @@ import torch.nn as nn
18 import torch.nn.functional as F
19 from transformers import CLIPVisionConfig
20
21 -from vllm.config import MultiModalConfig
21 from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
22 from vllm.model_executor.layers.conv import Conv2dLayer
23 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -609,7 +608,6 @@ class DeepCLIPVisionTransformer(nn.Module):
608 self,
609 config: CLIPVisionConfig,
610 quant_config: QuantizationConfig | None = None,
612 - multimodal_config: MultiModalConfig | None = None,
611 *,
612 num_hidden_layers_override: int | None = None,
613 prefix: str = "",
@@ -628,7 +626,6 @@ class DeepCLIPVisionTransformer(nn.Module):
626 self.transformer = CLIPEncoder(
627 config=config,
628 quant_config=quant_config,
631 - multimodal_config=multimodal_config,
629 num_hidden_layers_override=num_hidden_layers_override,
630 prefix=f"{prefix}.encoder",
631 attn_cls=MMEncoderAttention,
vllm/model_executor/models/deepseek_ocr.py
-1
@@ -398,7 +398,6 @@ class DeepseekOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, Supports
398 self.vision_model = DeepCLIPVisionTransformer(
399 config=clip_vision_config,
400 quant_config=quant_config,
401 - multimodal_config=multimodal_config,
401 prefix=maybe_prefix(prefix, "vision_model"),
402 )
403
vllm/model_executor/models/dots_ocr.py
+5 -34
@@ -8,7 +8,7 @@ import torch.nn as nn
8 from torch.nn import LayerNorm
9 from transformers.models.qwen2_vl import Qwen2VLProcessor
10
11 -from vllm.config import MultiModalConfig, VllmConfig
11 +from vllm.config import VllmConfig
12 from vllm.config.multimodal import BaseDummyOptions
13 from vllm.distributed import utils as dist_utils
14 from vllm.distributed.parallel_state import (
@@ -60,7 +60,7 @@ from vllm.transformers_utils.configs.dotsocr import DotsOCRConfig, DotsVisionCon
60 from vllm.utils.tensor_schema import TensorSchema, TensorShape
61 from vllm.v1.attention.backends.registry import AttentionBackendEnum
62
63 -from .vision import run_dp_sharded_mrope_vision_model
63 +from .vision import is_vit_use_data_parallel, run_dp_sharded_mrope_vision_model
64
65 IMAGE_TOKEN = "<|imgpad|>"
66
@@ -183,9 +183,9 @@ class PatchMerger(nn.Module):
183 spatial_merge_size: int = 2,
184 pre_norm="layernorm",
185 prefix: str = "",
186 - use_data_parallel: bool = False,
186 ) -> None:
187 super().__init__()
188 + use_data_parallel = is_vit_use_data_parallel()
189 self.hidden_size = context_dim * (spatial_merge_size**2)
190 self.pre_norm = pre_norm
191 if self.pre_norm == "layernorm":
@@ -230,15 +230,10 @@ class DotsVisionAttention(nn.Module):
230 bias: bool = True,
231 *,
232 quant_config: QuantizationConfig | None = None,
233 - multimodal_config: MultiModalConfig | None = None,
233 prefix: str = "",
234 ) -> None:
235 super().__init__()
237 - use_data_parallel = (
238 - multimodal_config.mm_encoder_tp_mode == "data"
239 - if multimodal_config
240 - else False
241 - )
236 + use_data_parallel = is_vit_use_data_parallel()
237
238 self.embed_dim = dim
239 self.tp_size = (
@@ -272,7 +267,6 @@ class DotsVisionAttention(nn.Module):
267 num_heads=self.num_attention_heads_per_partition,
268 head_size=self.hidden_size_per_attention_head,
269 scale=self.hidden_size_per_attention_head**-0.5,
275 - multimodal_config=multimodal_config,
270 prefix=f"{prefix}.attn",
271 )
272
@@ -329,7 +323,6 @@ class DotsSwiGLUFFN(nn.Module):
323 config,
324 *,
325 quant_config: QuantizationConfig | None = None,
332 - multimodal_config: MultiModalConfig | None = None,
326 prefix: str = "",
327 ):
328 super().__init__()
@@ -337,11 +330,7 @@ class DotsSwiGLUFFN(nn.Module):
330 in_features = config.embed_dim
331 bias = config.use_bias
332
340 - use_data_parallel = (
341 - multimodal_config.mm_encoder_tp_mode == "data"
342 - if multimodal_config
343 - else False
344 - )
333 + use_data_parallel = is_vit_use_data_parallel()
334 # Referenced aimv2.py AIMv2SwiGLUFFN
335 self.fc13 = MergedColumnParallelLinear(
336 in_features,
@@ -447,7 +436,6 @@ class DotsVisionBlock(nn.Module):
436 config,
437 *,
438 quant_config: QuantizationConfig | None = None,
450 - multimodal_config: MultiModalConfig | None = None,
439 prefix: str = "",
440 ):
441 super().__init__()
@@ -458,14 +446,12 @@ class DotsVisionBlock(nn.Module):
446 num_heads=config.num_attention_heads,
447 bias=config.use_bias,
448 quant_config=quant_config,
461 - multimodal_config=multimodal_config,
449 prefix=f"{prefix}.attn",
450 )
451 self.norm1 = RMSNorm(config.embed_dim, eps=config.rms_norm_eps)
452 self.mlp = DotsSwiGLUFFN(
453 config,
454 quant_config=quant_config,
468 - multimodal_config=multimodal_config,
455 prefix=f"{prefix}.mlp",
456 )
457 self.norm2 = RMSNorm(config.embed_dim, eps=config.rms_norm_eps)
@@ -493,7 +479,6 @@ class DotsVisionTransformer(nn.Module):
479 self,
480 config: DotsVisionConfig,
481 quant_config: QuantizationConfig | None = None,
496 - multimodal_config: MultiModalConfig | None = None,
482 *,
483 num_hidden_layers_override: int | None = None,
484 require_post_norm: bool | None = None,
@@ -507,15 +492,9 @@ class DotsVisionTransformer(nn.Module):
492
493 head_dim = config.embed_dim // config.num_attention_heads
494 self.rotary_pos_emb = VisionRotaryEmbedding(head_dim // 2)
510 - attn_backend_override = (
511 - multimodal_config.mm_encoder_attn_backend
512 - if multimodal_config is not None
513 - else None
514 - )
495 self.attn_backend = get_vit_attn_backend(
496 head_size=head_dim,
497 dtype=torch.get_default_dtype(),
518 - attn_backend_override=attn_backend_override,
498 )
499 self.out_hidden_size = config.hidden_size
500 # Keep blocks for compatibility with other vision towers
@@ -529,7 +508,6 @@ class DotsVisionTransformer(nn.Module):
508 DotsVisionBlock(
509 config,
510 quant_config=quant_config,
532 - multimodal_config=multimodal_config,
511 prefix=f"{prefix}.blocks.{i}",
512 )
513 for i in range(num_layers)
@@ -542,16 +520,10 @@ class DotsVisionTransformer(nn.Module):
520 else:
521 self.post_trunk_norm = None
522
545 - use_data_parallel = (
546 - multimodal_config.mm_encoder_tp_mode == "data"
547 - if multimodal_config
548 - else False
549 - )
523 self.merger = PatchMerger(
524 dim=config.hidden_size,
525 context_dim=config.embed_dim,
526 spatial_merge_size=config.spatial_merge_size,
554 - use_data_parallel=use_data_parallel,
527 )
528
529 @property
@@ -693,7 +665,6 @@ class DotsOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, SupportsLoRA
665 self.vision_tower = DotsVisionTransformer(
666 vision_config,
667 quant_config=self.quant_config,
696 - multimodal_config=multimodal_config,
668 prefix=maybe_prefix(prefix, "vision_tower"),
669 )
670
vllm/model_executor/models/eagle2_5_vl.py
-1
@@ -270,7 +270,6 @@ class Eagle2_5_VLForConditionalGeneration(
270 return SiglipVisionModel(
271 vision_config,
272 quant_config=quant_config,
273 - multimodal_config=self.multimodal_config,
273 num_hidden_layers_override=num_hidden_layers,
274 prefix=prefix,
275 )
vllm/model_executor/models/ernie45_vl.py
+1 -12
@@ -36,7 +36,7 @@ import torch.nn.functional as F
36 from einops import rearrange
37 from transformers import BatchFeature
38
39 -from vllm.config import MultiModalConfig, VllmConfig
39 +from vllm.config import VllmConfig
40 from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
41 from vllm.distributed import parallel_state
42 from vllm.distributed import utils as dist_utils
@@ -119,7 +119,6 @@ class Ernie4_5_VisionAttention(nn.Module):
119 num_heads: int,
120 projection_size: int,
121 quant_config: QuantizationConfig | None = None,
122 - multimodal_config: MultiModalConfig | None = None,
122 prefix: str = "",
123 ) -> None:
124 super().__init__()
@@ -153,7 +152,6 @@ class Ernie4_5_VisionAttention(nn.Module):
152 num_heads=self.num_attention_heads_per_partition,
153 head_size=self.hidden_size_per_attention_head,
154 scale=self.hidden_size_per_attention_head**-0.5,
156 - multimodal_config=multimodal_config,
155 prefix=f"{prefix}.attn",
156 )
157
@@ -266,7 +264,6 @@ class Ernie4_5_VisionBlock(nn.Module):
264 act_layer: type[nn.Module] = QuickGELU,
265 norm_layer: Callable[[int], nn.Module] | None = None,
266 quant_config: QuantizationConfig | None = None,
269 - multimodal_config: MultiModalConfig | None = None,
267 prefix: str = "",
268 ) -> None:
269 super().__init__()
@@ -282,7 +279,6 @@ class Ernie4_5_VisionBlock(nn.Module):
279 num_heads=num_heads,
280 projection_size=dim,
281 quant_config=quant_config,
285 - multimodal_config=multimodal_config,
282 prefix=f"{prefix}.attn",
283 )
284
@@ -357,7 +353,6 @@ class Ernie4_5_VisionTransformer(nn.Module):
353 vision_config,
354 norm_eps: float = 1e-6,
355 quant_config: QuantizationConfig | None = None,
360 - multimodal_config: MultiModalConfig | None = None,
356 prefix: str = "",
357 ) -> None:
358 super().__init__()
@@ -393,7 +388,6 @@ class Ernie4_5_VisionTransformer(nn.Module):
388 mlp_ratio=mlp_ratio,
389 norm_layer=norm_layer,
390 quant_config=quant_config,
396 - multimodal_config=multimodal_config,
391 prefix=f"{prefix}.blocks.{layer_idx}",
392 )
393 for layer_idx in range(depth)
@@ -405,13 +399,9 @@ class Ernie4_5_VisionTransformer(nn.Module):
399 )
400 self.ln = nn.LayerNorm(hidden_size, eps=1e-6)
401
408 - attn_backend_override = (
409 - multimodal_config.mm_encoder_attn_backend if multimodal_config else None
410 - )
402 self.attn_backend = get_vit_attn_backend(
403 head_size=head_dim,
404 dtype=torch.get_default_dtype(),
414 - attn_backend_override=attn_backend_override,
405 )
406
407 @property
@@ -1308,7 +1298,6 @@ class Ernie4_5_VLMoeForConditionalGeneration(
1298 config.vision_config,
1299 norm_eps=getattr(config, "rms_norm_eps", 1e-6),
1300 quant_config=quant_config,
1311 - multimodal_config=multimodal_config,
1301 prefix=maybe_prefix(prefix, "vision_model"),
1302 )
1303 self.resampler_model = VariableResolutionResamplerModel(
vllm/model_executor/models/glm4_1v.py
+5 -30
@@ -46,7 +46,7 @@ from transformers.models.glm4v.image_processing_glm4v import (
46 from transformers.models.glm4v.video_processing_glm4v import Glm4vVideoProcessor
47 from transformers.video_utils import VideoMetadata
48
49 -from vllm.config import MultiModalConfig, VllmConfig
49 +from vllm.config import VllmConfig
50 from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
51 from vllm.distributed import get_tensor_model_parallel_world_size, parallel_state
52 from vllm.distributed import utils as dist_utils
@@ -107,6 +107,7 @@ from .utils import (
107 )
108 from .vision import (
109 get_vit_attn_backend,
110 + is_vit_use_data_parallel,
111 run_dp_sharded_mrope_vision_model,
112 )
113
@@ -196,15 +197,10 @@ class Glm4vVisionMLP(nn.Module):
197 hidden_features: int,
198 bias: bool = False,
199 quant_config: QuantizationConfig | None = None,
199 - multimodal_config: MultiModalConfig | None = None,
200 prefix: str = "",
201 ):
202 super().__init__()
203 - use_data_parallel = (
204 - multimodal_config.mm_encoder_tp_mode == "data"
205 - if multimodal_config
206 - else False
207 - )
203 + use_data_parallel = is_vit_use_data_parallel()
204 self.gate_up_proj = MergedColumnParallelLinear(
205 input_size=in_features,
206 output_sizes=[hidden_features] * 2,
@@ -258,16 +254,11 @@ class Glm4vVisionAttention(nn.Module):
254 num_heads: int,
255 projection_size: int,
256 quant_config: QuantizationConfig | None = None,
261 - multimodal_config: MultiModalConfig | None = None,
257 prefix: str = "",
258 ) -> None:
259 super().__init__()
260 # Per attention head and per partition values.
266 - use_data_parallel = (
267 - multimodal_config.mm_encoder_tp_mode == "data"
268 - if multimodal_config
269 - else False
270 - )
261 + use_data_parallel = is_vit_use_data_parallel()
262 self.tp_size = (
263 1 if use_data_parallel else get_tensor_model_parallel_world_size()
264 )
@@ -305,7 +296,6 @@ class Glm4vVisionAttention(nn.Module):
296 num_heads=self.num_attention_heads_per_partition,
297 head_size=self.hidden_size_per_attention_head,
298 scale=self.hidden_size_per_attention_head**-0.5,
308 - multimodal_config=multimodal_config,
299 )
300
301 self.apply_rotary_emb = ApplyRotaryEmb(enforce_enable=True)
@@ -373,7 +363,6 @@ class Glm4vVisionBlock(nn.Module):
363 mlp_hidden_dim: int,
364 norm_layer: Callable[[int], nn.Module] | None = None,
365 quant_config: QuantizationConfig | None = None,
376 - multimodal_config: MultiModalConfig | None = None,
366 prefix: str = "",
367 ) -> None:
368 super().__init__()
@@ -386,7 +375,6 @@ class Glm4vVisionBlock(nn.Module):
375 num_heads=num_heads,
376 projection_size=dim,
377 quant_config=quant_config,
389 - multimodal_config=multimodal_config,
378 prefix=f"{prefix}.attn",
379 )
380 self.mlp = Glm4vVisionMLP(
@@ -394,7 +382,6 @@ class Glm4vVisionBlock(nn.Module):
382 mlp_hidden_dim,
383 bias=False,
384 quant_config=quant_config,
397 - multimodal_config=multimodal_config,
385 prefix=f"{prefix}.mlp",
386 )
387
@@ -454,16 +441,11 @@ class Glm4vPatchMerger(nn.Module):
441 d_model: int,
442 context_dim: int,
443 quant_config: QuantizationConfig | None = None,
457 - multimodal_config: MultiModalConfig | None = None,
444 bias: bool = False,
445 prefix: str = "",
446 ) -> None:
447 super().__init__()
462 - use_data_parallel = (
463 - multimodal_config.mm_encoder_tp_mode == "data"
464 - if multimodal_config
465 - else False
466 - )
448 + use_data_parallel = is_vit_use_data_parallel()
449 self.hidden_size = d_model
450 self.proj = ColumnParallelLinear(
451 self.hidden_size,
@@ -619,13 +601,10 @@ class Glm4vVisionTransformer(nn.Module):
601 vision_config: Glm4vVisionConfig,
602 norm_eps: float = 1e-6,
603 quant_config: QuantizationConfig | None = None,
622 - multimodal_config: MultiModalConfig | None = None,
604 prefix: str = "",
605 ) -> None:
606 super().__init__()
607
627 - assert multimodal_config is not None, "multimodal_config must be provided"
628 -
608 patch_size = vision_config.patch_size
609 temporal_patch_size = vision_config.temporal_patch_size
610 in_channels = vision_config.in_channels
@@ -660,7 +639,6 @@ class Glm4vVisionTransformer(nn.Module):
639 mlp_hidden_dim=vision_config.out_hidden_size,
640 norm_layer=norm_layer,
641 quant_config=quant_config,
663 - multimodal_config=multimodal_config,
642 prefix=f"{prefix}.blocks.{layer_idx}",
643 )
644 for layer_idx in range(depth)
@@ -670,7 +648,6 @@ class Glm4vVisionTransformer(nn.Module):
648 d_model=vision_config.out_hidden_size,
649 context_dim=vision_config.intermediate_size,
650 quant_config=quant_config,
673 - multimodal_config=multimodal_config,
651 bias=False,
652 prefix=f"{prefix}.merger",
653 )
@@ -692,7 +669,6 @@ class Glm4vVisionTransformer(nn.Module):
669 self.attn_backend = get_vit_attn_backend(
670 head_size=head_dim,
671 dtype=torch.get_default_dtype(),
695 - attn_backend_override=multimodal_config.mm_encoder_attn_backend,
672 )
673
674 @property
@@ -1439,7 +1415,6 @@ class Glm4vForConditionalGeneration(
1415 config.vision_config,
1416 norm_eps=getattr(config, "rms_norm_eps", 1e-5),
1417 quant_config=quant_config,
1442 - multimodal_config=multimodal_config,
1418 prefix=maybe_prefix(prefix, "visual"),
1419 )
1420
vllm/model_executor/models/hunyuan_vision.py
+5 -26
@@ -33,7 +33,7 @@ import torch.nn as nn
33 import torch.nn.functional as F
34 from transformers import BatchFeature
35
36 -from vllm.config import MultiModalConfig, VllmConfig
36 +from vllm.config import VllmConfig
37 from vllm.config.multimodal import BaseDummyOptions
38 from vllm.distributed import parallel_state
39 from vllm.distributed import utils as dist_utils
@@ -80,7 +80,6 @@ from vllm.transformers_utils.configs.hunyuan_vl import (
80 from vllm.transformers_utils.processors.hunyuan_vl import HunYuanVLProcessor
81 from vllm.transformers_utils.processors.hunyuan_vl_image import smart_resize
82 from vllm.utils.tensor_schema import TensorSchema, TensorShape
83 -from vllm.v1.attention.backends.registry import AttentionBackendEnum
83
84 from .interfaces import (
85 MultiModalEmbeddings,
@@ -96,6 +95,7 @@ from .utils import (
95 init_vllm_registered_model,
96 maybe_prefix,
97 )
98 +from .vision import is_vit_use_data_parallel
99
100 logger = init_logger(__name__)
101
@@ -160,9 +160,9 @@ class HunYuanVisionMLP(nn.Module):
160 act_fn: Callable[[torch.Tensor], torch.Tensor] = F.gelu,
161 quant_config: QuantizationConfig | None = None,
162 prefix: str = "",
163 - use_data_parallel: bool = False,
163 ):
164 super().__init__()
165 + use_data_parallel = is_vit_use_data_parallel()
166 self.dense_h_to_4h = ColumnParallelLinear(
167 in_features,
168 hidden_features,
@@ -194,12 +194,11 @@ class HunYuanVisionAttention(nn.Module):
194 num_heads: int,
195 projection_size: int,
196 quant_config: QuantizationConfig | None = None,
197 - multimodal_config: MultiModalConfig | None = None,
197 prefix: str = "",
199 - use_data_parallel: bool = False,
198 ) -> None:
199 super().__init__()
200 # Per attention head and per partition values.
201 + use_data_parallel = is_vit_use_data_parallel()
202 self.tp_size = (
203 1
204 if use_data_parallel
@@ -237,7 +236,6 @@ class HunYuanVisionAttention(nn.Module):
236 self.hidden_size_per_attention_head,
237 self.scale,
238 prefix=f"{prefix}.attn",
240 - multimodal_config=multimodal_config,
239 )
240
241 def forward(
@@ -260,9 +258,7 @@ class HunYuanVisionBlock(nn.Module):
258 act_fn: Callable[[torch.Tensor], torch.Tensor] = F.gelu,
259 norm_layer: Callable[[int], nn.Module] | None = None,
260 quant_config: QuantizationConfig | None = None,
263 - multimodal_config: MultiModalConfig | None = None,
261 prefix: str = "",
265 - use_data_parallel: bool = False,
262 ) -> None:
263 super().__init__()
264 if norm_layer is None:
@@ -274,9 +270,7 @@ class HunYuanVisionBlock(nn.Module):
270 num_heads=num_heads,
271 projection_size=dim,
272 quant_config=quant_config,
277 - multimodal_config=multimodal_config,
273 prefix=f"{prefix}.self_attn",
279 - use_data_parallel=use_data_parallel,
274 )
275 self.mlp = HunYuanVisionMLP(
276 dim,
@@ -285,7 +279,6 @@ class HunYuanVisionBlock(nn.Module):
279 bias=True,
280 quant_config=quant_config,
281 prefix=f"{prefix}.mlp",
288 - use_data_parallel=use_data_parallel,
282 )
283
284 def forward(
@@ -439,9 +432,6 @@ class HunYuanVisionTransformer(nn.Module):
432 vision_config: HunYuanVLVisionConfig,
433 quant_config: QuantizationConfig | None = None,
434 prefix: str = "",
442 - use_data_parallel: bool = False,
443 - multimodal_config: MultiModalConfig | None = None,
444 - attn_backend_override: AttentionBackendEnum | None = None,
435 ) -> None:
436 super().__init__()
437
@@ -467,9 +457,7 @@ class HunYuanVisionTransformer(nn.Module):
457 act_fn=get_act_fn(vision_config.hidden_act),
458 norm_layer=norm_layer,
459 quant_config=quant_config,
470 - multimodal_config=multimodal_config,
460 prefix=f"{prefix}.layers.{layer_idx}",
472 - use_data_parallel=use_data_parallel,
461 )
462 for layer_idx in range(num_hidden_layers)
463 ]
@@ -872,23 +860,14 @@ class HunYuanVLForConditionalGeneration(
860 def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
861 super().__init__()
862 config: HunYuanVLConfig = vllm_config.model_config.hf_config
875 - multimodal_config = vllm_config.model_config.multimodal_config
863
864 self.config = config
878 - self.multimodal_config = multimodal_config
865
866 with self._mark_tower_model(vllm_config, {"image"}):
881 - attn_backend_override = (
882 - multimodal_config.mm_encoder_attn_backend
883 - if multimodal_config is not None
884 - else None
885 - )
867 self.visual = HunYuanVisionTransformer(
868 config.vision_config,
888 - quant_config=self.quant_config,
869 + quant_config=vllm_config.quant_config,
870 prefix=maybe_prefix(prefix, "visual"),
890 - multimodal_config=multimodal_config,
891 - attn_backend_override=attn_backend_override,
871 )
872
873 with self._mark_language_model(vllm_config):
vllm/model_executor/models/hyperclovax_vision.py
+1 -6
@@ -17,7 +17,7 @@ from timm.models.regnet import RegStage
17 from transformers import BatchFeature, CLIPVisionConfig, SiglipVisionConfig
18
19 from vllm.config import VllmConfig
20 -from vllm.config.multimodal import BaseDummyOptions, MultiModalConfig
20 +from vllm.config.multimodal import BaseDummyOptions
21 from vllm.model_executor.layers.quantization import QuantizationConfig
22 from vllm.multimodal import MULTIMODAL_REGISTRY
23 from vllm.multimodal.cache import BaseMultiModalProcessorCache
@@ -360,7 +360,6 @@ def _build_hcxvision_hf_processor(
360 def init_vision_tower_for_hcxvision(
361 vision_config,
362 quant_config: QuantizationConfig | None,
363 - multimodal_config: MultiModalConfig | None,
363 *,
364 use_nth_layer: int | None = None,
365 require_post_norm: bool | None = None,
@@ -378,7 +377,6 @@ def init_vision_tower_for_hcxvision(
377 return CLIPVisionModel(
378 vision_config,
379 quant_config=quant_config,
381 - multimodal_config=multimodal_config,
380 num_hidden_layers_override=num_hidden_layers,
381 require_post_norm=require_post_norm,
382 prefix=prefix,
@@ -387,7 +385,6 @@ def init_vision_tower_for_hcxvision(
385 return SiglipVisionModel(
386 vision_config,
387 quant_config=quant_config,
390 - multimodal_config=multimodal_config,
388 num_hidden_layers_override=num_hidden_layers,
389 require_post_norm=require_post_norm,
390 prefix=prefix,
@@ -605,7 +602,6 @@ class HCXVisionForCausalLM(nn.Module, SupportsMultiModal, SupportsPP):
602 # init configs
603 config = vllm_config.model_config.hf_config
604 quant_config = vllm_config.quant_config
608 - multimodal_config = vllm_config.model_config.multimodal_config
605 # text_config
606 text_config = config.text_config
607 if text_config.model_type in ["gpt2", "hyperclovax", "llama"]:
@@ -628,7 +624,6 @@ class HCXVisionForCausalLM(nn.Module, SupportsMultiModal, SupportsPP):
624 self.vision_model = init_vision_tower_for_hcxvision(
625 vision_config,
626 quant_config=quant_config,
631 - multimodal_config=multimodal_config,
627 use_nth_layer=getattr(config, "use_nth_layer", -1),
628 require_post_norm=False,
629 prefix=maybe_prefix(prefix, "vision_model"),
vllm/model_executor/models/isaac.py
+4 -18
@@ -16,7 +16,7 @@ from transformers.image_processing_utils import BatchFeature
16 from transformers.tokenization_utils import TensorType
17 from typing_extensions import TypedDict, Unpack
18
19 -from vllm.config import MultiModalConfig, VllmConfig
19 +from vllm.config import VllmConfig
20 from vllm.config.model import ModelConfig
21 from vllm.distributed import parallel_state
22 from vllm.distributed import utils as dist_utils
@@ -72,6 +72,8 @@ from vllm.transformers_utils.configs import (
72 )
73 from vllm.utils.tensor_schema import TensorSchema, TensorShape
74
75 +from .vision import is_vit_use_data_parallel
76 +
77
78 def create_cumulative_seq_lengths(
79 seq_sizes: torch.Tensor, device: torch.device
@@ -942,15 +944,10 @@ class Siglip2VisionAttention(nn.Module):
944 quant_config: QuantizationConfig | None = None,
945 *,
946 prefix: str = "",
945 - multimodal_config: MultiModalConfig | None = None,
947 ) -> None:
948 super().__init__()
949
949 - use_data_parallel = (
950 - multimodal_config.mm_encoder_tp_mode == "data"
951 - if multimodal_config
952 - else False
953 - )
950 + use_data_parallel = is_vit_use_data_parallel()
951 self.tp_size = (
952 1
953 if use_data_parallel
@@ -987,7 +984,6 @@ class Siglip2VisionAttention(nn.Module):
984 head_size=self.hidden_size_per_attention_head,
985 scale=self.hidden_size_per_attention_head**-0.5,
986 prefix=f"{prefix}.attn",
990 - multimodal_config=multimodal_config,
987 )
988
989 def split_qkv(self, qkv: torch.Tensor) -> tuple[torch.Tensor, ...]:
@@ -1038,7 +1034,6 @@ class Siglip2EncoderLayer(nn.Module):
1034 quant_config: QuantizationConfig | None = None,
1035 *,
1036 prefix: str = "",
1041 - multimodal_config: MultiModalConfig | None = None,
1037 ) -> None:
1038 super().__init__()
1039 self.embed_dim = config.hidden_size
@@ -1047,7 +1042,6 @@ class Siglip2EncoderLayer(nn.Module):
1042 config,
1043 quant_config=quant_config,
1044 prefix=f"{prefix}.self_attn",
1050 - multimodal_config=multimodal_config,
1045 )
1046 self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)
1047 self.mlp = SiglipMLP(
@@ -1088,7 +1082,6 @@ class Siglip2Encoder(nn.Module):
1082 quant_config: QuantizationConfig | None = None,
1083 *,
1084 prefix: str = "",
1091 - multimodal_config: MultiModalConfig | None = None,
1085 ) -> None:
1086 super().__init__()
1087 self.config = config
@@ -1098,7 +1091,6 @@ class Siglip2Encoder(nn.Module):
1091 config,
1092 quant_config=quant_config,
1093 prefix=f"{prefix}.layers.{layer_idx}",
1101 - multimodal_config=multimodal_config,
1094 )
1095 for layer_idx in range(config.num_hidden_layers)
1096 ]
@@ -1127,7 +1119,6 @@ class Siglip2VisionTransformer(nn.Module):
1119 config: PixelShuffleSiglip2VisionConfig,
1120 quant_config: QuantizationConfig | None = None,
1121 prefix: str = "",
1130 - multimodal_config: MultiModalConfig | None = None,
1122 ):
1123 super().__init__()
1124 self.config = config
@@ -1140,7 +1131,6 @@ class Siglip2VisionTransformer(nn.Module):
1131 config,
1132 quant_config=quant_config,
1133 prefix=f"{prefix}.encoder",
1143 - multimodal_config=multimodal_config,
1134 )
1135 self.post_layernorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)
1136
@@ -1221,14 +1211,12 @@ class IsaacVisionEmbedding(nn.Module):
1211 hidden_dim: int,
1212 output_dim: int,
1213 quant_config: QuantizationConfig | None = None,
1224 - multimodal_config: MultiModalConfig | None = None,
1214 prefix: str = "",
1215 ):
1216 super().__init__()
1217 self.transformer = Siglip2VisionTransformer(
1218 vision_cfg,
1219 quant_config=quant_config,
1231 - multimodal_config=multimodal_config,
1220 prefix=maybe_prefix(prefix, "0"),
1221 )
1222 self.linear_fc1 = ColumnParallelLinear(
@@ -1309,7 +1297,6 @@ class IsaacForConditionalGeneration(
1297 config: IsaacConfig = vllm_config.model_config.hf_config
1298 quant_config = vllm_config.quant_config
1299 self.config = config
1312 - self.multimodal_config = vllm_config.model_config.multimodal_config
1300
1301 head_dim = config.head_dim
1302 calculated_mrope_section = [
@@ -1373,7 +1360,6 @@ class IsaacForConditionalGeneration(
1360 hidden_dim=hidden_dim,
1361 output_dim=config.hidden_size,
1362 quant_config=quant_config,
1376 - multimodal_config=self.multimodal_config,
1363 prefix=maybe_prefix(prefix, "vision_embedding"),
1364 )
1365
vllm/model_executor/models/keye.py
+4 -16
@@ -16,7 +16,7 @@ from transformers.feature_extraction_utils import BatchFeature
16 from transformers.modeling_outputs import BaseModelOutput, BaseModelOutputWithPooling
17 from transformers.utils import torch_int
18
19 -from vllm.config import MultiModalConfig, VllmConfig
19 +from vllm.config import VllmConfig
20 from vllm.config.multimodal import BaseDummyOptions
21 from vllm.distributed import get_tensor_model_parallel_world_size
22 from vllm.logger import init_logger
@@ -80,6 +80,7 @@ from .utils import (
80 is_pp_missing_parameter,
81 maybe_prefix,
82 )
83 +from .vision import is_vit_use_data_parallel
84
85 logger = init_logger(__name__)
86
@@ -358,7 +359,6 @@ class KeyeSiglipAttention(nn.Module):
359 self,
360 config: PretrainedConfig,
361 quant_config: QuantizationConfig | None = None,
361 - multimodal_config: MultiModalConfig | None = None,
362 prefix: str = "",
363 ):
364 super().__init__()
@@ -366,7 +366,8 @@ class KeyeSiglipAttention(nn.Module):
366
367 hidden_size = config.hidden_size
368 self.hidden_size = config.hidden_size
369 - tp_size = get_tensor_model_parallel_world_size()
369 + use_data_parallel = is_vit_use_data_parallel()
370 + tp_size = 1 if use_data_parallel else get_tensor_model_parallel_world_size()
371 self.total_num_heads = config.num_attention_heads
372 assert self.total_num_heads % tp_size == 0
373 self.num_heads = self.total_num_heads // tp_size
@@ -403,7 +404,6 @@ class KeyeSiglipAttention(nn.Module):
404 scale=self.scale,
405 num_kv_heads=self.num_kv_heads,
406 prefix=f"{prefix}.attn",
406 - multimodal_config=multimodal_config,
407 )
408
409 self.apply_rotary_emb = ApplyRotaryEmb(
@@ -497,7 +497,6 @@ class KeyeSiglipEncoderLayer(nn.Module):
497 self,
498 config: PretrainedConfig,
499 quant_config: QuantizationConfig | None = None,
500 - multimodal_config: MultiModalConfig | None = None,
500 prefix: str = "",
501 ):
502 super().__init__()
@@ -506,14 +505,12 @@ class KeyeSiglipEncoderLayer(nn.Module):
505 self.self_attn = KeyeSiglipAttention(
506 config,
507 quant_config=quant_config,
509 - multimodal_config=multimodal_config,
508 prefix=f"{prefix}.self_attn",
509 )
510 self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)
511 self.mlp = SiglipMLP(
512 config,
513 quant_config=quant_config,
516 - multimodal_config=multimodal_config,
514 prefix=f"{prefix}.mlp",
515 )
516
@@ -552,7 +549,6 @@ class KeyeSiglipEncoder(nn.Module):
549 self,
550 config: PretrainedConfig,
551 quant_config: QuantizationConfig | None = None,
555 - multimodal_config: MultiModalConfig | None = None,
552 prefix: str = "",
553 ):
554 super().__init__()
@@ -565,7 +561,6 @@ class KeyeSiglipEncoder(nn.Module):
561 KeyeSiglipEncoderLayer(
562 config,
563 quant_config=quant_config,
568 - multimodal_config=multimodal_config,
564 prefix=f"{prefix}.layers.{layer_idx}",
565 )
566 for layer_idx in range(config.num_hidden_layers)
@@ -647,7 +642,6 @@ class KeyeSiglipVisionTransformer(nn.Module):
642 self,
643 config: PretrainedConfig,
644 quant_config: QuantizationConfig | None = None,
650 - multimodal_config: MultiModalConfig | None = None,
645 prefix: str = "",
646 ):
647 super().__init__()
@@ -658,7 +652,6 @@ class KeyeSiglipVisionTransformer(nn.Module):
652 self.encoder = KeyeSiglipEncoder(
653 config,
654 quant_config=quant_config,
661 - multimodal_config=multimodal_config,
655 prefix=f"{prefix}.encoder",
656 )
657 self.post_layernorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)
@@ -730,7 +723,6 @@ class KeyeSiglipVisionModel(nn.Module):
723 self,
724 config: PretrainedConfig,
725 quant_config: QuantizationConfig | None = None,
733 - multimodal_config: MultiModalConfig | None = None,
726 prefix: str = "",
727 ):
728 super().__init__()
@@ -738,7 +730,6 @@ class KeyeSiglipVisionModel(nn.Module):
730 self.vision_model = KeyeSiglipVisionTransformer(
731 config,
732 quant_config=quant_config,
741 - multimodal_config=multimodal_config,
733 prefix=f"{prefix}.vision_model",
734 )
735 self.quant_config = quant_config
@@ -1275,16 +1266,13 @@ class BaseKeyeModule(nn.Module, SupportsMultiModal):
1266 super().__init__()
1267 config: PretrainedConfig = vllm_config.model_config.hf_config
1268 quant_config = vllm_config.quant_config
1278 - multimodal_config = vllm_config.model_config.multimodal_config
1269
1270 self.config = config
1281 - self.multimodal_config = multimodal_config
1271
1272 with self._mark_tower_model(vllm_config, {"image", "video"}):
1273 self.visual = KeyeSiglipVisionModel(
1274 config.vision_config,
1275 quant_config=quant_config,
1287 - multimodal_config=multimodal_config,
1276 prefix=maybe_prefix(prefix, "visual"),
1277 )
1278 self.mlp_AR = self._build_projector(
vllm/model_executor/models/kimi_vl.py
-1
@@ -317,7 +317,6 @@ class KimiVLForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsPP):
317 with self._mark_tower_model(vllm_config, "image"):
318 self.vision_tower = MoonVitPretrainedModel(
319 config.vision_config,
320 - multimodal_config=model_config.multimodal_config,
320 prefix=maybe_prefix(prefix, "vision_tower"),
321 )
322 self.multi_modal_projector = KimiVLMultiModalProjector(
vllm/model_executor/models/lfm2_siglip2.py
+3 -22
@@ -11,7 +11,6 @@ from torch.nn import functional as F
11 from transformers import Siglip2VisionConfig
12
13 from vllm.compilation.decorators import support_torch_compile
14 -from vllm.config import MultiModalConfig
14 from vllm.distributed import get_tensor_model_parallel_world_size
15 from vllm.model_executor.layers.activation import get_act_fn
16 from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
@@ -23,7 +22,7 @@ from vllm.model_executor.layers.linear import (
22 from vllm.model_executor.layers.quantization import QuantizationConfig
23 from vllm.model_executor.model_loader.weight_utils import default_weight_loader
24
26 -from .vision import should_torch_compile_mm_vit
25 +from .vision import is_vit_use_data_parallel, should_torch_compile_mm_vit
26
27
28 class Siglip2VisionEmbeddings(nn.Module):
@@ -154,7 +153,6 @@ class Siglip2Attention(nn.Module):
153 self,
154 config: Siglip2VisionConfig,
155 quant_config: QuantizationConfig | None = None,
157 - multimodal_config: MultiModalConfig | None = None,
156 prefix: str = "",
157 ):
158 super().__init__()
@@ -171,10 +169,7 @@ class Siglip2Attention(nn.Module):
169 self.scale = self.head_dim**-0.5
170 self.dropout = config.attention_dropout
171
174 - use_data_parallel = (
175 - multimodal_config is not None
176 - and multimodal_config.mm_encoder_tp_mode == "data"
177 - )
172 + use_data_parallel = is_vit_use_data_parallel()
173 tp_size = 1 if use_data_parallel else get_tensor_model_parallel_world_size()
174 assert self.num_heads % tp_size == 0
175 self.num_heads_per_partition = self.num_heads // tp_size
@@ -199,7 +194,6 @@ class Siglip2Attention(nn.Module):
194 head_size=self.head_dim,
195 scale=self.scale,
196 prefix=f"{prefix}.attn",
202 - multimodal_config=multimodal_config,
197 )
198
199 def forward(
@@ -241,16 +235,12 @@ class Siglip2MLP(nn.Module):
235 self,
236 config: Siglip2VisionConfig,
237 quant_config: QuantizationConfig | None = None,
244 - multimodal_config: MultiModalConfig | None = None,
238 prefix: str = "",
239 ):
240 super().__init__()
241 self.config = config
242 self.activation_fn = get_act_fn(config.hidden_act)
250 - use_data_parallel = (
251 - multimodal_config is not None
252 - and multimodal_config.mm_encoder_tp_mode == "data"
253 - )
243 + use_data_parallel = is_vit_use_data_parallel()
244 self.fc1 = ColumnParallelLinear(
245 config.hidden_size,
246 config.intermediate_size,
@@ -282,7 +272,6 @@ class Siglip2EncoderLayer(nn.Module):
272 self,
273 config: Siglip2VisionConfig,
274 quant_config: QuantizationConfig | None = None,
285 - multimodal_config: MultiModalConfig | None = None,
275 prefix: str = "",
276 ):
277 super().__init__()
@@ -291,14 +280,12 @@ class Siglip2EncoderLayer(nn.Module):
280 self.self_attn = Siglip2Attention(
281 config,
282 quant_config=quant_config,
294 - multimodal_config=multimodal_config,
283 prefix=f"{prefix}.self_attn",
284 )
285 self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)
286 self.mlp = Siglip2MLP(
287 config,
288 quant_config=quant_config,
301 - multimodal_config=multimodal_config,
289 prefix=f"{prefix}.mlp",
290 )
291
@@ -344,7 +331,6 @@ class Siglip2Encoder(nn.Module):
331 self,
332 config: Siglip2VisionConfig,
333 quant_config: QuantizationConfig | None = None,
347 - multimodal_config: MultiModalConfig | None = None,
334 prefix: str = "",
335 ):
336 super().__init__()
@@ -354,7 +340,6 @@ class Siglip2Encoder(nn.Module):
340 Siglip2EncoderLayer(
341 config=config,
342 quant_config=quant_config,
357 - multimodal_config=multimodal_config,
343 prefix=f"{prefix}.layers.{idx}",
344 )
345 for idx in range(config.num_hidden_layers)
@@ -383,7 +368,6 @@ class Siglip2VisionTransformer(nn.Module):
368 self,
369 config: Siglip2VisionConfig,
370 quant_config: QuantizationConfig | None = None,
386 - multimodal_config: MultiModalConfig | None = None,
371 prefix: str = "",
372 ):
373 super().__init__()
@@ -397,7 +381,6 @@ class Siglip2VisionTransformer(nn.Module):
381 self.encoder = Siglip2Encoder(
382 config,
383 quant_config=quant_config,
400 - multimodal_config=multimodal_config,
384 prefix=f"{prefix}.encoder",
385 )
386 num_hidden_layers = config.num_hidden_layers
@@ -438,7 +421,6 @@ class Siglip2Model(torch.nn.Module):
421 self,
422 config: Siglip2VisionConfig,
423 quant_config: QuantizationConfig | None = None,
441 - multimodal_config: MultiModalConfig | None = None,
424 prefix: str = "",
425 ):
426 super().__init__()
@@ -446,7 +428,6 @@ class Siglip2Model(torch.nn.Module):
428 self.vision_model = Siglip2VisionTransformer(
429 config,
430 quant_config=quant_config,
449 - multimodal_config=multimodal_config,
431 prefix=f"{prefix}.vision_model",
432 )
433
vllm/model_executor/models/lfm2_vl.py
-1
@@ -600,7 +600,6 @@ class Lfm2VLForConditionalGeneration(
600 self.vision_tower = Siglip2Model(
601 config=vision_config,
602 quant_config=quant_config,
603 - multimodal_config=multimodal_config,
603 prefix=maybe_prefix(prefix, "vision_tower"),
604 )
605 else:
vllm/model_executor/models/lightonocr.py
-1
@@ -166,7 +166,6 @@ class LightOnOCRForConditionalGeneration(Mistral3ForConditionalGeneration):
166 self.vision_tower = init_vision_tower_for_llava(
167 config,
168 quant_config=quant_config,
169 - multimodal_config=multimodal_config,
169 require_post_norm=False,
170 prefix=maybe_prefix(prefix, "vision_tower"),
171 )
vllm/model_executor/models/llava.py
+1 -6
@@ -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, MultiModalConfig
22 +from vllm.config.multimodal import BaseDummyOptions
23 from vllm.model_executor.layers.activation import get_act_fn
24 from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
25 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -456,7 +456,6 @@ def _get_num_hidden_layers(hf_config: LlavaLikeConfig) -> int:
456 def init_vision_tower_for_llava(
457 hf_config: LlavaLikeConfig,
458 quant_config: QuantizationConfig | None,
459 - multimodal_config: MultiModalConfig | None,
459 *,
460 require_post_norm: bool | None = None,
461 prefix: str = "",
@@ -470,7 +469,6 @@ def init_vision_tower_for_llava(
469 return CLIPVisionModel(
470 vision_config,
471 quant_config=quant_config,
473 - multimodal_config=multimodal_config,
472 num_hidden_layers_override=num_hidden_layers,
473 require_post_norm=require_post_norm,
474 prefix=prefix,
@@ -479,7 +477,6 @@ def init_vision_tower_for_llava(
477 return SiglipVisionModel(
478 vision_config,
479 quant_config=quant_config,
482 - multimodal_config=multimodal_config,
480 num_hidden_layers_override=num_hidden_layers,
481 require_post_norm=require_post_norm,
482 prefix=prefix,
@@ -488,7 +485,6 @@ def init_vision_tower_for_llava(
485 return PixtralHFVisionModel(
486 vision_config,
487 quant_config=quant_config,
491 - multimodal_config=multimodal_config,
488 num_hidden_layers_override=num_hidden_layers,
489 require_post_norm=require_post_norm,
490 prefix=prefix,
@@ -562,7 +558,6 @@ class LlavaForConditionalGeneration(
558 self.vision_tower = init_vision_tower_for_llava(
559 config,
560 quant_config=quant_config,
565 - multimodal_config=multimodal_config,
561 require_post_norm=False,
562 prefix=maybe_prefix(prefix, "vision_tower"),
563 )
vllm/model_executor/models/llava_next.py
-1
@@ -272,7 +272,6 @@ class LlavaNextForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsP
272 self.vision_tower = init_vision_tower_for_llava(
273 config,
274 quant_config=quant_config,
275 - multimodal_config=multimodal_config,
275 require_post_norm=False,
276 prefix=maybe_prefix(prefix, "vision_tower"),
277 )
vllm/model_executor/models/llava_next_video.py
-1
@@ -332,7 +332,6 @@ class LlavaNextVideoForConditionalGeneration(nn.Module, SupportsMultiModal, Supp
332 self.vision_tower = init_vision_tower_for_llava(
333 config,
334 quant_config=quant_config,
335 - multimodal_config=multimodal_config,
335 require_post_norm=False,
336 prefix=maybe_prefix(prefix, "vision_tower"),
337 )
vllm/model_executor/models/llava_onevision.py
-1
@@ -513,7 +513,6 @@ class LlavaOnevisionForConditionalGeneration(nn.Module, SupportsMultiModal, Supp
513 self.vision_tower = init_vision_tower_for_llava(
514 config,
515 quant_config=quant_config,
516 - multimodal_config=multimodal_config,
516 require_post_norm=False,
517 prefix=maybe_prefix(prefix, "vision_tower"),
518 )
vllm/model_executor/models/minimax_vl_01.py
-1
@@ -205,7 +205,6 @@ class MiniMaxVL01ForConditionalGeneration(nn.Module, SupportsMultiModal, Support
205 self.vision_tower = init_vision_tower_for_llava(
206 config,
207 quant_config=quant_config,
208 - multimodal_config=multimodal_config,
208 require_post_norm=False,
209 prefix=maybe_prefix(prefix, "vision_tower"),
210 )
vllm/model_executor/models/mistral3.py
+1 -4
@@ -16,7 +16,7 @@ from transformers import (
16 from transformers.models.pixtral import PixtralProcessor
17
18 from vllm.config import VllmConfig
19 -from vllm.config.multimodal import BaseDummyOptions, MultiModalConfig
19 +from vllm.config.multimodal import BaseDummyOptions
20 from vllm.model_executor.layers.activation import get_act_fn
21 from vllm.model_executor.layers.layernorm import RMSNorm
22 from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
@@ -382,7 +382,6 @@ def _get_num_hidden_layers(hf_config: LlavaLikeConfig) -> int:
382 def init_vision_tower_for_llava(
383 hf_config: LlavaLikeConfig,
384 quant_config: QuantizationConfig | None,
385 - multimodal_config: MultiModalConfig | None,
385 *,
386 require_post_norm: bool | None = None,
387 prefix: str = "",
@@ -397,7 +396,6 @@ def init_vision_tower_for_llava(
396 return PixtralHFVisionModel(
397 vision_config,
398 quant_config=quant_config,
400 - multimodal_config=multimodal_config,
399 num_hidden_layers_override=num_hidden_layers,
400 require_post_norm=require_post_norm,
401 prefix=prefix,
@@ -461,7 +459,6 @@ class Mistral3ForConditionalGeneration(
459 self.vision_tower = init_vision_tower_for_llava(
460 config,
461 quant_config=quant_config,
464 - multimodal_config=multimodal_config,
462 require_post_norm=False,
463 prefix=maybe_prefix(prefix, "vision_tower"),
464 )
vllm/model_executor/models/moonvit.py
+3 -15
@@ -52,7 +52,6 @@ import torch.nn.functional as F
52 from transformers.activations import ACT2FN
53 from transformers.modeling_utils import PreTrainedModel
54
55 -from vllm.config import MultiModalConfig
55 from vllm.distributed import divide, get_tensor_model_parallel_world_size
56 from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
57 from vllm.model_executor.layers.conv import Conv2dLayer
@@ -62,6 +61,7 @@ from vllm.model_executor.layers.linear import (
61 RowParallelLinear,
62 )
63 from vllm.model_executor.models.utils import maybe_prefix
64 +from vllm.model_executor.models.vision import is_vit_use_data_parallel
65 from vllm.platforms import current_platform
66 from vllm.transformers_utils.configs.moonvit import MoonViTConfig
67
@@ -308,11 +308,10 @@ class MLP2(nn.Module):
308 activation,
309 bias: bool = True,
310 prefix: str = "",
311 - use_data_parallel: bool = False,
311 ):
312 super().__init__()
313 assert len(dims) == 3
315 - self.use_data_parallel = use_data_parallel
314 + self.use_data_parallel = is_vit_use_data_parallel()
315 self.fc0 = ColumnParallelLinear(
316 dims[0],
317 dims[1],
@@ -343,17 +342,12 @@ class MoonVitEncoderLayer(nn.Module):
342 hidden_dim: int,
343 mlp_dim: int,
344 prefix: str = "",
346 - multimodal_config: MultiModalConfig | None = None,
345 *,
346 activation=F.gelu,
347 attn_bias: bool = False,
348 ):
349 super().__init__()
352 - self.use_data_parallel = (
353 - multimodal_config.mm_encoder_tp_mode == "data"
354 - if multimodal_config
355 - else False
356 - )
350 + self.use_data_parallel = is_vit_use_data_parallel()
351
352 self.num_heads = num_heads
353 self.hidden_dim = hidden_dim
@@ -369,7 +363,6 @@ class MoonVitEncoderLayer(nn.Module):
363 [hidden_dim, mlp_dim, hidden_dim],
364 activation,
365 prefix=f"{prefix}.mlp",
372 - use_data_parallel=self.use_data_parallel,
366 )
367 self.wqkv = QKVParallelLinear(
368 hidden_size=hidden_dim,
@@ -391,7 +384,6 @@ class MoonVitEncoderLayer(nn.Module):
384 num_heads=self.num_attention_heads_per_partition,
385 head_size=self.hidden_size_per_attention_head,
386 scale=self.hidden_size_per_attention_head**-0.5,
394 - multimodal_config=multimodal_config,
387 prefix=f"{prefix}.attn",
388 )
389
@@ -469,7 +461,6 @@ class MoonVitEncoder(nn.Module):
461 num_layers: int,
462 block_cfg: dict,
463 prefix: str = "",
472 - multimodal_config: MultiModalConfig | None = None,
464 ) -> None:
465 super().__init__()
466
@@ -479,7 +470,6 @@ class MoonVitEncoder(nn.Module):
470 self.blocks = nn.ModuleList(
471 [
472 MoonVitEncoderLayer(
482 - multimodal_config=multimodal_config,
473 prefix=f"{prefix}.blocks.{layer_idx}",
474 **block_cfg,
475 )
@@ -550,7 +540,6 @@ class MoonVitPretrainedModel(PreTrainedModel):
540 def __init__(
541 self,
542 config: MoonViTConfig,
553 - multimodal_config: MultiModalConfig | None = None,
543 prefix: str = "",
544 *inputs,
545 **kwargs,
@@ -579,7 +568,6 @@ class MoonVitPretrainedModel(PreTrainedModel):
568 "attn_bias": True,
569 },
570 prefix=f"{prefix}.encoder",
582 - multimodal_config=multimodal_config,
571 )
572
573 def forward(
vllm/model_executor/models/opencua.py
-1
@@ -244,7 +244,6 @@ class OpenCUAForConditionalGeneration(Qwen2_5_VLForConditionalGeneration):
244 vision_config=config.vision_config,
245 norm_eps=getattr(config, "rms_norm_eps", 1e-6),
246 quant_config=self.quant_config,
247 - multimodal_config=self.multimodal_config,
247 prefix=maybe_prefix(prefix, "visual"),
248 )
249
vllm/model_executor/models/ovis2_5.py
+1 -7
@@ -10,7 +10,7 @@ import torch
10 import torch.nn as nn
11 from transformers import BaseImageProcessor, BatchFeature, PretrainedConfig
12
13 -from vllm.config import MultiModalConfig, VllmConfig
13 +from vllm.config import VllmConfig
14 from vllm.config.multimodal import BaseDummyOptions
15 from vllm.model_executor.layers.linear import ReplicatedLinear
16 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -103,7 +103,6 @@ class VisualTokenizer(torch.nn.Module):
103 config: PretrainedConfig,
104 visual_vocab_size: int,
105 quant_config: QuantizationConfig | None = None,
106 - multimodal_config: MultiModalConfig | None = None,
106 prefix: str = "",
107 ):
108 super().__init__()
@@ -111,7 +110,6 @@ class VisualTokenizer(torch.nn.Module):
110 self.vit = self._init_backbone(
111 config=config,
112 quant_config=quant_config,
114 - multimodal_config=multimodal_config,
113 prefix=f"{prefix}.vit",
114 )
115 # reserved tokens for INDICATOR_IDS
@@ -130,7 +128,6 @@ class VisualTokenizer(torch.nn.Module):
128 self,
129 config: PretrainedConfig,
130 quant_config: QuantizationConfig | None = None,
133 - multimodal_config: QuantizationConfig | None = None,
131 prefix: str = "",
132 ):
133 model_type = config.model_type
@@ -138,7 +135,6 @@ class VisualTokenizer(torch.nn.Module):
135 return Siglip2NavitModel(
136 config=config,
137 quant_config=quant_config,
141 - multimodal_config=multimodal_config,
138 prefix=prefix,
139 )
140 raise ValueError(f"Unsupported visual tokenizer model_type: {model_type}")
@@ -464,7 +460,6 @@ class Ovis2_5(nn.Module, SupportsMultiModal, SupportsPP):
460 super().__init__()
461 config = vllm_config.model_config.hf_config
462 quant_config = vllm_config.quant_config
467 - multimodal_config = vllm_config.model_config.multimodal_config
463
464 self.config: PretrainedConfig = config
465
@@ -478,7 +473,6 @@ class Ovis2_5(nn.Module, SupportsMultiModal, SupportsPP):
473 self.visual_tokenizer = VisualTokenizer(
474 config=config.vit_config,
475 visual_vocab_size=config.visual_vocab_size,
481 - multimodal_config=multimodal_config,
476 quant_config=quant_config,
477 prefix=f"{prefix}.visual_tokenizer",
478 )
vllm/model_executor/models/paddleocr_vl.py
+1 -19
@@ -30,7 +30,7 @@ from transformers.modeling_outputs import (
30 )
31 from transformers.utils import torch_int
32
33 -from vllm.config import MultiModalConfig, VllmConfig
33 +from vllm.config import VllmConfig
34 from vllm.config.multimodal import BaseDummyOptions
35 from vllm.distributed import parallel_state
36 from vllm.distributed import utils as dist_utils
@@ -532,7 +532,6 @@ class SiglipAttention(nn.Module):
532 num_heads: int,
533 projection_size: int,
534 quant_config: QuantizationConfig | None = None,
535 - multimodal_config: MultiModalConfig | None = None,
535 prefix: str = "",
536 ) -> None:
537 super().__init__()
@@ -565,7 +564,6 @@ class SiglipAttention(nn.Module):
564 num_heads=self.num_attention_heads_per_partition,
565 head_size=self.hidden_size_per_attention_head,
566 scale=self.hidden_size_per_attention_head**-0.5,
568 - multimodal_config=multimodal_config,
567 prefix=f"{prefix}.attn",
568 )
569 self.apply_rotary_emb = ApplyRotaryEmb(
@@ -662,7 +660,6 @@ class SiglipEncoderLayer(nn.Module):
660 self,
661 config: PretrainedConfig,
662 quant_config: QuantizationConfig | None = None,
665 - multimodal_config: MultiModalConfig | None = None,
663 prefix: str = "",
664 ):
665 super().__init__()
@@ -673,14 +670,12 @@ class SiglipEncoderLayer(nn.Module):
670 num_heads=config.num_attention_heads,
671 projection_size=config.hidden_size,
672 quant_config=quant_config,
676 - multimodal_config=multimodal_config,
673 prefix=f"{prefix}.self_attn",
674 )
675 self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)
676 self.mlp = SiglipMLP(
677 config,
678 quant_config=quant_config,
683 - multimodal_config=multimodal_config,
679 prefix=f"{prefix}.mlp",
680 )
681
@@ -718,7 +713,6 @@ class SiglipEncoder(nn.Module):
713 self,
714 config: PretrainedConfig,
715 quant_config: QuantizationConfig | None = None,
721 - multimodal_config: MultiModalConfig | None = None,
716 prefix: str = "",
717 ):
718 super().__init__()
@@ -727,13 +721,9 @@ class SiglipEncoder(nn.Module):
721 num_heads = config.num_attention_heads
722 head_dim = embed_dim // num_heads
723
730 - attn_backend_override = (
731 - multimodal_config.mm_encoder_attn_backend if multimodal_config else None
732 - )
724 self.attn_backend = get_vit_attn_backend(
725 head_size=head_dim,
726 dtype=torch.get_default_dtype(),
736 - attn_backend_override=attn_backend_override,
727 )
728 if self.attn_backend not in {
729 AttentionBackendEnum.FLASH_ATTN,
@@ -748,7 +738,6 @@ class SiglipEncoder(nn.Module):
738 SiglipEncoderLayer(
739 config,
740 quant_config=quant_config,
751 - multimodal_config=multimodal_config,
741 prefix=f"{prefix}.layers.{layer_idx}",
742 )
743 for layer_idx in range(config.num_hidden_layers)
@@ -830,7 +819,6 @@ class SiglipVisionTransformer(nn.Module):
819 self,
820 config: PretrainedConfig,
821 quant_config: QuantizationConfig | None = None,
833 - multimodal_config: MultiModalConfig | None = None,
822 prefix: str = "",
823 ):
824 super().__init__()
@@ -841,7 +829,6 @@ class SiglipVisionTransformer(nn.Module):
829 self.encoder = SiglipEncoder(
830 config,
831 quant_config=quant_config,
844 - multimodal_config=multimodal_config,
832 prefix=f"{prefix}.encoder",
833 )
834 self.post_layernorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)
@@ -880,7 +867,6 @@ class SiglipVisionModel(nn.Module):
867 self,
868 config,
869 quant_config: QuantizationConfig | None = None,
883 - multimodal_config: MultiModalConfig | None = None,
870 prefix: str = "",
871 ):
872 super().__init__()
@@ -888,7 +874,6 @@ class SiglipVisionModel(nn.Module):
874 self.vision_model = SiglipVisionTransformer(
875 config,
876 quant_config=quant_config,
891 - multimodal_config=multimodal_config,
877 prefix=f"{prefix}.vision_model",
878 )
879 self.quant_config = quant_config
@@ -1010,16 +995,13 @@ class PaddleOCRVLForConditionalGeneration(nn.Module, SupportsMultiModal, Support
995 super().__init__()
996 config = vllm_config.model_config.hf_config
997 quant_config = vllm_config.quant_config
1013 - multimodal_config = vllm_config.model_config.multimodal_config
998
999 self.config = config
1016 - self.multimodal_config = multimodal_config
1000
1001 with self._mark_tower_model(vllm_config, "image"):
1002 self.visual = SiglipVisionModel(
1003 config=config.vision_config,
1004 quant_config=quant_config,
1022 - multimodal_config=multimodal_config,
1005 prefix=maybe_prefix(prefix, "visual"),
1006 )
1007 self.mlp_AR = Projector(config, config.vision_config)
vllm/model_executor/models/phi3v.py
+1 -6
@@ -29,7 +29,7 @@ from transformers import (
29 )
30
31 from vllm.config import VllmConfig
32 -from vllm.config.multimodal import BaseDummyOptions, MultiModalConfig
32 +from vllm.config.multimodal import BaseDummyOptions
33 from vllm.logger import init_logger
34 from vllm.model_executor.layers.quantization import QuantizationConfig
35 from vllm.model_executor.layers.vocab_parallel_embedding import VocabParallelEmbedding
@@ -96,7 +96,6 @@ CLIP_VIT_LARGE_PATCH14_336_CONFIG = CLIPVisionConfig(
96 def _init_img_processor(
97 hf_config: PretrainedConfig,
98 quant_config: QuantizationConfig | None,
99 - multimodal_config: MultiModalConfig | None,
99 prefix: str = "",
100 ) -> CLIPVisionModel:
101 clip_config = CLIP_VIT_LARGE_PATCH14_336_CONFIG
@@ -111,7 +110,6 @@ def _init_img_processor(
110 img_processor = CLIPVisionModel(
111 clip_config,
112 quant_config=quant_config,
114 - multimodal_config=multimodal_config,
113 num_hidden_layers_override=num_hidden_layers,
114 prefix=prefix,
115 )
@@ -170,7 +168,6 @@ class Phi3HDImageEmbedding(nn.Module):
168 self,
169 config: PretrainedConfig,
170 quant_config: QuantizationConfig | None,
173 - multimodal_config: MultiModalConfig | None,
171 prefix: str = "",
172 ) -> None:
173 super().__init__()
@@ -181,7 +178,6 @@ class Phi3HDImageEmbedding(nn.Module):
178 self.img_processor = _init_img_processor(
179 config,
180 quant_config=quant_config,
184 - multimodal_config=multimodal_config,
181 prefix=f"{prefix}.img_processor",
182 )
183
@@ -596,7 +592,6 @@ class Phi3VForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, SupportsQuant)
592 self.vision_embed_tokens = Phi3HDImageEmbedding(
593 config,
594 quant_config=quant_config,
599 - multimodal_config=multimodal_config,
595 prefix=maybe_prefix(prefix, "model.vision_embed_tokens"),
596 )
597
vllm/model_executor/models/pixtral.py
+4 -20
@@ -28,7 +28,7 @@ from transformers.models.pixtral.modeling_pixtral import (
28 from transformers.tokenization_utils_base import TextInput
29
30 from vllm.config import VllmConfig
31 -from vllm.config.multimodal import BaseDummyOptions, MultiModalConfig
31 +from vllm.config.multimodal import BaseDummyOptions
32 from vllm.distributed import divide, get_tensor_model_parallel_world_size
33 from vllm.model_executor.layers.activation import get_act_and_mul_fn
34 from vllm.model_executor.layers.conv import Conv2dLayer
@@ -74,6 +74,7 @@ from .utils import init_vllm_registered_model, maybe_prefix
74 from .vision import (
75 VisionEncoderInfo,
76 VisionFeatureSelectStrategy,
77 + is_vit_use_data_parallel,
78 resolve_visual_encoder_outputs,
79 )
80
@@ -1065,17 +1066,12 @@ class PixtralHFMLP(nn.Module):
1066 self,
1067 config: PixtralVisionConfig,
1068 quant_config: QuantizationConfig | None = None,
1068 - multimodal_config: MultiModalConfig | None = None,
1069 *,
1070 prefix: str = "",
1071 ) -> None:
1072 super().__init__()
1073
1074 - use_data_parallel = (
1075 - multimodal_config.mm_encoder_tp_mode == "data"
1076 - if multimodal_config
1077 - else False
1078 - )
1074 + use_data_parallel = is_vit_use_data_parallel()
1075
1076 assert config.intermediate_size is not None
1077 self.gate_up_proj = MergedColumnParallelLinear(
@@ -1108,7 +1104,6 @@ class PixtralHFAttention(nn.Module):
1104 self,
1105 config: PixtralVisionConfig,
1106 quant_config: QuantizationConfig | None = None,
1111 - multimodal_config: MultiModalConfig | None = None,
1107 *,
1108 prefix: str = "",
1109 ) -> None:
@@ -1120,11 +1115,7 @@ class PixtralHFAttention(nn.Module):
1115 self.head_dim = config.hidden_size // config.num_attention_heads
1116 assert self.total_num_heads * self.head_dim == config.hidden_size
1117
1123 - use_data_parallel = (
1124 - multimodal_config.mm_encoder_tp_mode == "data"
1125 - if multimodal_config
1126 - else False
1127 - )
1118 + use_data_parallel = is_vit_use_data_parallel()
1119 self.qkv_proj = QKVParallelLinear(
1120 hidden_size=config.hidden_size,
1121 head_size=self.head_dim,
@@ -1189,7 +1180,6 @@ class PixtralHFTransformerBlock(nn.Module):
1180 self,
1181 config: PixtralVisionConfig,
1182 quant_config: QuantizationConfig | None = None,
1192 - multimodal_config: MultiModalConfig | None = None,
1183 *,
1184 prefix: str = "",
1185 ) -> None:
@@ -1199,13 +1189,11 @@ class PixtralHFTransformerBlock(nn.Module):
1189 self.attention = PixtralHFAttention(
1190 config,
1191 quant_config=quant_config,
1202 - multimodal_config=multimodal_config,
1192 prefix=f"{prefix}.attention",
1193 )
1194 self.feed_forward = PixtralHFMLP(
1195 config,
1196 quant_config=quant_config,
1208 - multimodal_config=multimodal_config,
1197 prefix=f"{prefix}.feed_forward",
1198 )
1199 self.ffn_norm = RMSNorm(config.hidden_size, eps=1e-5)
@@ -1232,7 +1220,6 @@ class PixtralHFTransformer(nn.Module):
1220 self,
1221 config: PixtralVisionConfig,
1222 quant_config: QuantizationConfig | None = None,
1235 - multimodal_config: MultiModalConfig | None = None,
1223 *,
1224 num_hidden_layers_override: int | None = None,
1225 prefix: str = "",
@@ -1249,7 +1236,6 @@ class PixtralHFTransformer(nn.Module):
1236 PixtralHFTransformerBlock(
1237 config=config,
1238 quant_config=quant_config,
1252 - multimodal_config=multimodal_config,
1239 prefix=f"{prefix}.layers.{layer_idx}",
1240 )
1241 for layer_idx in range(num_hidden_layers)
@@ -1281,7 +1267,6 @@ class PixtralHFVisionModel(nn.Module):
1267 self,
1268 config: PixtralVisionConfig,
1269 quant_config: QuantizationConfig | None = None,
1284 - multimodal_config: MultiModalConfig | None = None,
1270 *,
1271 num_hidden_layers_override: int | None = None,
1272 require_post_norm: bool | None = None,
@@ -1302,7 +1287,6 @@ class PixtralHFVisionModel(nn.Module):
1287 self.transformer = PixtralHFTransformer(
1288 config,
1289 quant_config=quant_config,
1305 - multimodal_config=multimodal_config,
1290 num_hidden_layers_override=num_hidden_layers_override,
1291 prefix=f"{prefix}.transformer",
1292 )
vllm/model_executor/models/qwen2_5_omni_thinker.py
-1
@@ -846,7 +846,6 @@ class Qwen2_5OmniThinkerForConditionalGeneration(
846 norm_eps=getattr(thinker_config.text_config, "rms_norm_eps", 1e-6),
847 quant_config=quant_config,
848 prefix=maybe_prefix(prefix, "visual"),
849 - multimodal_config=multimodal_config,
849 )
850
851 with self._mark_language_model(vllm_config):
vllm/model_executor/models/qwen2_5_vl.py
+5 -33
@@ -43,7 +43,7 @@ from transformers.models.qwen2_5_vl.configuration_qwen2_5_vl import (
43 )
44
45 from vllm.compilation.decorators import support_torch_compile
46 -from vllm.config import MultiModalConfig, VllmConfig
46 +from vllm.config import VllmConfig
47 from vllm.distributed import parallel_state
48 from vllm.distributed import utils as dist_utils
49 from vllm.forward_context import set_forward_context
@@ -109,6 +109,7 @@ from .utils import (
109 )
110 from .vision import (
111 get_vit_attn_backend,
112 + is_vit_use_data_parallel,
113 run_dp_sharded_mrope_vision_model,
114 )
115
@@ -266,15 +267,10 @@ class Qwen2_5_VisionMLP(nn.Module):
267 bias: bool = False,
268 act_fn: Callable[[torch.Tensor], torch.Tensor] = F.silu,
269 quant_config: QuantizationConfig | None = None,
269 - multimodal_config: MultiModalConfig | None = None,
270 prefix: str = "",
271 ):
272 super().__init__()
273 - use_data_parallel = (
274 - multimodal_config.mm_encoder_tp_mode == "data"
275 - if multimodal_config
276 - else False
277 - )
273 + use_data_parallel = is_vit_use_data_parallel()
274 self.gate_up_proj = MergedColumnParallelLinear(
275 input_size=in_features,
276 output_sizes=[hidden_features] * 2, # [gate_proj, up_proj]
@@ -308,16 +304,11 @@ class Qwen2_5_VisionAttention(nn.Module):
304 num_heads: int,
305 projection_size: int,
306 quant_config: QuantizationConfig | None = None,
311 - multimodal_config: MultiModalConfig | None = None,
307 prefix: str = "",
308 ) -> None:
309 super().__init__()
310 # Per attention head and per partition values.
316 - use_data_parallel = (
317 - multimodal_config.mm_encoder_tp_mode == "data"
318 - if multimodal_config
319 - else False
320 - )
311 + use_data_parallel = is_vit_use_data_parallel()
312 self.tp_size = (
313 1
314 if use_data_parallel
@@ -354,7 +345,6 @@ class Qwen2_5_VisionAttention(nn.Module):
345 num_heads=self.num_attention_heads_per_partition,
346 head_size=self.hidden_size_per_attention_head,
347 scale=self.hidden_size_per_attention_head**-0.5,
357 - multimodal_config=multimodal_config,
348 )
349
350 self.apply_rotary_emb = ApplyRotaryEmb(enforce_enable=True)
@@ -435,7 +425,6 @@ class Qwen2_5_VisionBlock(nn.Module):
425 act_fn: Callable[[torch.Tensor], torch.Tensor] = F.silu,
426 norm_layer: Callable[[int], nn.Module] | None = None,
427 quant_config: QuantizationConfig | None = None,
438 - multimodal_config: MultiModalConfig | None = None,
428 prefix: str = "",
429 ) -> None:
430 super().__init__()
@@ -448,7 +437,6 @@ class Qwen2_5_VisionBlock(nn.Module):
437 num_heads=num_heads,
438 projection_size=dim,
439 quant_config=quant_config,
451 - multimodal_config=multimodal_config,
440 prefix=f"{prefix}.attn",
441 )
442 self.mlp = Qwen2_5_VisionMLP(
@@ -457,7 +445,6 @@ class Qwen2_5_VisionBlock(nn.Module):
445 act_fn=act_fn,
446 bias=True,
447 quant_config=quant_config,
460 - multimodal_config=multimodal_config,
448 prefix=f"{prefix}.mlp",
449 )
450
@@ -530,15 +517,10 @@ class Qwen2_5_VisionPatchMerger(nn.Module):
517 norm_layer: Callable[[int], nn.Module] | None = None,
518 spatial_merge_size: int = 2,
519 quant_config: QuantizationConfig | None = None,
533 - multimodal_config: MultiModalConfig | None = None,
520 prefix: str = "",
521 ) -> None:
522 super().__init__()
537 - use_data_parallel = (
538 - multimodal_config.mm_encoder_tp_mode == "data"
539 - if multimodal_config
540 - else False
541 - )
523 + use_data_parallel = is_vit_use_data_parallel()
524 self.hidden_size = context_dim * (spatial_merge_size**2)
525 if norm_layer is None:
526 norm_layer = partial(nn.LayerNorm, eps=1e-6)
@@ -579,7 +561,6 @@ class Qwen2_5_VisionTransformer(nn.Module):
561 vision_config: Qwen2_5_VLVisionConfig,
562 norm_eps: float = 1e-6,
563 quant_config: QuantizationConfig | None = None,
582 - multimodal_config: MultiModalConfig | None = None,
564 prefix: str = "",
565 ) -> None:
566 super().__init__()
@@ -620,15 +601,9 @@ class Qwen2_5_VisionTransformer(nn.Module):
601 rope_parameters={"partial_rotary_factor": 0.5},
602 )
603
623 - attn_backend_override = (
624 - multimodal_config.mm_encoder_attn_backend
625 - if multimodal_config is not None
626 - else None
627 - )
604 self.attn_backend = get_vit_attn_backend(
605 head_size=head_dim,
606 dtype=torch.get_default_dtype(),
631 - attn_backend_override=attn_backend_override,
607 )
608
609 if self.attn_backend not in {
@@ -650,7 +625,6 @@ class Qwen2_5_VisionTransformer(nn.Module):
625 act_fn=get_act_and_mul_fn(vision_config.hidden_act),
626 norm_layer=norm_layer,
627 quant_config=quant_config,
653 - multimodal_config=multimodal_config,
628 prefix=f"{prefix}.blocks.{layer_idx}",
629 )
630 for layer_idx in range(depth)
@@ -664,7 +638,6 @@ class Qwen2_5_VisionTransformer(nn.Module):
638 norm_layer=norm_layer,
639 spatial_merge_size=self.spatial_merge_size,
640 quant_config=quant_config,
667 - multimodal_config=multimodal_config,
641 prefix=f"{prefix}.merger",
642 )
643
@@ -1152,7 +1125,6 @@ class Qwen2_5_VLForConditionalGeneration(
1125 norm_eps=getattr(config, "rms_norm_eps", 1e-6),
1126 quant_config=self.quant_config,
1127 prefix=maybe_prefix(prefix, "visual"),
1155 - multimodal_config=multimodal_config,
1128 )
1129
1130 with self._mark_language_model(vllm_config):
vllm/model_executor/models/qwen2_vl.py
+6 -36
@@ -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 from transformers.models.qwen2_vl.video_processing_qwen2_vl import Qwen2VLVideoProcessor
45
46 -from vllm.config import MultiModalConfig, VllmConfig
46 +from vllm.config import VllmConfig
47 from vllm.config.multimodal import BaseDummyOptions
48 from vllm.distributed import parallel_state, tensor_model_parallel_all_gather
49 from vllm.distributed import utils as dist_utils
@@ -106,6 +106,7 @@ from .utils import (
106 )
107 from .vision import (
108 get_vit_attn_backend,
109 + is_vit_use_data_parallel,
110 run_dp_sharded_mrope_vision_model,
111 )
112
@@ -247,15 +248,10 @@ class Qwen2VisionMLP(nn.Module):
248 hidden_features: int,
249 act_layer: type[nn.Module] = QuickGELU,
250 quant_config: QuantizationConfig | None = None,
250 - multimodal_config: MultiModalConfig | None = None,
251 prefix: str = "",
252 ):
253 super().__init__()
254 - use_data_parallel = (
255 - multimodal_config.mm_encoder_tp_mode == "data"
256 - if multimodal_config
257 - else False
258 - )
254 + use_data_parallel = is_vit_use_data_parallel()
255 self.fc1 = ColumnParallelLinear(
256 in_features,
257 hidden_features,
@@ -286,16 +282,11 @@ class Qwen2VisionAttention(nn.Module):
282 num_heads: int,
283 projection_size: int,
284 quant_config: QuantizationConfig | None = None,
289 - multimodal_config: MultiModalConfig | None = None,
285 prefix: str = "",
286 ) -> None:
287 super().__init__()
288 # Per attention head and per partition values.
294 - use_data_parallel = (
295 - multimodal_config.mm_encoder_tp_mode == "data"
296 - if multimodal_config
297 - else False
298 - )
289 + use_data_parallel = is_vit_use_data_parallel()
290 self.tp_size = (
291 1
292 if use_data_parallel
@@ -328,7 +319,6 @@ class Qwen2VisionAttention(nn.Module):
319 num_heads=self.num_attention_heads_per_partition,
320 head_size=self.hidden_size_per_attention_head,
321 scale=self.hidden_size_per_attention_head**-0.5,
331 - multimodal_config=multimodal_config,
322 )
323
324 self.apply_rotary_emb = ApplyRotaryEmb(enforce_enable=True)
@@ -409,7 +399,6 @@ class Qwen2VisionBlock(nn.Module):
399 act_layer: type[nn.Module] = QuickGELU,
400 norm_layer: Callable[[int], nn.Module] | None = None,
401 quant_config: QuantizationConfig | None = None,
412 - multimodal_config: MultiModalConfig | None = None,
402 prefix: str = "",
403 ) -> None:
404 super().__init__()
@@ -424,7 +413,6 @@ class Qwen2VisionBlock(nn.Module):
413 num_heads=num_heads,
414 projection_size=dim,
415 quant_config=quant_config,
427 - multimodal_config=multimodal_config,
416 prefix=f"{prefix}.attn",
417 )
418 self.mlp = Qwen2VisionMLP(
@@ -432,7 +420,6 @@ class Qwen2VisionBlock(nn.Module):
420 mlp_hidden_dim,
421 act_layer=act_layer,
422 quant_config=quant_config,
435 - multimodal_config=multimodal_config,
423 prefix=f"{prefix}.mlp",
424 )
425
@@ -493,15 +480,10 @@ class Qwen2VisionPatchMerger(nn.Module):
480 norm_layer: Callable[[int], nn.Module] | None = None,
481 spatial_merge_size: int = 2,
482 quant_config: QuantizationConfig | None = None,
496 - multimodal_config: MultiModalConfig | None = None,
483 prefix: str = "",
484 ) -> None:
485 super().__init__()
500 - use_data_parallel = (
501 - multimodal_config.mm_encoder_tp_mode == "data"
502 - if multimodal_config
503 - else False
504 - )
486 + use_data_parallel = is_vit_use_data_parallel()
487 self.hidden_size = context_dim * (spatial_merge_size**2)
488 if norm_layer is None:
489 norm_layer = partial(nn.LayerNorm, eps=1e-6)
@@ -545,7 +527,6 @@ class Qwen2VisionTransformer(nn.Module):
527 vision_config: Qwen2VLVisionConfig,
528 norm_eps: float = 1e-6,
529 quant_config: QuantizationConfig | None = None,
548 - multimodal_config: MultiModalConfig | None = None,
530 prefix: str = "",
531 ) -> None:
532 super().__init__()
@@ -560,11 +541,7 @@ class Qwen2VisionTransformer(nn.Module):
541 num_heads = vision_config.num_heads
542 mlp_ratio = vision_config.mlp_ratio
543
563 - self.use_data_parallel = (
564 - multimodal_config.mm_encoder_tp_mode == "data"
565 - if multimodal_config
566 - else False
567 - )
544 + self.use_data_parallel = is_vit_use_data_parallel()
545 self.out_hidden_size = vision_config.hidden_size
546
547 self.spatial_merge_size = spatial_merge_size
@@ -596,7 +573,6 @@ class Qwen2VisionTransformer(nn.Module):
573 norm_layer=norm_layer,
574 quant_config=quant_config,
575 prefix=f"{prefix}.blocks.{layer_idx}",
599 - multimodal_config=multimodal_config,
576 )
577 for layer_idx in range(depth)
578 ]
@@ -607,15 +583,10 @@ class Qwen2VisionTransformer(nn.Module):
583 norm_layer=norm_layer,
584 quant_config=quant_config,
585 prefix=f"{prefix}.merger",
610 - multimodal_config=multimodal_config,
611 - )
612 - attn_backend_override = (
613 - multimodal_config.mm_encoder_attn_backend if multimodal_config else None
586 )
587 self.attn_backend = get_vit_attn_backend(
588 head_size=head_dim,
589 dtype=torch.get_default_dtype(),
618 - attn_backend_override=attn_backend_override,
590 )
591
592 @property
@@ -1238,7 +1209,6 @@ class Qwen2VLForConditionalGeneration(
1209 config.vision_config,
1210 norm_eps=getattr(config, "rms_norm_eps", 1e-6),
1211 quant_config=quant_config,
1241 - multimodal_config=multimodal_config,
1212 prefix=maybe_prefix(prefix, "visual"),
1213 )
1214
vllm/model_executor/models/qwen3_omni_moe_thinker.py
+2 -26
@@ -48,7 +48,7 @@ from transformers import __version__ as TRANSFORMERS_VERSION
48 # isort: on
49
50 from vllm.compilation.decorators import support_torch_compile
51 -from vllm.config import MultiModalConfig, VllmConfig
51 +from vllm.config import VllmConfig
52 from vllm.distributed import get_pp_group, get_tensor_model_parallel_world_size
53 from vllm.logger import init_logger
54 from vllm.model_executor.layers.activation import _ACTIVATION_REGISTRY
@@ -160,7 +160,6 @@ class Qwen3OmniMoeAudioAttention(nn.Module):
160 def __init__(
161 self,
162 config: Qwen3OmniMoeAudioEncoderConfig,
163 - multimodal_config: MultiModalConfig | None = None,
163 prefix: str = "",
164 ):
165 super().__init__()
@@ -198,7 +197,6 @@ class Qwen3OmniMoeAudioAttention(nn.Module):
197 num_heads=self.num_local_heads,
198 head_size=self.head_dim,
199 scale=self.scaling,
201 - multimodal_config=multimodal_config,
200 )
201
202 def forward(
@@ -233,13 +231,12 @@ class Qwen3OmniMoeAudioEncoderLayer(nn.Module):
231 def __init__(
232 self,
233 config: Qwen3OmniMoeAudioEncoderConfig,
236 - multimodal_config: MultiModalConfig | None = None,
234 prefix: str = "",
235 ):
236 super().__init__()
237 self.embed_dim = config.d_model
238 self.self_attn = Qwen3OmniMoeAudioAttention(
242 - config, multimodal_config=multimodal_config, prefix=f"{prefix}.self_attn"
239 + config, prefix=f"{prefix}.self_attn"
240 )
241 self.self_attn_layer_norm = nn.LayerNorm(self.embed_dim)
242 self.activation_fn = _ACTIVATION_REGISTRY[config.activation_function]
@@ -301,7 +298,6 @@ class Qwen3OmniMoeAudioEncoder(nn.Module):
298 def __init__(
299 self,
300 config: Qwen3OmniMoeAudioEncoderConfig,
304 - multimodal_config: MultiModalConfig | None = None,
301 prefix: str = "",
302 ):
303 super().__init__()
@@ -345,7 +341,6 @@ class Qwen3OmniMoeAudioEncoder(nn.Module):
341 [
342 Qwen3OmniMoeAudioEncoderLayer(
343 config,
348 - multimodal_config=multimodal_config,
344 prefix=f"{prefix}.layers.{i}",
345 )
346 for i in range(config.encoder_layers)
@@ -359,15 +354,9 @@ class Qwen3OmniMoeAudioEncoder(nn.Module):
354 self.proj2 = nn.Linear(config.d_model, config.output_dim)
355
356 # Get attention backend
362 - attn_backend_override = (
363 - multimodal_config.mm_encoder_attn_backend
364 - if multimodal_config is not None
365 - else None
366 - )
357 self.attn_backend = get_vit_attn_backend(
358 head_size=config.d_model // config.encoder_attention_heads,
359 dtype=torch.get_default_dtype(),
370 - attn_backend_override=attn_backend_override,
360 )
361
362 def compute_attn_mask_seqlen(self, cu_seqlens: torch.Tensor) -> torch.Tensor | None:
@@ -601,7 +590,6 @@ class Qwen3_VisionBlock(nn.Module):
590 mlp_hidden_dim: int,
591 act_fn: Callable[[torch.Tensor], torch.Tensor] = F.silu,
592 norm_layer: Callable[[int], nn.Module] | None = None,
604 - multimodal_config: MultiModalConfig | None = None,
593 quant_config: QuantizationConfig | None = None,
594 prefix: str = "",
595 ) -> None:
@@ -615,7 +603,6 @@ class Qwen3_VisionBlock(nn.Module):
603 num_heads=num_heads,
604 projection_size=dim,
605 quant_config=quant_config,
618 - multimodal_config=multimodal_config,
606 prefix=f"{prefix}.attn",
607 )
608 self.mlp = Qwen3_VisionMLP(
@@ -710,7 +697,6 @@ class Qwen3Omni_VisionTransformer(nn.Module):
697 vision_config,
698 norm_eps: float = 1e-6,
699 quant_config: QuantizationConfig | None = None,
713 - multimodal_config: MultiModalConfig | None = None,
700 prefix: str = "",
701 ) -> None:
702 super().__init__()
@@ -758,7 +744,6 @@ class Qwen3Omni_VisionTransformer(nn.Module):
744 act_fn=_ACTIVATION_REGISTRY[vision_config.hidden_act],
745 norm_layer=norm_layer,
746 quant_config=quant_config,
761 - multimodal_config=multimodal_config,
747 prefix=f"{prefix}.blocks.{layer_idx}",
748 )
749 for layer_idx in range(vision_config.depth)
@@ -788,16 +773,9 @@ class Qwen3Omni_VisionTransformer(nn.Module):
773 ]
774 )
775
791 - attn_backend_override = (
792 - multimodal_config.mm_encoder_attn_backend
793 - if multimodal_config is not None
794 - else None
795 - )
796 -
776 self.attn_backend = get_vit_attn_backend(
777 head_size=head_dim,
778 dtype=torch.get_default_dtype(),
800 - attn_backend_override=attn_backend_override,
779 )
780
781 @property
@@ -1617,7 +1595,6 @@ class Qwen3OmniMoeThinkerForConditionalGeneration(
1595 with self._mark_tower_model(vllm_config, "audio"):
1596 self.audio_tower = Qwen3OmniMoeAudioEncoder(
1597 thinker_config.audio_config,
1620 - multimodal_config=multimodal_config,
1598 prefix=maybe_prefix(prefix, "audio_tower"),
1599 )
1600
@@ -1638,7 +1615,6 @@ class Qwen3OmniMoeThinkerForConditionalGeneration(
1615 norm_eps=getattr(thinker_config.text_config, "rms_norm_eps", 1e-6),
1616 quant_config=quant_config,
1617 prefix=maybe_prefix(prefix, "visual"),
1641 - multimodal_config=multimodal_config,
1618 )
1619
1620 # register buffer for deepstack
vllm/model_executor/models/qwen3_vl.py
+4 -25
@@ -49,7 +49,7 @@ from transformers.models.qwen3_vl.video_processing_qwen3_vl import (
49 from transformers.video_utils import VideoMetadata
50
51 from vllm.compilation.decorators import support_torch_compile
52 -from vllm.config import MultiModalConfig, VllmConfig
52 +from vllm.config import VllmConfig
53 from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
54 from vllm.distributed import get_pp_group
55 from vllm.logger import init_logger
@@ -123,6 +123,7 @@ from .utils import (
123 )
124 from .vision import (
125 get_vit_attn_backend,
126 + is_vit_use_data_parallel,
127 run_dp_sharded_mrope_vision_model,
128 )
129
@@ -169,15 +170,10 @@ class Qwen3_VisionMLP(nn.Module):
170 bias: bool = False,
171 act_fn: Callable[[torch.Tensor], torch.Tensor] = F.silu,
172 quant_config: QuantizationConfig | None = None,
172 - multimodal_config: MultiModalConfig | None = None,
173 prefix: str = "",
174 ):
175 super().__init__()
176 - use_data_parallel = (
177 - multimodal_config.mm_encoder_tp_mode == "data"
178 - if multimodal_config
179 - else False
180 - )
176 + use_data_parallel = is_vit_use_data_parallel()
177 self.linear_fc1 = ColumnParallelLinear(
178 in_features,
179 hidden_features,
@@ -211,7 +207,6 @@ class Qwen3_VisionBlock(nn.Module):
207 mlp_hidden_dim: int,
208 act_fn: Callable[[torch.Tensor], torch.Tensor] = F.silu,
209 norm_layer: Callable[[int], nn.Module] | None = None,
214 - multimodal_config: MultiModalConfig | None = None,
210 quant_config: QuantizationConfig | None = None,
211 prefix: str = "",
212 ) -> None:
@@ -225,7 +220,6 @@ class Qwen3_VisionBlock(nn.Module):
220 num_heads=num_heads,
221 projection_size=dim,
222 quant_config=quant_config,
228 - multimodal_config=multimodal_config,
223 prefix=f"{prefix}.attn",
224 )
225 self.mlp = Qwen3_VisionMLP(
@@ -234,7 +228,6 @@ class Qwen3_VisionBlock(nn.Module):
228 act_fn=act_fn,
229 bias=True,
230 quant_config=quant_config,
237 - multimodal_config=multimodal_config,
231 prefix=f"{prefix}.mlp",
232 )
233
@@ -267,15 +260,10 @@ class Qwen3_VisionPatchMerger(nn.Module):
260 spatial_merge_size: int = 2,
261 use_postshuffle_norm: bool = False,
262 quant_config: QuantizationConfig | None = None,
270 - multimodal_config: MultiModalConfig | None = None,
263 prefix: str = "",
264 ) -> None:
265 super().__init__()
274 - use_data_parallel = (
275 - multimodal_config.mm_encoder_tp_mode == "data"
276 - if multimodal_config
277 - else False
278 - )
266 + use_data_parallel = is_vit_use_data_parallel()
267 self.hidden_size = context_dim * (spatial_merge_size**2)
268
269 self.use_postshuffle_norm = use_postshuffle_norm
@@ -321,7 +309,6 @@ class Qwen3_VisionTransformer(nn.Module):
309 vision_config: Qwen3VLVisionConfig,
310 norm_eps: float = 1e-6,
311 quant_config: QuantizationConfig | None = None,
324 - multimodal_config: MultiModalConfig | None = None,
312 prefix: str = "",
313 ) -> None:
314 super().__init__()
@@ -365,7 +352,6 @@ class Qwen3_VisionTransformer(nn.Module):
352 norm_layer=norm_layer,
353 spatial_merge_size=self.spatial_merge_size,
354 quant_config=quant_config,
368 - multimodal_config=multimodal_config,
355 prefix=f"{prefix}.merger",
356 )
357
@@ -378,20 +364,15 @@ class Qwen3_VisionTransformer(nn.Module):
364 use_postshuffle_norm=True,
365 norm_layer=norm_layer,
366 quant_config=quant_config,
381 - multimodal_config=multimodal_config,
367 prefix=f"{prefix}.deepstack_merger_list.{layer_idx}",
368 )
369 for layer_idx in range(len(self.deepstack_visual_indexes))
370 ]
371 )
372
388 - attn_backend_override = (
389 - multimodal_config.mm_encoder_attn_backend if multimodal_config else None
390 - )
373 self.attn_backend = get_vit_attn_backend(
374 head_size=head_dim,
375 dtype=torch.get_default_dtype(),
394 - attn_backend_override=attn_backend_override,
376 )
377
378 if self.attn_backend not in {
@@ -411,7 +392,6 @@ class Qwen3_VisionTransformer(nn.Module):
392 act_fn=_ACTIVATION_REGISTRY[vision_config.hidden_act],
393 norm_layer=norm_layer,
394 quant_config=quant_config,
414 - multimodal_config=multimodal_config,
395 prefix=f"{prefix}.blocks.{layer_idx}",
396 )
397 for layer_idx in range(vision_config.depth)
@@ -1291,7 +1271,6 @@ class Qwen3VLForConditionalGeneration(
1271 config.vision_config,
1272 norm_eps=getattr(config, "rms_norm_eps", 1e-6),
1273 quant_config=quant_config,
1294 - multimodal_config=multimodal_config,
1274 prefix=maybe_prefix(prefix, "visual"),
1275 )
1276
vllm/model_executor/models/qwen3_vl_moe.py
-1
@@ -446,7 +446,6 @@ class Qwen3VLMoeForConditionalGeneration(
446 config.vision_config,
447 norm_eps=getattr(config, "rms_norm_eps", 1e-6),
448 quant_config=quant_config,
449 - multimodal_config=multimodal_config,
449 prefix=maybe_prefix(prefix, "visual"),
450 )
451
vllm/model_executor/models/siglip.py
+4 -29
@@ -16,7 +16,7 @@ from transformers import (
16 )
17
18 from vllm.config import VllmConfig
19 -from vllm.config.multimodal import BaseDummyOptions, MultiModalConfig
19 +from vllm.config.multimodal import BaseDummyOptions
20 from vllm.distributed import divide, get_tensor_model_parallel_world_size
21 from vllm.model_executor.layers.activation import get_act_fn
22 from vllm.model_executor.layers.attention.encoder_only_attention import (
@@ -64,6 +64,7 @@ from .vision import (
64 VisionFeatureSelectStrategy,
65 VisionFeatureSelectStrategyStr,
66 get_num_selected_vision_tokens,
67 + is_vit_use_data_parallel,
68 resolve_visual_encoder_outputs,
69 )
70
@@ -356,7 +357,6 @@ class SiglipAttention(nn.Module):
357 self,
358 config: SiglipVisionConfig | SiglipTextConfig,
359 quant_config: QuantizationConfig | None = None,
359 - multimodal_config: MultiModalConfig | None = None,
360 *,
361 prefix: str = "",
362 attn_cls: type[EncoderOnlyAttention] | type[MMEncoderAttention],
@@ -376,11 +376,7 @@ class SiglipAttention(nn.Module):
376
377 self.scale = self.head_dim**-0.5
378
379 - use_data_parallel = (
380 - multimodal_config.mm_encoder_tp_mode == "data"
381 - if multimodal_config
382 - else False
383 - )
379 + use_data_parallel = is_vit_use_data_parallel()
380 self.qkv_proj = QKVParallelLinear(
381 hidden_size=self.embed_dim,
382 head_size=self.head_dim,
@@ -409,7 +405,6 @@ class SiglipAttention(nn.Module):
405 self.head_dim,
406 self.scale,
407 prefix=f"{prefix}.attn",
412 - multimodal_config=multimodal_config,
408 )
409 else:
410 self.attn = attn_cls(
@@ -437,17 +432,12 @@ class SiglipMLP(nn.Module):
432 self,
433 config: SiglipVisionConfig | SiglipTextConfig,
434 quant_config: QuantizationConfig | None = None,
440 - multimodal_config: MultiModalConfig | None = None,
435 prefix: str = "",
436 ) -> None:
437 super().__init__()
438
439 self.config = config
446 - use_data_parallel = (
447 - multimodal_config.mm_encoder_tp_mode == "data"
448 - if multimodal_config
449 - else False
450 - )
440 + use_data_parallel = is_vit_use_data_parallel()
441 self.activation_fn = get_act_fn(config.hidden_act)
442
443 # Special handling for BNB and torchao quantization
@@ -487,7 +477,6 @@ class SiglipEncoderLayer(nn.Module):
477 self,
478 config: SiglipVisionConfig | SiglipTextConfig,
479 quant_config: QuantizationConfig | None = None,
490 - multimodal_config: MultiModalConfig | None = None,
480 *,
481 prefix: str = "",
482 attn_cls: type[EncoderOnlyAttention] | type[MMEncoderAttention],
@@ -499,7 +488,6 @@ class SiglipEncoderLayer(nn.Module):
488 self.self_attn = SiglipAttention(
489 config,
490 quant_config=quant_config,
502 - multimodal_config=multimodal_config,
491 prefix=f"{prefix}.self_attn",
492 attn_cls=attn_cls,
493 )
@@ -507,7 +495,6 @@ class SiglipEncoderLayer(nn.Module):
495 self.mlp = SiglipMLP(
496 config,
497 quant_config=quant_config,
510 - multimodal_config=multimodal_config,
498 prefix=f"{prefix}.mlp",
499 )
500 self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)
@@ -535,7 +522,6 @@ class SiglipEncoder(nn.Module):
522 self,
523 config: SiglipVisionConfig | SiglipTextConfig,
524 quant_config: QuantizationConfig | None = None,
538 - multimodal_config: MultiModalConfig | None = None,
525 num_hidden_layers_override: int | None = None,
526 *,
527 prefix: str = "",
@@ -555,7 +541,6 @@ class SiglipEncoder(nn.Module):
541 SiglipEncoderLayer(
542 config,
543 quant_config=quant_config,
558 - multimodal_config=multimodal_config,
544 prefix=f"{prefix}.layers.{layer_idx}",
545 attn_cls=attn_cls,
546 )
@@ -660,7 +645,6 @@ class SiglipMultiheadAttentionPoolingHead(nn.Module):
645 self,
646 config: SiglipVisionConfig,
647 quant_config: QuantizationConfig | None = None,
663 - multimodal_config: MultiModalConfig | None = None,
648 prefix: str = "",
649 ) -> None:
650 super().__init__()
@@ -674,7 +658,6 @@ class SiglipMultiheadAttentionPoolingHead(nn.Module):
658 self.mlp = SiglipMLP(
659 config=config,
660 quant_config=quant_config,
677 - multimodal_config=multimodal_config,
661 prefix=f"{prefix}.mlp",
662 )
663
@@ -700,7 +683,6 @@ class SiglipVisionTransformer(nn.Module):
683 self,
684 config: SiglipVisionConfig,
685 quant_config: QuantizationConfig | None = None,
703 - multimodal_config: MultiModalConfig | None = None,
686 *,
687 num_hidden_layers_override: int | None = None,
688 require_post_norm: bool | None = None,
@@ -717,7 +699,6 @@ class SiglipVisionTransformer(nn.Module):
699 self.encoder = SiglipEncoder(
700 config,
701 quant_config=quant_config,
720 - multimodal_config=multimodal_config,
702 num_hidden_layers_override=num_hidden_layers_override,
703 prefix=f"{prefix}.encoder",
704 attn_cls=MMEncoderAttention,
@@ -756,7 +737,6 @@ class SiglipVisionTransformer(nn.Module):
737 SiglipMultiheadAttentionPoolingHead(
738 config=config,
739 quant_config=quant_config,
759 - multimodal_config=multimodal_config,
740 prefix=f"{prefix}.head",
741 )
742 if self.use_head
@@ -870,7 +850,6 @@ class SiglipVisionModel(nn.Module):
850 self,
851 config: SiglipVisionConfig,
852 quant_config: QuantizationConfig | None = None,
873 - multimodal_config: MultiModalConfig | None = None,
853 *,
854 num_hidden_layers_override: int | None = None,
855 require_post_norm: bool | None = None,
@@ -883,7 +862,6 @@ class SiglipVisionModel(nn.Module):
862 self.vision_model = SiglipVisionTransformer(
863 config,
864 quant_config=quant_config,
886 - multimodal_config=multimodal_config,
865 num_hidden_layers_override=num_hidden_layers_override,
866 require_post_norm=require_post_norm,
867 prefix=f"{prefix}.vision_model",
@@ -1062,9 +1040,7 @@ class SiglipEmbeddingModel(nn.Module, SupportsMultiModal, SupportsQuant):
1040
1041 config: SiglipConfig = vllm_config.model_config.hf_config
1042 quant_config = vllm_config.quant_config
1065 - multimodal_config = vllm_config.model_config.multimodal_config
1043 self.config = config
1067 - self.multimodal_config = multimodal_config
1044
1045 if hasattr(config, "num_labels"):
1046 config.num_labels = 0
@@ -1087,7 +1063,6 @@ class SiglipEmbeddingModel(nn.Module, SupportsMultiModal, SupportsQuant):
1063 self.vision_model = SiglipVisionTransformer(
1064 vision_config,
1065 quant_config=quant_config,
1090 - multimodal_config=multimodal_config,
1066 prefix=maybe_prefix(prefix, "vision_model"),
1067 use_head=None, # Allows potential pooling head
1068 )
vllm/model_executor/models/siglip2navit.py
+4 -24
@@ -11,7 +11,6 @@ from torch.nn import functional as F
11 from transformers import Siglip2VisionConfig
12 from transformers.configuration_utils import PretrainedConfig
13
14 -from vllm.config import MultiModalConfig
14 from vllm.distributed import divide, get_tensor_model_parallel_world_size
15 from vllm.model_executor.layers.activation import get_act_fn
16 from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
@@ -30,6 +29,8 @@ from vllm.model_executor.layers.rotary_embedding.common import (
29 from vllm.model_executor.model_loader.weight_utils import default_weight_loader
30 from vllm.platforms import current_platform
31
32 +from .vision import is_vit_use_data_parallel
33 +
34
35 class VisionRotaryEmbedding(nn.Module):
36 def __init__(self, dim: int, theta: float = 10000.0) -> None:
@@ -178,9 +179,7 @@ class Siglip2Attention(nn.Module):
179 self,
180 config: Siglip2VisionConfig,
181 quant_config: QuantizationConfig | None = None,
181 - multimodal_config: MultiModalConfig | None = None,
182 prefix: str = "",
183 - use_data_parallel: bool = False,
183 ):
184 super().__init__()
185 self.config = config
@@ -196,11 +195,7 @@ class Siglip2Attention(nn.Module):
195 self.scale = self.head_dim**-0.5
196 self.dropout = config.attention_dropout
197
199 - use_data_parallel = (
200 - multimodal_config.mm_encoder_tp_mode == "data"
201 - if multimodal_config
202 - else False
203 - )
198 + use_data_parallel = is_vit_use_data_parallel()
199 self.qkv_proj = QKVParallelLinear(
200 hidden_size=self.embed_dim,
201 head_size=self.head_dim,
@@ -228,7 +223,6 @@ class Siglip2Attention(nn.Module):
223 head_size=self.head_dim,
224 scale=self.scale,
225 prefix=f"{prefix}.attn",
231 - multimodal_config=multimodal_config,
226 )
227
228 self.apply_rotary_emb = ApplyRotaryEmb(
@@ -287,16 +281,11 @@ class Siglip2MLP(nn.Module):
281 self,
282 config: Siglip2VisionConfig,
283 quant_config: QuantizationConfig | None = None,
290 - multimodal_config: MultiModalConfig | None = None,
284 prefix: str = "",
285 ):
286 super().__init__()
287 self.config = config
295 - use_data_parallel = (
296 - multimodal_config.mm_encoder_tp_mode == "data"
297 - if multimodal_config
298 - else False
299 - )
288 + use_data_parallel = is_vit_use_data_parallel()
289 self.activation_fn = get_act_fn(config.hidden_act)
290 self.fc1 = ColumnParallelLinear(
291 config.hidden_size,
@@ -325,7 +314,6 @@ class Siglip2EncoderLayer(nn.Module):
314 self,
315 config: Siglip2VisionConfig,
316 quant_config: QuantizationConfig | None = None,
328 - multimodal_config: MultiModalConfig | None = None,
317 prefix: str = "",
318 ):
319 super().__init__()
@@ -334,14 +322,12 @@ class Siglip2EncoderLayer(nn.Module):
322 self.self_attn = Siglip2Attention(
323 config,
324 quant_config=quant_config,
337 - multimodal_config=multimodal_config,
325 prefix=f"{prefix}.self_attn",
326 )
327 self.layer_norm2 = nn.LayerNorm(self.embed_dim, eps=config.layer_norm_eps)
328 self.mlp = Siglip2MLP(
329 config,
330 quant_config=quant_config,
344 - multimodal_config=multimodal_config,
331 prefix=f"{prefix}.mlp",
332 )
333
@@ -387,7 +373,6 @@ class Siglip2Encoder(nn.Module):
373 self,
374 config: Siglip2VisionConfig,
375 quant_config: QuantizationConfig | None = None,
390 - multimodal_config: MultiModalConfig | None = None,
376 prefix: str = "",
377 ):
378 super().__init__()
@@ -397,7 +382,6 @@ class Siglip2Encoder(nn.Module):
382 Siglip2EncoderLayer(
383 config,
384 quant_config=quant_config,
400 - multimodal_config=multimodal_config,
385 prefix=f"{prefix}.layers.{idx}",
386 )
387 for idx in range(config.num_hidden_layers)
@@ -571,7 +555,6 @@ class Siglip2VisionTransformer(nn.Module):
555 self,
556 config: Siglip2VisionConfig,
557 quant_config: QuantizationConfig | None = None,
574 - multimodal_config: MultiModalConfig | None = None,
558 prefix: str = "",
559 ):
560 super().__init__()
@@ -582,7 +565,6 @@ class Siglip2VisionTransformer(nn.Module):
565 self.encoder = Siglip2Encoder(
566 config,
567 quant_config=quant_config,
585 - multimodal_config=multimodal_config,
568 prefix=f"{prefix}.encoder",
569 )
570 self.post_layernorm = nn.LayerNorm(embed_dim, eps=config.layer_norm_eps)
@@ -610,7 +592,6 @@ class Siglip2NavitModel(torch.nn.Module):
592 self,
593 config: Siglip2VisionConfig,
594 quant_config: QuantizationConfig | None = None,
613 - multimodal_config: MultiModalConfig | None = None,
595 prefix: str = "",
596 ):
597 super().__init__()
@@ -618,7 +599,6 @@ class Siglip2NavitModel(torch.nn.Module):
599 self.vision_model = Siglip2VisionTransformer(
600 config,
601 quant_config=quant_config,
621 - multimodal_config=multimodal_config,
602 prefix=f"{prefix}.vision_model",
603 )
604
vllm/model_executor/models/tarsier.py
+1 -6
@@ -19,7 +19,7 @@ from transformers.models.llava import LlavaProcessor
19 from transformers.processing_utils import ProcessingKwargs, Unpack
20 from transformers.tokenization_utils_base import PreTokenizedInput, TextInput
21
22 -from vllm.config import MultiModalConfig, VllmConfig
22 +from vllm.config import VllmConfig
23 from vllm.model_executor.layers.activation import get_act_fn
24 from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
25 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -351,7 +351,6 @@ def _build_tarsier_hf_processor(
351 def init_vision_tower_for_tarsier(
352 hf_config: TarsierHfConfig, # Use the Tarsier specific config protocol
353 quant_config: QuantizationConfig | None,
354 - multimodal_config: MultiModalConfig | None,
354 *,
355 require_post_norm: bool | None = None,
356 prefix: str = "",
@@ -378,7 +377,6 @@ def init_vision_tower_for_tarsier(
377 return CLIPVisionModel(
378 vision_config,
379 quant_config=quant_config,
381 - multimodal_config=multimodal_config,
380 num_hidden_layers_override=num_hidden_layers_to_init,
381 require_post_norm=require_post_norm,
382 prefix=prefix,
@@ -387,7 +385,6 @@ def init_vision_tower_for_tarsier(
385 return SiglipVisionModel(
386 vision_config,
387 quant_config=quant_config,
390 - multimodal_config=multimodal_config,
388 num_hidden_layers_override=num_hidden_layers_to_init,
389 require_post_norm=require_post_norm,
390 prefix=prefix,
@@ -420,7 +417,6 @@ class TarsierForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsPP)
417
418 config: TarsierHfConfig = vllm_config.model_config.hf_config
419 quant_config = vllm_config.quant_config
423 - multimodal_config = vllm_config.model_config.multimodal_config
420
421 self.config = config # Storing the Tarsier-specific HF config
422
@@ -428,7 +424,6 @@ class TarsierForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsPP)
424 self.vision_tower = init_vision_tower_for_tarsier(
425 config,
426 quant_config=quant_config,
431 - multimodal_config=multimodal_config,
427 require_post_norm=False,
428 prefix=maybe_prefix(prefix, "vision_tower"),
429 )
vllm/model_executor/models/vision.py
+48 -2
@@ -10,7 +10,7 @@ from typing import Final, Generic, Literal, Protocol, TypeAlias, TypeVar
10 import torch
11 from transformers import PretrainedConfig
12
13 -from vllm.config import VllmConfig
13 +from vllm.config import MultiModalConfig, VllmConfig, get_current_vllm_config
14 from vllm.distributed import (
15 get_tensor_model_parallel_rank,
16 get_tensor_model_parallel_world_size,
@@ -79,7 +79,7 @@ def get_vision_encoder_info(hf_config: VisionLanguageConfig) -> VisionEncoderInf
79 raise NotImplementedError(msg)
80
81
82 -def get_vit_attn_backend(
82 +def _get_vit_attn_backend(
83 head_size: int,
84 dtype: torch.dtype,
85 *,
@@ -95,6 +95,52 @@ def get_vit_attn_backend(
95 )
96
97
98 +def get_vit_attn_backend(
99 + head_size: int,
100 + dtype: torch.dtype,
101 +) -> AttentionBackendEnum:
102 + """
103 + Get the attention backend for Vision Transformer.
104 + """
105 + try:
106 + vllm_config: VllmConfig = get_current_vllm_config()
107 + multimodal_config: MultiModalConfig | None = (
108 + vllm_config.model_config.multimodal_config
109 + )
110 + except AssertionError:
111 + multimodal_config = None
112 +
113 + attn_backend_override = (
114 + multimodal_config.mm_encoder_attn_backend
115 + if multimodal_config is not None
116 + else None
117 + )
118 + attn_backend = _get_vit_attn_backend(
119 + head_size,
120 + dtype,
121 + attn_backend_override=attn_backend_override,
122 + )
123 + return attn_backend
124 +
125 +
126 +def is_vit_use_data_parallel():
127 + """
128 + Get the tensor parallel type for Vision Transformer.
129 + """
130 + try:
131 + vllm_config: VllmConfig = get_current_vllm_config()
132 + multimodal_config: MultiModalConfig | None = (
133 + vllm_config.model_config.multimodal_config
134 + )
135 + except AssertionError:
136 + multimodal_config = None
137 +
138 + mm_encoder_tp_mode = (
139 + multimodal_config.mm_encoder_tp_mode if multimodal_config is not None else None
140 + )
141 + return mm_encoder_tp_mode == "data"
142 +
143 +
144 def should_torch_compile_mm_vit(vllm_config: VllmConfig) -> bool:
145 """Callable to be passed to `@support_torch_compile`'s `enable_if` argument."""
146 return vllm_config.compilation_config.compile_mm_encoder