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, 05:30 UTC
[Bugfix] Standardize merging multimodal embeddings (#26771)
Signed-off-by: DarkLight1337 <tlleungac@connect.ust.hk>
Cyrus Leung committed
Oct 14, 2025 at 17:36 UTC
d2f816d6ff99ec0623f6596b90925f8164e6c7a6
19 files changed
+57
-57
vllm/model_executor/models/ernie45_vl.py
+3
-3
@@ -1645,12 +1645,12 @@ class Ernie4_5_VLMoeForConditionalGeneration(
1645
for modality in modalities:
1646
if modality == "images":
1647
image_input = modalities["images"]
1648
- vision_embeddings = self._process_image_input(image_input)
1649
- multimodal_embeddings += vision_embeddings
1648
+ image_embeddings = self._process_image_input(image_input)
1649
+ multimodal_embeddings += tuple(image_embeddings)
1650
if modality == "videos":
1651
video_input = modalities["videos"]
1652
video_embeddings = self._process_video_input(video_input)
1653
- multimodal_embeddings += video_embeddings
1653
+ multimodal_embeddings += tuple(video_embeddings)
1654
1655
return multimodal_embeddings
1656
vllm/model_executor/models/glm4_1v.py
+3
-3
@@ -1608,11 +1608,11 @@ class Glm4vForConditionalGeneration(
1608
for modality in mm_input_by_modality:
1609
multimodal_input = mm_input_by_modality[modality]
1610
if modality == "image":
1611
- vision_embeddings = self._process_image_input(multimodal_input)
1612
- multimodal_embeddings += vision_embeddings
1611
+ image_embeddings = self._process_image_input(multimodal_input)
1612
+ multimodal_embeddings += tuple(image_embeddings)
1613
if modality == "video":
1614
video_embeddings = self._process_video_input(multimodal_input)
1615
- multimodal_embeddings += video_embeddings
1615
+ multimodal_embeddings += tuple(video_embeddings)
1616
return multimodal_embeddings
1617
1618
def forward(
vllm/model_executor/models/hyperclovax_vision.py
+3
-3
@@ -749,12 +749,12 @@ class HCXVisionForCausalLM(nn.Module, SupportsMultiModal, SupportsPP):
749
for modality in modalities:
750
if modality == "images":
751
image_input = modalities["images"]
752
- vision_embeddings = self._process_image_input(image_input)
753
- multimodal_embeddings += vision_embeddings
752
+ image_embeddings = self._process_image_input(image_input)
753
+ multimodal_embeddings += tuple(image_embeddings)
754
if modality == "videos":
755
video_input = modalities["videos"]
756
video_embeddings = self._process_video_input(video_input)
757
- multimodal_embeddings += video_embeddings
757
+ multimodal_embeddings += tuple(video_embeddings)
758
759
return multimodal_embeddings
760
vllm/model_executor/models/interns1.py
+3
-3
@@ -753,12 +753,12 @@ class InternS1ForConditionalGeneration(
753
for modality in modalities:
754
if modality == "images":
755
image_input = modalities["images"]
756
- vision_embeddings = self._process_vision_input(image_input)
757
- multimodal_embeddings += vision_embeddings
756
+ image_embeddings = self._process_vision_input(image_input)
757
+ multimodal_embeddings += tuple(image_embeddings)
758
if modality == "videos":
759
video_input = modalities["videos"]
760
video_embeddings = self._process_vision_input(video_input)
761
- multimodal_embeddings += video_embeddings
761
+ multimodal_embeddings += tuple(video_embeddings)
762
763
return multimodal_embeddings
764
vllm/model_executor/models/internvl.py
+3
-3
@@ -1358,12 +1358,12 @@ class InternVLChatModel(nn.Module, SupportsMultiModal, SupportsPP, SupportsLoRA)
1358
for modality in modalities:
1359
if modality == "images":
1360
image_input = modalities["images"]
1361
- vision_embeddings = self._process_vision_input(image_input)
1362
- multimodal_embeddings += vision_embeddings
1361
+ image_embeddings = self._process_vision_input(image_input)
1362
+ multimodal_embeddings += tuple(image_embeddings)
1363
if modality == "videos":
1364
video_input = modalities["videos"]
1365
video_embeddings = self._process_vision_input(video_input)
1366
- multimodal_embeddings += video_embeddings
1366
+ multimodal_embeddings += tuple(video_embeddings)
1367
1368
return multimodal_embeddings
1369
vllm/model_executor/models/keye.py
+3
-3
@@ -1459,12 +1459,12 @@ class BaseKeyeModule(nn.Module):
1459
for modality in modalities:
1460
if modality == "images":
1461
image_input = modalities["images"]
1462
- vision_embeddings = self._process_image_input(image_input)
1463
- multimodal_embeddings += vision_embeddings
1462
+ image_embeddings = self._process_image_input(image_input)
1463
+ multimodal_embeddings += tuple(image_embeddings)
1464
if modality == "videos":
1465
video_input = modalities["videos"]
1466
video_embeddings = self._process_video_input(video_input)
1467
- multimodal_embeddings += video_embeddings
1467
+ multimodal_embeddings += tuple(video_embeddings)
1468
return multimodal_embeddings
1469
1470
def forward(
vllm/model_executor/models/llava_onevision.py
+2
-2
@@ -881,8 +881,8 @@ class LlavaOnevisionForConditionalGeneration(nn.Module, SupportsMultiModal, Supp
881
for modality in mm_input_by_modality:
882
multimodal_input = mm_input_by_modality[modality]
883
if modality == "image":
884
- vision_embeddings = self._process_image_input(multimodal_input)
885
- multimodal_embeddings += tuple(vision_embeddings)
884
+ image_embeddings = self._process_image_input(multimodal_input)
885
+ multimodal_embeddings += tuple(image_embeddings)
886
if modality == "video":
887
video_embeddings = self._process_video_pixels(multimodal_input)
888
multimodal_embeddings += tuple(video_embeddings)
vllm/model_executor/models/minicpmo.py
+2
-2
@@ -762,7 +762,7 @@ class MiniCPMO(MiniCPMV2_6):
762
for modality in modalities:
763
if modality == "audios":
764
audio_input = modalities["audios"]
765
- audio_features = self._process_audio_input(audio_input)
766
- multimodal_embeddings += tuple(audio_features)
765
+ audio_embeddings = self._process_audio_input(audio_input)
766
+ multimodal_embeddings += tuple(audio_embeddings)
767
768
return multimodal_embeddings
vllm/model_executor/models/minicpmv.py
+4
-4
@@ -1129,12 +1129,12 @@ class MiniCPMVBaseModel(nn.Module, SupportsMultiModal, SupportsPP):
1129
for modality in modalities:
1130
if modality == "images":
1131
image_input = modalities["images"]
1132
- image_features = self._process_vision_input(image_input)
1133
- multimodal_embeddings += tuple(image_features)
1132
+ image_embeddings = self._process_vision_input(image_input)
1133
+ multimodal_embeddings += tuple(image_embeddings)
1134
if modality == "videos":
1135
video_input = modalities["videos"]
1136
- video_features = self._process_vision_input(video_input)
1137
- multimodal_embeddings += tuple(video_features)
1136
+ video_embeddings = self._process_vision_input(video_input)
1137
+ multimodal_embeddings += tuple(video_embeddings)
1138
1139
return multimodal_embeddings
1140
vllm/model_executor/models/nano_nemotron_vl.py
+3
-3
@@ -1263,12 +1263,12 @@ class NemotronH_Nano_VL_V2(
1263
for modality in modalities:
1264
if modality == "images":
1265
image_input = modalities["images"]
1266
- vision_embeddings = self._process_image_input(image_input)
1267
- multimodal_embeddings += vision_embeddings
1266
+ image_embeddings = self._process_image_input(image_input)
1267
+ multimodal_embeddings += tuple(image_embeddings)
1268
if modality == "videos":
1269
video_input = modalities["videos"]
1270
video_embeddings = self._process_video_input(video_input)
1271
- multimodal_embeddings += video_embeddings
1271
+ multimodal_embeddings += tuple(video_embeddings)
1272
1273
return multimodal_embeddings
1274
vllm/model_executor/models/nemotron_vl.py
+2
-2
@@ -575,8 +575,8 @@ class LlamaNemotronVLChatModel(nn.Module, SupportsMultiModal, SupportsPP, Suppor
575
for modality in modalities:
576
if modality == "images":
577
image_input = modalities["images"]
578
- vision_embeddings = self._process_image_input(image_input)
579
- multimodal_embeddings += vision_embeddings
578
+ image_embeddings = self._process_image_input(image_input)
579
+ multimodal_embeddings += tuple(image_embeddings)
580
581
return multimodal_embeddings
582
vllm/model_executor/models/ovis2_5.py
+3
-3
@@ -616,12 +616,12 @@ class Ovis2_5(nn.Module, SupportsMultiModal, SupportsPP):
616
for modality in modalities:
617
if modality == "images":
618
image_input = modalities["images"]
619
- vision_embeddings = self._process_visual_input(image_input)
620
- multimodal_embeddings += vision_embeddings
619
+ image_embeddings = self._process_visual_input(image_input)
620
+ multimodal_embeddings += tuple(image_embeddings)
621
if modality == "videos":
622
video_input = modalities["videos"]
623
video_embeddings = self._process_visual_input(video_input)
624
- multimodal_embeddings += video_embeddings
624
+ multimodal_embeddings += tuple(video_embeddings)
625
626
return multimodal_embeddings
627
vllm/model_executor/models/phi4_multimodal.py
+2
-2
@@ -1430,8 +1430,8 @@ class Phi4MultimodalForCausalLM(nn.Module, SupportsLoRA, SupportsMultiModal):
1430
if modality == "images":
1431
audio_projection_mode = "vision"
1432
image_input = modalities["images"]
1433
- vision_embeddings = self._process_image_input(image_input)
1434
- multimodal_embeddings += tuple(vision_embeddings)
1433
+ image_embeddings = self._process_image_input(image_input)
1434
+ multimodal_embeddings += tuple(image_embeddings)
1435
if modality == "audios":
1436
audio_input = modalities["audios"]
1437
audio_embeddings = self._process_audio_input(
vllm/model_executor/models/phi4mm.py
+2
-2
@@ -1248,8 +1248,8 @@ class Phi4MMForCausalLM(nn.Module, SupportsLoRA, SupportsMultiModal):
1248
if modality == "images":
1249
audio_projection_mode = "vision"
1250
image_input = modalities["images"]
1251
- vision_embeddings = self._process_image_input(image_input)
1252
- multimodal_embeddings += tuple(vision_embeddings)
1251
+ image_embeddings = self._process_image_input(image_input)
1252
+ multimodal_embeddings += tuple(image_embeddings)
1253
if modality == "audios":
1254
audio_input = modalities["audios"]
1255
audio_embeddings = self._process_audio_input(
vllm/model_executor/models/qwen2_5_omni_thinker.py
+4
-4
@@ -1210,14 +1210,14 @@ class Qwen2_5OmniThinkerForConditionalGeneration(
1210
for modality in mm_input_by_modality:
1211
multimodal_input = mm_input_by_modality[modality]
1212
if modality == "image":
1213
- vision_embeddings = self._process_image_input(multimodal_input)
1214
- multimodal_embeddings += vision_embeddings
1213
+ image_embeddings = self._process_image_input(multimodal_input)
1214
+ multimodal_embeddings += tuple(image_embeddings)
1215
if modality == "video":
1216
video_embeddings = self._process_video_input(multimodal_input)
1217
- multimodal_embeddings += video_embeddings
1217
+ multimodal_embeddings += tuple(video_embeddings)
1218
if modality == "audio":
1219
audio_embeddings = self._process_audio_input(multimodal_input)
1220
- multimodal_embeddings += audio_embeddings
1220
+ multimodal_embeddings += tuple(audio_embeddings)
1221
return multimodal_embeddings
1222
1223
# TODO (ywang96): support overlapping modality embeddings so that
vllm/model_executor/models/qwen2_5_vl.py
+5
-5
@@ -1586,19 +1586,19 @@ class Qwen2_5_VLForConditionalGeneration(
1586
for modality in mm_input_by_modality:
1587
multimodal_input = mm_input_by_modality[modality]
1588
if modality == "image":
1589
- vision_embeddings = self._process_image_input(multimodal_input)
1589
+ image_embeddings = self._process_image_input(multimodal_input)
1590
if self.is_multimodal_pruning_enabled:
1591
- vision_embeddings = self._postprocess_image_embeds_evs(
1592
- vision_embeddings, multimodal_input
1591
+ image_embeddings = self._postprocess_image_embeds_evs(
1592
+ image_embeddings, multimodal_input
1593
)
1594
- multimodal_embeddings += vision_embeddings
1594
+ multimodal_embeddings += tuple(image_embeddings)
1595
if modality == "video":
1596
video_embeddings = self._process_video_input(multimodal_input)
1597
if self.is_multimodal_pruning_enabled:
1598
video_embeddings = self._postprocess_video_embeds_evs(
1599
video_embeddings, multimodal_input
1600
)
1601
- multimodal_embeddings += video_embeddings
1601
+ multimodal_embeddings += tuple(video_embeddings)
1602
return multimodal_embeddings
1603
1604
def forward(
vllm/model_executor/models/qwen2_vl.py
+3
-3
@@ -1561,12 +1561,12 @@ class Qwen2VLForConditionalGeneration(
1561
for modality in modalities:
1562
if modality == "images":
1563
image_input = modalities["images"]
1564
- vision_embeddings = self._process_image_input(image_input)
1565
- multimodal_embeddings += vision_embeddings
1564
+ image_embeddings = self._process_image_input(image_input)
1565
+ multimodal_embeddings += tuple(image_embeddings)
1566
if modality == "videos":
1567
video_input = modalities["videos"]
1568
video_embeddings = self._process_video_input(video_input)
1569
- multimodal_embeddings += video_embeddings
1569
+ multimodal_embeddings += tuple(video_embeddings)
1570
1571
return multimodal_embeddings
1572
vllm/model_executor/models/qwen3_omni_moe_thinker.py
+4
-4
@@ -1260,14 +1260,14 @@ class Qwen3OmniMoeThinkerForConditionalGeneration(
1260
for modality in mm_input_by_modality:
1261
multimodal_input = mm_input_by_modality[modality]
1262
if modality == "image":
1263
- vision_embeddings = self._process_image_input(multimodal_input)
1264
- multimodal_embeddings += vision_embeddings
1263
+ image_embeddings = self._process_image_input(multimodal_input)
1264
+ multimodal_embeddings += tuple(image_embeddings)
1265
if modality == "video":
1266
video_embeddings = self._process_video_input(multimodal_input)
1267
- multimodal_embeddings += video_embeddings
1267
+ multimodal_embeddings += tuple(video_embeddings)
1268
if modality == "audio":
1269
audio_embeddings = self._process_audio_input(multimodal_input)
1270
- multimodal_embeddings += audio_embeddings
1270
+ multimodal_embeddings += tuple(audio_embeddings)
1271
return multimodal_embeddings
1272
1273
def get_input_embeddings(
vllm/model_executor/models/qwen3_vl.py
+3
-3
@@ -1601,11 +1601,11 @@ class Qwen3VLForConditionalGeneration(
1601
for modality in mm_input_by_modality:
1602
multimodal_input = mm_input_by_modality[modality]
1603
if modality == "image":
1604
- vision_embeddings = self._process_image_input(multimodal_input)
1605
- multimodal_embeddings += vision_embeddings
1604
+ image_embeddings = self._process_image_input(multimodal_input)
1605
+ multimodal_embeddings += tuple(image_embeddings)
1606
if modality == "video":
1607
video_embeddings = self._process_video_input(multimodal_input)
1608
- multimodal_embeddings += video_embeddings
1608
+ multimodal_embeddings += tuple(video_embeddings)
1609
return multimodal_embeddings
1610
1611
def _compute_deepstack_embeds(