@tduncan / Nvidia-Optimization-Stack-VLLM Mirror · read-only / commits / ab656f2c2f
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 15, 18:30 UTC

[Bugfix] Loosen type check to avoid errors in V1 (#15021)

Signed-off-by: DarkLight1337 <tlleungac@connect.ust.hk>

Cyrus Leung committed Mar 18, 2025 at 20:54 UTC ab656f2c2feb834a9d3d90456f684200edd2abd8
9 files changed +28 -37
vllm/model_executor/models/blip2.py
+5 -7
@@ -25,7 +25,7 @@ from vllm.sequence import IntermediateTensors
25
26 from .blip import BlipVisionModel
27 from .interfaces import MultiModalEmbeddings, SupportsMultiModal, SupportsPP
28 -from .utils import (AutoWeightsLoader, init_vllm_registered_model,
28 +from .utils import (AutoWeightsLoader, flatten_bn, init_vllm_registered_model,
29 maybe_prefix, merge_multimodal_embeddings)
30
31 # We use this internally as placeholders since there is no image token
@@ -565,12 +565,11 @@ class Blip2ForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsPP):
565 return None
566
567 if pixel_values is not None:
568 - if not isinstance(pixel_values, torch.Tensor):
568 + if not isinstance(pixel_values, (torch.Tensor, list)):
569 raise ValueError("Incorrect type of pixel values. "
570 f"Got type: {type(pixel_values)}")
571
572 - # Remove the N dimension until multiple images are supported.
573 - pixel_values = pixel_values.squeeze(1)
572 + pixel_values = flatten_bn(pixel_values, concat=True)
573
574 return Blip2ImagePixelInputs(
575 type="pixel_values",
@@ -578,12 +577,11 @@ class Blip2ForConditionalGeneration(nn.Module, SupportsMultiModal, SupportsPP):
577 )
578
579 if image_embeds is not None:
581 - if not isinstance(image_embeds, torch.Tensor):
580 + if not isinstance(image_embeds, (torch.Tensor, list)):
581 raise ValueError("Incorrect type of image embeddings. "
582 f"Got type: {type(image_embeds)}")
583
585 - # Remove the N dimension until multiple images are supported.
586 - image_embeds = image_embeds.squeeze(1)
584 + image_embeds = flatten_bn(image_embeds, concat=True)
585
586 return Blip2ImageEmbeddingInputs(
587 type="image_embeds",
vllm/model_executor/models/chameleon.py
+3 -4
@@ -39,7 +39,7 @@ from vllm.multimodal.profiling import BaseDummyInputsBuilder, ProcessorInputs
39 from vllm.sequence import IntermediateTensors
40
41 from .interfaces import MultiModalEmbeddings, SupportsMultiModal, SupportsPP
42 -from .utils import (is_pp_missing_parameter,
42 +from .utils import (flatten_bn, is_pp_missing_parameter,
43 make_empty_intermediate_tensors_factory, make_layers,
44 maybe_prefix, merge_multimodal_embeddings)
45
@@ -972,12 +972,11 @@ class ChameleonForConditionalGeneration(nn.Module, SupportsMultiModal,
972 if pixel_values is None:
973 return None
974
975 - if not isinstance(pixel_values, torch.Tensor):
975 + if not isinstance(pixel_values, (torch.Tensor, list)):
976 raise ValueError("Incorrect type of pixel values. "
977 f"Got type: {type(pixel_values)}")
978
979 - # Remove the N dimension until multiple images are supported.
980 - pixel_values = pixel_values.squeeze(1)
979 + pixel_values = flatten_bn(pixel_values, concat=True)
980
981 return ChameleonImagePixelInputs(
982 type="pixel_values",
vllm/model_executor/models/deepseek_vl2.py
+1 -1
@@ -478,7 +478,7 @@ class DeepseekVLV2ForCausalLM(nn.Module, SupportsMultiModal, SupportsPP):
478 flatten_bn(images_spatial_crop, concat=True)))
479
480 if image_embeds is not None:
481 - if not isinstance(image_embeds, torch.Tensor):
481 + if not isinstance(image_embeds, (torch.Tensor, list)):
482 raise ValueError("Incorrect type of image embeddings. "
483 f"Got type: {type(image_embeds)}")
484
vllm/model_executor/models/glm4v.py
+1 -1
@@ -578,7 +578,7 @@ class GLM4VForCausalLM(ChatGLMBaseModel, SupportsLoRA, SupportsPP,
578 pixel_values = kwargs.pop("pixel_values", None)
579
580 if pixel_values is not None:
581 - if not isinstance(pixel_values, torch.Tensor):
581 + if not isinstance(pixel_values, (torch.Tensor, list)):
582 raise ValueError("Incorrect type of pixel values. "
583 f"Got type: {type(pixel_values)}")
584
vllm/model_executor/models/internvl.py
+4 -2
@@ -838,7 +838,7 @@ class InternVLChatModel(nn.Module, SupportsMultiModal, SupportsPP):
838 return None
839
840 if image_embeds is not None:
841 - if not isinstance(image_embeds, torch.Tensor):
841 + if not isinstance(image_embeds, (torch.Tensor, list)):
842 raise ValueError("Incorrect type of image embeddings. "
843 f"Got type: {type(image_embeds)}")
844
@@ -856,7 +856,9 @@ class InternVLChatModel(nn.Module, SupportsMultiModal, SupportsPP):
856 raise ValueError("Incorrect type of pixel values. "
857 f"Got type: {type(pixel_values_flat)}")
858
859 - assert isinstance(image_num_patches, (torch.Tensor, list))
859 + if not isinstance(image_num_patches, (torch.Tensor, list)):
860 + raise ValueError("Incorrect type of image_num_patches. "
861 + f"Got type: {type(pixel_values_flat)}")
862
863 return InternVLImagePixelInputs(
864 type="pixel_values",
vllm/model_executor/models/llava_next_video.py
+6 -9
@@ -349,21 +349,18 @@ class LlavaNextVideoForConditionalGeneration(nn.Module, SupportsMultiModal,
349 List[b, Tensor(nb_frames, nb_channels, height, width)]
350 }
351 """
352 - pixel_values = kwargs.pop("pixel_values_videos", None)
352 + pixel_values_videos = kwargs.pop("pixel_values_videos", None)
353
354 - if pixel_values is None:
354 + if pixel_values_videos is None:
355 return None
356
357 - if not (is_list_of(pixel_values,
358 - (torch.Tensor)) # different shape videos
359 - or isinstance(pixel_values,
360 - torch.Tensor)): # same shape videos
361 - raise ValueError("Incorrect type of pixel values. "
362 - f"Got type: {type(pixel_values)}")
357 + if not isinstance(pixel_values_videos, (torch.Tensor, list)):
358 + raise ValueError("Incorrect type of pixel_values_videos. "
359 + f"Got type: {type(pixel_values_videos)}")
360
361 return LlavaNextVideoPixelInputs(
362 type="pixel_values_videos",
366 - data=pixel_values,
363 + data=pixel_values_videos,
364 )
365
366 def _select_image_features(self, image_features: torch.Tensor, *,
vllm/model_executor/models/llava_onevision.py
+1 -4
@@ -574,10 +574,7 @@ class LlavaOnevisionForConditionalGeneration(nn.Module, SupportsMultiModal,
574 if pixel_values_videos is None:
575 return None
576
577 - if not (is_list_of(pixel_values_videos,
578 - torch.Tensor) # different shape videos
579 - or isinstance(pixel_values_videos,
580 - torch.Tensor)): # same shape videos
577 + if not isinstance(pixel_values_videos, (torch.Tensor, list)):
578 raise ValueError("Incorrect type of pixel_values_videos. "
579 f"Got type: {type(pixel_values_videos)}")
580
vllm/model_executor/models/paligemma.py
+4 -6
@@ -23,7 +23,7 @@ from vllm.sequence import IntermediateTensors
23
24 from .interfaces import MultiModalEmbeddings, SupportsMultiModal, SupportsPP
25 from .siglip import SiglipVisionModel
26 -from .utils import (AutoWeightsLoader, init_vllm_registered_model,
26 +from .utils import (AutoWeightsLoader, flatten_bn, init_vllm_registered_model,
27 maybe_prefix, merge_multimodal_embeddings)
28 from .vision import get_vision_encoder_info
29
@@ -270,12 +270,11 @@ class PaliGemmaForConditionalGeneration(nn.Module, SupportsMultiModal,
270 return None
271
272 if pixel_values is not None:
273 - if not isinstance(pixel_values, torch.Tensor):
273 + if not isinstance(pixel_values, (torch.Tensor, list)):
274 raise ValueError("Incorrect type of pixel values. "
275 f"Got type: {type(pixel_values)}")
276
277 - # Remove the N dimension until multiple images are supported.
278 - pixel_values = pixel_values.squeeze(1)
277 + pixel_values = flatten_bn(pixel_values, concat=True)
278
279 return PaliGemmaImagePixelInputs(
280 type="pixel_values",
@@ -287,8 +286,7 @@ class PaliGemmaForConditionalGeneration(nn.Module, SupportsMultiModal,
286 raise ValueError("Incorrect type of image embeddings. "
287 f"Got type: {type(image_embeds)}")
288
290 - # Remove the N dimension until multiple images are supported.
291 - image_embeds = image_embeds.squeeze(1)
289 + image_embeds = flatten_bn(image_embeds, concat=True)
290
291 return PaliGemmaImageEmbeddingInputs(
292 type="image_embeds",
vllm/model_executor/models/qwen_vl.py
+3 -3
@@ -711,7 +711,7 @@ class QwenVLForConditionalGeneration(QWenBaseModel, SupportsPP, SupportsLoRA,
711 image_embeds = kwargs.pop("image_embeds", None)
712
713 if pixel_values is not None:
714 - if not isinstance(pixel_values, torch.Tensor):
714 + if not isinstance(pixel_values, (torch.Tensor, list)):
715 raise ValueError("Incorrect type of pixel values. "
716 f"Got type: {type(pixel_values)}")
717
@@ -722,13 +722,13 @@ class QwenVLForConditionalGeneration(QWenBaseModel, SupportsPP, SupportsLoRA,
722 )
723
724 if image_embeds is not None:
725 - if not isinstance(image_embeds, torch.Tensor):
725 + if not isinstance(image_embeds, (torch.Tensor, list)):
726 raise ValueError("Incorrect type of image embeddings. "
727 f"Got type: {type(image_embeds)}")
728
729 return QwenImageEmbeddingInputs(
730 type="image_embeds",
731 - data=flatten_bn(image_embeds),
731 + data=flatten_bn(image_embeds, concat=True),
732 )
733
734 return None