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 14, 22:35 UTC
[Model] Qwen2.5 VL SiLU-and-Mul (#22066)
Signed-off-by: kf <kuanfu.liu@embeddedllm.com> Signed-off-by: vllmellm <vllm.ellm@embeddedllm.com> Co-authored-by: kf <kuanfu.liu@embeddedllm.com>
vllmellm committed
Aug 2, 2025 at 10:34 UTC
ee2eb6ecd86be4b47e334f74feb7874b9a41ca25
1 file changed
+21
-23
vllm/model_executor/models/qwen2_5_vl.py
+21
-23
@@ -43,9 +43,10 @@ from vllm.distributed import parallel_state
43
from vllm.distributed import utils as dist_utils
44
from vllm.logger import init_logger
45
from vllm.model_executor import SamplingMetadata
46
-from vllm.model_executor.layers.activation import _ACTIVATION_REGISTRY
46
+from vllm.model_executor.layers.activation import get_act_and_mul_fn
47
from vllm.model_executor.layers.layernorm import RMSNorm
48
from vllm.model_executor.layers.linear import (ColumnParallelLinear,
49
+ MergedColumnParallelLinear,
50
QKVParallelLinear,
51
RowParallelLinear)
52
from vllm.model_executor.layers.quantization import QuantizationConfig
@@ -171,16 +172,12 @@ class Qwen2_5_VisionMLP(nn.Module):
172
quant_config: Optional[QuantizationConfig] = None,
173
prefix: str = ""):
174
super().__init__()
174
- self.gate_proj = ColumnParallelLinear(in_features,
175
- hidden_features,
176
- bias=bias,
177
- quant_config=quant_config,
178
- prefix=f"{prefix}.gate_proj")
179
- self.up_proj = ColumnParallelLinear(in_features,
180
- hidden_features,
181
- bias=bias,
182
- quant_config=quant_config,
183
- prefix=f"{prefix}.up_proj")
175
+ self.gate_up_proj = MergedColumnParallelLinear(
176
+ input_size=in_features,
177
+ output_sizes=[hidden_features] * 2, # [gate_proj, up_proj]
178
+ bias=bias,
179
+ quant_config=quant_config,
180
+ prefix=f"{prefix}.gate_up_proj")
181
self.down_proj = RowParallelLinear(hidden_features,
182
in_features,
183
bias=bias,
@@ -189,10 +186,9 @@ class Qwen2_5_VisionMLP(nn.Module):
186
self.act_fn = act_fn
187
188
def forward(self, x: torch.Tensor):
192
- x_gate, _ = self.gate_proj(x)
193
- x_gate = self.act_fn(x_gate)
194
- x_up, _ = self.up_proj(x)
195
- x_down, _ = self.down_proj(x_gate * x_up)
189
+ gate_up, _ = self.gate_up_proj(x)
190
+ x = self.act_fn(gate_up)
191
+ x_down, _ = self.down_proj(x)
192
return x_down
193
194
@@ -540,14 +536,14 @@ class Qwen2_5_VisionTransformer(nn.Module):
536
self.rotary_pos_emb = Qwen2_5_VisionRotaryEmbedding(head_dim // 2)
537
538
self.blocks = nn.ModuleList([
543
- Qwen2_5_VisionBlock(
544
- dim=self.hidden_size,
545
- num_heads=self.num_heads,
546
- mlp_hidden_dim=vision_config.intermediate_size,
547
- act_fn=_ACTIVATION_REGISTRY[vision_config.hidden_act],
548
- norm_layer=norm_layer,
549
- quant_config=quant_config,
550
- prefix=f"{prefix}.blocks.{layer_idx}")
539
+ Qwen2_5_VisionBlock(dim=self.hidden_size,
540
+ num_heads=self.num_heads,
541
+ mlp_hidden_dim=vision_config.intermediate_size,
542
+ act_fn=get_act_and_mul_fn(
543
+ vision_config.hidden_act),
544
+ norm_layer=norm_layer,
545
+ quant_config=quant_config,
546
+ prefix=f"{prefix}.blocks.{layer_idx}")
547
for layer_idx in range(depth)
548
])
549
self.merger = Qwen2_5_VisionPatchMerger(
@@ -752,6 +748,8 @@ class Qwen2_5_VisionTransformer(nn.Module):
748
("attn.qkv.", "attn.q.", "q"),
749
("attn.qkv.", "attn.k.", "k"),
750
("attn.qkv.", "attn.v.", "v"),
751
+ ("mlp.gate_up_proj.", "mlp.gate_proj.", 0),
752
+ ("mlp.gate_up_proj.", "mlp.up_proj.", 1),
753
]
754
params_dict = dict(self.named_parameters(remove_duplicate=False))
755
loaded_params: set[str] = set()