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 3, 01:45 UTC
[Model] Fix MiniCPM-V 4.6 vit_merger qkv weight loading (#43213)
Signed-off-by: tc-mb <tianchi_cai@icloud.com>
tc-mb committed
May 22, 2026 at 13:44 UTC
fa1ff88b3145d1897558408a9001c030c39383b9
1 file changed
+28
vllm/model_executor/models/minicpmv4_6.py
+28
@@ -23,6 +23,7 @@ from vllm.model_executor.layers.mamba.mamba_utils import (
23
MambaStateShapeCalculator,
24
)
25
from vllm.model_executor.layers.quantization import QuantizationConfig
26
+from vllm.model_executor.model_loader.weight_utils import default_weight_loader
27
from vllm.multimodal import MULTIMODAL_REGISTRY
28
from vllm.multimodal.inputs import (
29
MultiModalFeatureSpec,
@@ -590,6 +591,33 @@ class MiniCPMV4_6ViTWindowAttentionSelfAttn(nn.Module):
591
out, _ = self.out_proj(attn_out)
592
return out
593
594
+ def load_weights(self, weights: Iterable[tuple[str, torch.Tensor]]) -> set[str]:
595
+ stacked_params_mapping = [
596
+ ("qkv_proj", "q_proj", "q"),
597
+ ("qkv_proj", "k_proj", "k"),
598
+ ("qkv_proj", "v_proj", "v"),
599
+ ]
600
+ params_dict = dict(self.named_parameters())
601
+ loaded_params: set[str] = set()
602
+ for name, loaded_weight in weights:
603
+ for param_name, weight_name, shard_id in stacked_params_mapping:
604
+ if weight_name not in name:
605
+ continue
606
+ mapped_name = name.replace(weight_name, param_name, 1)
607
+ if mapped_name not in params_dict:
608
+ continue
609
+ param = params_dict[mapped_name]
610
+ param.weight_loader(param, loaded_weight, shard_id)
611
+ break
612
+ else:
613
+ if name not in params_dict:
614
+ continue
615
+ param = params_dict[name]
616
+ weight_loader = getattr(param, "weight_loader", default_weight_loader)
617
+ weight_loader(param, loaded_weight)
618
+ loaded_params.add(name)
619
+ return loaded_params
620
+
621
622
class MiniCPMV4_6ViTWindowAttentionMerger(nn.Module):
623
def __init__(