@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / e4bb2684bc
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 13, 00:45 UTC

[Models] Replace all `nn.Conv2d` with vLLM's Conv2dLayer (#28842)

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

Isotr0py committed Nov 19, 2025 at 02:56 UTC e4bb2684bcea12f72a36a6c48292f79534af849a
20 files changed +83 -45
vllm/model_executor/layers/conv.py
+22 -2
@@ -3,6 +3,7 @@
3 """Conv Layer Class."""
4
5 import math
6 +from typing import Literal
7
8 import torch
9 import torch.nn as nn
@@ -23,11 +24,11 @@ class ConvLayerBase(CustomOp):
24 out_channels: int,
25 kernel_size: int | tuple[int, ...],
26 stride: int | tuple[int, ...] = 1,
26 - padding: int | tuple[int, ...] = 0,
27 + padding: int | tuple[int, ...] | Literal["same", "valid"] = 0,
28 dilation: int | tuple[int, ...] = 1,
29 groups: int = 1,
30 bias: bool = True,
30 - padding_mode: str = "zeros",
31 + padding_mode: Literal["zeros", "reflect", "replicate", "circular"] = "zeros",
32 *,
33 params_dtype: torch.dtype | None = None,
34 ) -> None:
@@ -36,6 +37,22 @@ class ConvLayerBase(CustomOp):
37 if params_dtype is None:
38 params_dtype = torch.get_default_dtype()
39
40 + valid_padding_strings = {"same", "valid"}
41 + if isinstance(padding, str) and padding not in valid_padding_strings:
42 + raise ValueError(
43 + f"Invalid padding string '{padding}'. "
44 + f"Expected one of {valid_padding_strings}."
45 + )
46 +
47 + if padding == "same":
48 + padding = (
49 + kernel_size // 2
50 + if isinstance(kernel_size, int)
51 + else tuple(k // 2 for k in kernel_size)
52 + )
53 + elif padding == "valid":
54 + padding = 0
55 +
56 kernel_size = (
57 (kernel_size,) * self.num_dim
58 if isinstance(kernel_size, int)
@@ -45,6 +62,9 @@ class ConvLayerBase(CustomOp):
62 padding = (padding,) * self.num_dim if isinstance(padding, int) else padding
63 dilation = (dilation,) * self.num_dim if isinstance(dilation, int) else dilation
64
65 + if padding == "same" and any(s != 1 for s in stride):
66 + raise ValueError("padding='same' is not supported for strided convolutions")
67 +
68 self.in_channels = in_channels
69 self.out_channels = out_channels
70 self.kernel_size = kernel_size
vllm/model_executor/models/aimv2.py
+2 -1
@@ -12,6 +12,7 @@ from vllm.attention.layer import MultiHeadAttention
12 from vllm.distributed import get_tensor_model_parallel_world_size
13 from vllm.distributed.utils import divide
14 from vllm.model_executor.layers.activation import SiluAndMul
15 +from vllm.model_executor.layers.conv import Conv2dLayer
16 from vllm.model_executor.layers.layernorm import RMSNorm
17 from vllm.model_executor.layers.linear import (
18 MergedColumnParallelLinear,
@@ -58,7 +59,7 @@ class AIMv2SwiGLUFFN(nn.Module):
59 class AIMv2PatchEmbed(nn.Module):
60 def __init__(self, config: AIMv2Config):
61 super().__init__()
61 - self.proj = nn.Conv2d(
62 + self.proj = Conv2dLayer(
63 config.num_channels,
64 config.hidden_size,
65 kernel_size=(config.patch_size, config.patch_size),
vllm/model_executor/models/blip.py
+2 -1
@@ -12,6 +12,7 @@ from transformers import Blip2VisionConfig, BlipVisionConfig
12 from vllm.attention.layer import MultiHeadAttention
13 from vllm.distributed import divide, get_tensor_model_parallel_world_size
14 from vllm.model_executor.layers.activation import get_act_fn
15 +from vllm.model_executor.layers.conv import Conv2dLayer
16 from vllm.model_executor.layers.linear import (
17 ColumnParallelLinear,
18 QKVParallelLinear,
@@ -47,7 +48,7 @@ class BlipVisionEmbeddings(nn.Module):
48
49 self.class_embedding = nn.Parameter(torch.randn(1, 1, self.embed_dim))
50
50 - self.patch_embedding = nn.Conv2d(
51 + self.patch_embedding = Conv2dLayer(
52 in_channels=3,
53 out_channels=self.embed_dim,
54 kernel_size=self.patch_size,
vllm/model_executor/models/chameleon.py
+14 -15
@@ -22,6 +22,7 @@ from vllm.config.multimodal import BaseDummyOptions
22 from vllm.distributed import get_pp_group, get_tensor_model_parallel_world_size
23 from vllm.logger import init_logger
24 from vllm.model_executor.layers.activation import SiluAndMul
25 +from vllm.model_executor.layers.conv import Conv2dLayer
26 from vllm.model_executor.layers.layernorm import RMSNorm
27 from vllm.model_executor.layers.linear import (
28 MergedColumnParallelLinear,
@@ -549,7 +550,7 @@ class ChameleonVQVAEVectorQuantizer(nn.Module):
550 class ChameleonVQVAEEncoderConvDownsample(nn.Module):
551 def __init__(self, in_channels: int):
552 super().__init__()
552 - self.conv = nn.Conv2d(
553 + self.conv = Conv2dLayer(
554 in_channels, in_channels, kernel_size=3, stride=2, padding=0
555 )
556
@@ -577,23 +578,23 @@ class ChameleonVQVAEEncoderResnetBlock(nn.Module):
578 self.norm1 = torch.nn.GroupNorm(
579 num_groups=32, num_channels=in_channels, eps=1e-6, affine=True
580 )
580 - self.conv1 = torch.nn.Conv2d(
581 + self.conv1 = Conv2dLayer(
582 in_channels, out_channels, kernel_size=3, stride=1, padding=1
583 )
584 self.norm2 = torch.nn.GroupNorm(
585 num_groups=32, num_channels=out_channels, eps=1e-6, affine=True
586 )
587 self.dropout = torch.nn.Dropout(config.dropout)
587 - self.conv2 = torch.nn.Conv2d(
588 + self.conv2 = Conv2dLayer(
589 out_channels, out_channels, kernel_size=3, stride=1, padding=1
590 )
591 if self.in_channels != self.out_channels:
592 if self.use_conv_shortcut:
592 - self.conv_shortcut = torch.nn.Conv2d(
593 + self.conv_shortcut = Conv2dLayer(
594 in_channels, out_channels, kernel_size=3, stride=1, padding=1
595 )
596 else:
596 - self.nin_shortcut = torch.nn.Conv2d(
597 + self.nin_shortcut = Conv2dLayer(
598 in_channels, out_channels, kernel_size=1, stride=1, padding=0
599 )
600
@@ -626,16 +627,16 @@ class ChameleonVQVAEEncoderAttnBlock(nn.Module):
627 self.norm = torch.nn.GroupNorm(
628 num_groups=32, num_channels=in_channels, eps=1e-6, affine=True
629 )
629 - self.q = torch.nn.Conv2d(
630 + self.q = Conv2dLayer(
631 in_channels, in_channels, kernel_size=1, stride=1, padding=0
632 )
632 - self.k = torch.nn.Conv2d(
633 + self.k = Conv2dLayer(
634 in_channels, in_channels, kernel_size=1, stride=1, padding=0
635 )
635 - self.v = torch.nn.Conv2d(
636 + self.v = Conv2dLayer(
637 in_channels, in_channels, kernel_size=1, stride=1, padding=0
638 )
638 - self.proj_out = torch.nn.Conv2d(
639 + self.proj_out = Conv2dLayer(
640 in_channels, in_channels, kernel_size=1, stride=1, padding=0
641 )
642
@@ -681,7 +682,7 @@ class ChameleonVQVAEEncoder(nn.Module):
682 latent_channels = config.latent_channels
683 channel_multiplier = config.channel_multiplier
684
684 - self.conv_in = torch.nn.Conv2d(
685 + self.conv_in = Conv2dLayer(
686 in_channels, base_channels, kernel_size=3, stride=1, padding=1
687 )
688
@@ -738,7 +739,7 @@ class ChameleonVQVAEEncoder(nn.Module):
739 self.norm_out = torch.nn.GroupNorm(
740 num_groups=32, num_channels=block_in, eps=1e-6, affine=True
741 )
741 - self.conv_out = torch.nn.Conv2d(
742 + self.conv_out = Conv2dLayer(
743 block_in,
744 2 * latent_channels if double_latent else latent_channels,
745 kernel_size=3,
@@ -779,10 +780,8 @@ class ChameleonVQVAE(nn.Module):
780 super().__init__()
781 self.encoder = ChameleonVQVAEEncoder(config)
782 self.quantize = ChameleonVQVAEVectorQuantizer(config)
782 - self.quant_conv = torch.nn.Conv2d(config.latent_channels, config.embed_dim, 1)
783 - self.post_quant_conv = torch.nn.Conv2d(
784 - config.embed_dim, config.latent_channels, 1
785 - )
783 + self.quant_conv = Conv2dLayer(config.latent_channels, config.embed_dim, 1)
784 + self.post_quant_conv = Conv2dLayer(config.embed_dim, config.latent_channels, 1)
785 self.eval() # Chameleon's VQ model is frozen
786
787 def encode(
vllm/model_executor/models/deepencoder.py
+8 -5
@@ -19,6 +19,7 @@ import torch.nn.functional as F
19 from transformers import CLIPVisionConfig
20
21 from vllm.attention.layer import MultiHeadAttention
22 +from vllm.model_executor.layers.conv import Conv2dLayer
23 from vllm.model_executor.layers.quantization import QuantizationConfig
24 from vllm.model_executor.model_loader.weight_utils import default_weight_loader
25
@@ -133,14 +134,14 @@ class ImageEncoderViT(nn.Module):
134 self.blocks.append(block)
135
136 self.neck = nn.Sequential(
136 - nn.Conv2d(
137 + Conv2dLayer(
138 embed_dim,
139 out_chans,
140 kernel_size=1,
141 bias=False,
142 ),
143 LayerNorm2d(out_chans),
143 - nn.Conv2d(
144 + Conv2dLayer(
145 out_chans,
146 out_chans,
147 kernel_size=3,
@@ -150,8 +151,10 @@ class ImageEncoderViT(nn.Module):
151 LayerNorm2d(out_chans),
152 )
153
153 - self.net_2 = nn.Conv2d(256, 512, kernel_size=3, stride=2, padding=1, bias=False)
154 - self.net_3 = nn.Conv2d(
154 + self.net_2 = Conv2dLayer(
155 + 256, 512, kernel_size=3, stride=2, padding=1, bias=False
156 + )
157 + self.net_3 = Conv2dLayer(
158 512, 1024, kernel_size=3, stride=2, padding=1, bias=False
159 )
160
@@ -500,7 +503,7 @@ class PatchEmbed(nn.Module):
503 """
504 super().__init__()
505
503 - self.proj = nn.Conv2d(
506 + self.proj = Conv2dLayer(
507 in_chans, embed_dim, kernel_size=kernel_size, stride=stride, padding=padding
508 )
509
vllm/model_executor/models/dots_ocr.py
+2 -1
@@ -22,6 +22,7 @@ from vllm.distributed.parallel_state import (
22 get_tensor_model_parallel_world_size,
23 )
24 from vllm.model_executor.layers.activation import SiluAndMul
25 +from vllm.model_executor.layers.conv import Conv2dLayer
26 from vllm.model_executor.layers.layernorm import RMSNorm
27 from vllm.model_executor.layers.linear import (
28 ColumnParallelLinear,
@@ -471,7 +472,7 @@ class DotsPatchEmbed(nn.Module):
472 self.temporal_patch_size = config.temporal_patch_size
473 self.embed_dim = config.embed_dim
474 self.config = config
474 - self.proj = nn.Conv2d(
475 + self.proj = Conv2dLayer(
476 config.num_channels,
477 config.embed_dim,
478 kernel_size=(config.patch_size, config.patch_size),
vllm/model_executor/models/glm4_1v.py
+2 -2
@@ -56,7 +56,7 @@ from vllm.config.multimodal import BaseDummyOptions, VideoDummyOptions
56 from vllm.distributed import get_tensor_model_parallel_world_size, parallel_state
57 from vllm.distributed import utils as dist_utils
58 from vllm.logger import init_logger
59 -from vllm.model_executor.layers.conv import Conv3dLayer
59 +from vllm.model_executor.layers.conv import Conv2dLayer, Conv3dLayer
60 from vllm.model_executor.layers.layernorm import RMSNorm
61 from vllm.model_executor.layers.linear import (
62 ColumnParallelLinear,
@@ -734,7 +734,7 @@ class Glm4vVisionTransformer(nn.Module):
734 self.post_conv_layernorm = RMSNorm(
735 vision_config.hidden_size, eps=vision_config.rms_norm_eps
736 )
737 - self.downsample = nn.Conv2d(
737 + self.downsample = Conv2dLayer(
738 in_channels=vision_config.hidden_size,
739 out_channels=vision_config.out_hidden_size,
740 kernel_size=vision_config.spatial_merge_size,
vllm/model_executor/models/glm4v.py
+3 -2
@@ -24,6 +24,7 @@ from vllm.config import VllmConfig
24 from vllm.config.multimodal import BaseDummyOptions
25 from vllm.distributed import get_tensor_model_parallel_world_size
26 from vllm.model_executor.layers.activation import SiluAndMul, get_act_fn
27 +from vllm.model_executor.layers.conv import Conv2dLayer
28 from vllm.model_executor.layers.linear import (
29 ColumnParallelLinear,
30 MergedColumnParallelLinear,
@@ -78,7 +79,7 @@ class GLMVImagePixelInputs(TensorSchema):
79 class EVA2CLIPPatchEmbedding(nn.Module):
80 def __init__(self, config):
81 super().__init__()
81 - self.proj = nn.Conv2d(
82 + self.proj = Conv2dLayer(
83 config.in_channels,
84 config.hidden_size,
85 kernel_size=config.patch_size,
@@ -333,7 +334,7 @@ class EVA2CLIPModel(nn.Module):
334 quant_config=quant_config,
335 prefix=f"{prefix}.linear_proj",
336 )
336 - self.conv = nn.Conv2d(
337 + self.conv = Conv2dLayer(
338 in_channels=vision_config.hidden_size,
339 out_channels=config.hidden_size,
340 kernel_size=2,
vllm/model_executor/models/idefics2_vision_model.py
+2 -1
@@ -30,6 +30,7 @@ from transformers.models.idefics2.configuration_idefics2 import (
30 from vllm.attention.layer import MultiHeadAttention
31 from vllm.distributed import get_tensor_model_parallel_world_size
32 from vllm.model_executor.layers.activation import get_act_fn
33 +from vllm.model_executor.layers.conv import Conv2dLayer
34 from vllm.model_executor.layers.linear import (
35 ColumnParallelLinear,
36 QKVParallelLinear,
@@ -60,7 +61,7 @@ class Idefics2VisionEmbeddings(nn.Module):
61 self.embed_dim = config.hidden_size
62 self.image_size = config.image_size
63 self.patch_size = config.patch_size
63 - self.patch_embedding = nn.Conv2d(
64 + self.patch_embedding = Conv2dLayer(
65 in_channels=config.num_channels,
66 out_channels=self.embed_dim,
67 kernel_size=self.patch_size,
vllm/model_executor/models/intern_vit.py
+2 -1
@@ -24,6 +24,7 @@ from vllm.distributed import (
24 tensor_model_parallel_all_gather,
25 )
26 from vllm.model_executor.layers.activation import get_act_fn
27 +from vllm.model_executor.layers.conv import Conv2dLayer
28 from vllm.model_executor.layers.layernorm import RMSNorm
29 from vllm.model_executor.layers.linear import (
30 ColumnParallelLinear,
@@ -51,7 +52,7 @@ class InternVisionEmbeddings(nn.Module):
52
53 self.class_embedding = nn.Parameter(torch.randn(1, 1, self.embed_dim))
54
54 - self.patch_embedding = nn.Conv2d(
55 + self.patch_embedding = Conv2dLayer(
56 in_channels=3,
57 out_channels=self.embed_dim,
58 kernel_size=self.patch_size,
vllm/model_executor/models/interns1_vit.py
+2 -1
@@ -16,6 +16,7 @@ from transformers.utils import torch_int
16
17 from vllm.attention.layer import MultiHeadAttention
18 from vllm.model_executor.layers.activation import get_act_fn
19 +from vllm.model_executor.layers.conv import Conv2dLayer
20 from vllm.model_executor.layers.layernorm import RMSNorm
21 from vllm.model_executor.layers.linear import ColumnParallelLinear, RowParallelLinear
22 from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -43,7 +44,7 @@ class InternS1VisionPatchEmbeddings(nn.Module):
44 self.num_patches = num_patches
45 self.patch_shape = patch_shape
46
46 - self.projection = nn.Conv2d(
47 + self.projection = Conv2dLayer(
48 num_channels, hidden_size, kernel_size=patch_size, stride=patch_size
49 )
50
vllm/model_executor/models/keye.py
+2 -1
@@ -24,6 +24,7 @@ from vllm.config import VllmConfig
24 from vllm.config.multimodal import BaseDummyOptions
25 from vllm.distributed import get_tensor_model_parallel_world_size
26 from vllm.logger import init_logger
27 +from vllm.model_executor.layers.conv import Conv2dLayer
28 from vllm.model_executor.layers.linear import (
29 ColumnParallelLinear,
30 QKVParallelLinear,
@@ -204,7 +205,7 @@ class KeyeVisionEmbeddings(nn.Module):
205 self.image_size = config.image_size
206 self.patch_size = config.patch_size
207
207 - self.patch_embedding = nn.Conv2d(
208 + self.patch_embedding = Conv2dLayer(
209 in_channels=config.num_channels,
210 out_channels=self.embed_dim,
211 kernel_size=self.patch_size,
vllm/model_executor/models/midashenglm.py
+2 -1
@@ -39,6 +39,7 @@ from vllm.config import VllmConfig
39 from vllm.config.multimodal import BaseDummyOptions
40 from vllm.distributed import get_tensor_model_parallel_world_size
41 from vllm.model_executor.layers.activation import get_act_fn
42 +from vllm.model_executor.layers.conv import Conv2dLayer
43 from vllm.model_executor.layers.linear import (
44 ColumnParallelLinear,
45 QKVParallelLinear,
@@ -120,7 +121,7 @@ class AudioPatchEmbed(nn.Module):
121 self.num_patches = self.grid_size[0] * self.grid_size[1]
122 self.flatten = flatten
123
123 - self.proj = nn.Conv2d(
124 + self.proj = Conv2dLayer(
125 in_chans,
126 embed_dim,
127 kernel_size=self.patch_size,
vllm/model_executor/models/moonvit.py
+2 -1
@@ -53,6 +53,7 @@ from transformers.activations import ACT2FN
53 from transformers.modeling_utils import PreTrainedModel
54 from transformers.utils import is_flash_attn_2_available
55
56 +from vllm.model_executor.layers.conv import Conv2dLayer
57 from vllm.model_executor.layers.linear import ReplicatedLinear
58 from vllm.model_executor.models.utils import maybe_prefix
59 from vllm.transformers_utils.configs.moonvit import MoonViTConfig
@@ -244,7 +245,7 @@ class MoonVisionPatchEmbed(nn.Module):
245 )
246 self.patch_size = patch_size
247
247 - self.proj = nn.Conv2d(
248 + self.proj = Conv2dLayer(
249 in_dim, out_dim, kernel_size=patch_size, stride=patch_size
250 )
251
vllm/model_executor/models/paddleocr_vl.py
+2 -1
@@ -45,6 +45,7 @@ from vllm.config.multimodal import BaseDummyOptions
45 from vllm.distributed import parallel_state
46 from vllm.distributed import utils as dist_utils
47 from vllm.model_executor.layers.activation import get_act_fn
48 +from vllm.model_executor.layers.conv import Conv2dLayer
49 from vllm.model_executor.layers.linear import (
50 ColumnParallelLinear,
51 QKVParallelLinear,
@@ -419,7 +420,7 @@ class SiglipVisionEmbeddings(nn.Module):
420 self.image_size = config.image_size
421 self.patch_size = config.patch_size
422
422 - self.patch_embedding = nn.Conv2d(
423 + self.patch_embedding = Conv2dLayer(
424 in_channels=config.num_channels,
425 out_channels=self.embed_dim,
426 kernel_size=self.patch_size,
vllm/model_executor/models/pixtral.py
+3 -2
@@ -31,6 +31,7 @@ from vllm.config import VllmConfig
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
35 from vllm.model_executor.layers.layernorm import RMSNorm
36 from vllm.model_executor.layers.linear import (
37 MergedColumnParallelLinear,
@@ -747,7 +748,7 @@ class VisionTransformer(nn.Module):
748 def __init__(self, args: VisionEncoderArgs):
749 super().__init__()
750 self.args = args
750 - self.patch_conv = nn.Conv2d(
751 + self.patch_conv = Conv2dLayer(
752 in_channels=args.num_channels,
753 out_channels=args.hidden_size,
754 kernel_size=args.patch_size,
@@ -1212,7 +1213,7 @@ class PixtralHFVisionModel(nn.Module):
1213
1214 self.config = config
1215
1215 - self.patch_conv = nn.Conv2d(
1216 + self.patch_conv = Conv2dLayer(
1217 in_channels=config.num_channels,
1218 out_channels=config.hidden_size,
1219 kernel_size=config.patch_size,
vllm/model_executor/models/qwen_vl.py
+2 -1
@@ -25,6 +25,7 @@ from transformers.tokenization_utils_base import TextInput
25 from vllm.config import VllmConfig
26 from vllm.config.multimodal import BaseDummyOptions
27 from vllm.model_executor.layers.activation import get_act_fn
28 +from vllm.model_executor.layers.conv import Conv2dLayer
29 from vllm.model_executor.layers.linear import (
30 ColumnParallelLinear,
31 ReplicatedLinear,
@@ -333,7 +334,7 @@ class VisionTransformer(nn.Module):
334 patch_height, patch_width = self.patch_size = (patch_size, patch_size)
335 self.grid_size = (image_height // patch_height, image_width // patch_width)
336 self.output_dim = output_dim
336 - self.conv1 = nn.Conv2d(
337 + self.conv1 = Conv2dLayer(
338 in_channels=3,
339 out_channels=width,
340 kernel_size=patch_size,
vllm/model_executor/models/siglip.py
+2 -1
@@ -24,6 +24,7 @@ from vllm.config import VllmConfig
24 from vllm.config.multimodal import BaseDummyOptions
25 from vllm.distributed import divide, get_tensor_model_parallel_world_size
26 from vllm.model_executor.layers.activation import get_act_fn
27 +from vllm.model_executor.layers.conv import Conv2dLayer
28 from vllm.model_executor.layers.linear import (
29 ColumnParallelLinear,
30 QKVParallelLinear,
@@ -286,7 +287,7 @@ class SiglipVisionEmbeddings(nn.Module):
287 self.image_size = config.image_size
288 self.patch_size = config.patch_size
289
289 - self.patch_embedding = nn.Conv2d(
290 + self.patch_embedding = Conv2dLayer(
291 in_channels=config.num_channels,
292 out_channels=self.embed_dim,
293 kernel_size=self.patch_size,
vllm/model_executor/models/siglip2navit.py
+3 -2
@@ -16,6 +16,7 @@ from vllm.attention.backends.registry import AttentionBackendEnum
16 from vllm.attention.layer import maybe_get_vit_flash_attn_backend
17 from vllm.distributed import divide, get_tensor_model_parallel_world_size
18 from vllm.model_executor.layers.activation import get_act_fn
19 +from vllm.model_executor.layers.conv import Conv2dLayer
20 from vllm.model_executor.layers.linear import (
21 ColumnParallelLinear,
22 LinearBase,
@@ -67,7 +68,7 @@ class Siglip2VisionEmbeddings(nn.Module):
68 self.position_embedding = nn.Embedding(self.num_patches, self.embed_dim)
69
70 else:
70 - self.patch_embedding = nn.Conv2d(
71 + self.patch_embedding = Conv2dLayer(
72 in_channels=config.num_channels,
73 out_channels=self.embed_dim,
74 kernel_size=self.patch_size,
@@ -99,7 +100,7 @@ class Siglip2VisionEmbeddings(nn.Module):
100 target_dtype = self.patch_embedding.weight.dtype
101 if isinstance(self.patch_embedding, LinearBase):
102 patch_embeds = self.patch_embedding(pixel_values.to(dtype=target_dtype))
102 - elif isinstance(self.patch_embedding, nn.Conv2d):
103 + elif isinstance(self.patch_embedding, Conv2dLayer):
104 pixel_values = pixel_values.view(
105 -1,
106 self.config.num_channels * self.config.temporal_patch_size,
vllm/model_executor/models/step3_vl.py
+4 -3
@@ -20,6 +20,7 @@ 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.model_executor.layers.activation import get_act_fn
23 +from vllm.model_executor.layers.conv import Conv2dLayer
24 from vllm.model_executor.layers.linear import (
25 ColumnParallelLinear,
26 QKVParallelLinear,
@@ -667,7 +668,7 @@ class Step3VisionEmbeddings(nn.Module):
668
669 self.class_embedding = nn.Parameter(torch.randn(1, self.embed_dim))
670
670 - self.patch_embedding = nn.Conv2d(
671 + self.patch_embedding = Conv2dLayer(
672 in_channels=config.num_channels,
673 out_channels=self.embed_dim,
674 kernel_size=self.patch_size,
@@ -950,13 +951,13 @@ class Step3VLForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsPP)
951 prefix=maybe_prefix(prefix, "vision_model"),
952 use_data_parallel=self.use_data_parallel,
953 )
953 - self.vit_downsampler = nn.Conv2d(
954 + self.vit_downsampler = Conv2dLayer(
955 config.vision_config.hidden_size,
956 config.vision_config.output_hidden_size,
957 kernel_size=2,
958 stride=config.understand_projector_stride,
959 )
959 - self.vit_downsampler2 = nn.Conv2d(
960 + self.vit_downsampler2 = Conv2dLayer(
961 config.vision_config.output_hidden_size,
962 config.vision_config.output_hidden_size * 2,
963 kernel_size=3,