[0/N] Rename MultiModalInputs to MultiModalKwargs (#10040)

Signed-off-by: DarkLight1337 <tlleungac@connect.ust.hk>
This commit is contained in:
Cyrus Leung 2024-11-09 11:31:02 +08:00 committed by GitHub
parent d7edca1dee
commit e0191a95d8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
32 changed files with 151 additions and 121 deletions

View File

@ -53,7 +53,7 @@ Base Classes
.. autodata:: vllm.multimodal.MultiModalDataDict .. autodata:: vllm.multimodal.MultiModalDataDict
.. autoclass:: vllm.multimodal.MultiModalInputs .. autoclass:: vllm.multimodal.MultiModalKwargs
:members: :members:
:show-inheritance: :show-inheritance:

View File

@ -6,7 +6,7 @@ import torch
from PIL.Image import Image from PIL.Image import Image
from vllm.inputs import InputContext, token_inputs from vllm.inputs import InputContext, token_inputs
from vllm.multimodal.base import MultiModalInputs from vllm.multimodal.base import MultiModalKwargs
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
from .....conftest import IMAGE_ASSETS from .....conftest import IMAGE_ASSETS
@ -96,7 +96,7 @@ def test_input_mapper_valid_mm_data(input_mapper_for_qwen,
mapped_img_data = input_mapper_for_qwen(qwen_vl_context, img_data) mapped_img_data = input_mapper_for_qwen(qwen_vl_context, img_data)
# Ensure that we get the appropriately shaped pixel_values # Ensure that we get the appropriately shaped pixel_values
# for images and image embeddings, respectively. # for images and image embeddings, respectively.
assert isinstance(mapped_img_data, MultiModalInputs) assert isinstance(mapped_img_data, MultiModalKwargs)
assert "pixel_values" in mapped_img_data assert "pixel_values" in mapped_img_data
assert mapped_img_data["pixel_values"].shape == expected_shape assert mapped_img_data["pixel_values"].shape == expected_shape

View File

@ -1,6 +1,6 @@
import torch import torch
from vllm.multimodal.base import MultiModalInputs, NestedTensors from vllm.multimodal.base import MultiModalKwargs, NestedTensors
def assert_nested_tensors_equal(expected: NestedTensors, def assert_nested_tensors_equal(expected: NestedTensors,
@ -13,8 +13,8 @@ def assert_nested_tensors_equal(expected: NestedTensors,
assert_nested_tensors_equal(expected_item, actual_item) assert_nested_tensors_equal(expected_item, actual_item)
def assert_multimodal_inputs_equal(expected: MultiModalInputs, def assert_multimodal_inputs_equal(expected: MultiModalKwargs,
actual: MultiModalInputs): actual: MultiModalKwargs):
assert set(expected.keys()) == set(actual.keys()) assert set(expected.keys()) == set(actual.keys())
for key in expected: for key in expected:
assert_nested_tensors_equal(expected[key], actual[key]) assert_nested_tensors_equal(expected[key], actual[key])
@ -22,7 +22,7 @@ def assert_multimodal_inputs_equal(expected: MultiModalInputs,
def test_multimodal_input_batch_single_tensor(): def test_multimodal_input_batch_single_tensor():
t = torch.rand([1, 2]) t = torch.rand([1, 2])
result = MultiModalInputs.batch([{"image": t}]) result = MultiModalKwargs.batch([{"image": t}])
assert_multimodal_inputs_equal(result, {"image": t.unsqueeze(0)}) assert_multimodal_inputs_equal(result, {"image": t.unsqueeze(0)})
@ -30,7 +30,7 @@ def test_multimodal_input_batch_multiple_tensors():
a = torch.rand([1, 1, 2]) a = torch.rand([1, 1, 2])
b = torch.rand([1, 1, 2]) b = torch.rand([1, 1, 2])
c = torch.rand([1, 1, 2]) c = torch.rand([1, 1, 2])
result = MultiModalInputs.batch([{"image": a}, {"image": b}, {"image": c}]) result = MultiModalKwargs.batch([{"image": a}, {"image": b}, {"image": c}])
assert_multimodal_inputs_equal(result, {"image": torch.stack([a, b, c])}) assert_multimodal_inputs_equal(result, {"image": torch.stack([a, b, c])})
@ -38,7 +38,7 @@ def test_multimodal_input_batch_multiple_heterogeneous_tensors():
a = torch.rand([1, 2, 2]) a = torch.rand([1, 2, 2])
b = torch.rand([1, 3, 2]) b = torch.rand([1, 3, 2])
c = torch.rand([1, 4, 2]) c = torch.rand([1, 4, 2])
result = MultiModalInputs.batch([{"image": a}, {"image": b}, {"image": c}]) result = MultiModalKwargs.batch([{"image": a}, {"image": b}, {"image": c}])
assert_multimodal_inputs_equal(result, {"image": [a, b, c]}) assert_multimodal_inputs_equal(result, {"image": [a, b, c]})
@ -46,7 +46,7 @@ def test_multimodal_input_batch_nested_tensors():
a = torch.rand([2, 3]) a = torch.rand([2, 3])
b = torch.rand([2, 3]) b = torch.rand([2, 3])
c = torch.rand([2, 3]) c = torch.rand([2, 3])
result = MultiModalInputs.batch([{ result = MultiModalKwargs.batch([{
"image": [a] "image": [a]
}, { }, {
"image": [b] "image": [b]
@ -65,7 +65,7 @@ def test_multimodal_input_batch_heterogeneous_lists():
a = torch.rand([1, 2, 3]) a = torch.rand([1, 2, 3])
b = torch.rand([1, 2, 3]) b = torch.rand([1, 2, 3])
c = torch.rand([1, 2, 3]) c = torch.rand([1, 2, 3])
result = MultiModalInputs.batch([{"image": [a, b]}, {"image": [c]}]) result = MultiModalKwargs.batch([{"image": [a, b]}, {"image": [c]}])
assert_multimodal_inputs_equal( assert_multimodal_inputs_equal(
result, result,
{"image": [torch.stack([a, b]), c.unsqueeze(0)]}) {"image": [torch.stack([a, b]), c.unsqueeze(0)]})
@ -76,7 +76,7 @@ def test_multimodal_input_batch_multiple_batchable_lists():
b = torch.rand([1, 2, 3]) b = torch.rand([1, 2, 3])
c = torch.rand([1, 2, 3]) c = torch.rand([1, 2, 3])
d = torch.rand([1, 2, 3]) d = torch.rand([1, 2, 3])
result = MultiModalInputs.batch([{"image": [a, b]}, {"image": [c, d]}]) result = MultiModalKwargs.batch([{"image": [a, b]}, {"image": [c, d]}])
assert_multimodal_inputs_equal( assert_multimodal_inputs_equal(
result, result,
{"image": torch.stack([torch.stack([a, b]), {"image": torch.stack([torch.stack([a, b]),
@ -88,8 +88,8 @@ def test_multimodal_input_batch_mixed_stacking_depths():
b = torch.rand([1, 3, 3]) b = torch.rand([1, 3, 3])
c = torch.rand([1, 4, 3]) c = torch.rand([1, 4, 3])
result = MultiModalInputs.batch([{"image": [a, b]}, {"image": [c]}]) result = MultiModalKwargs.batch([{"image": [a, b]}, {"image": [c]}])
assert_multimodal_inputs_equal(result, {"image": [[a, b], c.unsqueeze(0)]}) assert_multimodal_inputs_equal(result, {"image": [[a, b], c.unsqueeze(0)]})
result = MultiModalInputs.batch([{"image": [a]}, {"image": [b, c]}]) result = MultiModalKwargs.batch([{"image": [a]}, {"image": [b, c]}])
assert_multimodal_inputs_equal(result, {"image": [a.unsqueeze(0), [b, c]]}) assert_multimodal_inputs_equal(result, {"image": [a.unsqueeze(0), [b, c]]})

View File

@ -30,7 +30,7 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
from vllm.model_executor.model_loader.weight_utils import default_weight_loader from vllm.model_executor.model_loader.weight_utils import default_weight_loader
from vllm.model_executor.models.glm4_vision_encoder import EVA2CLIPModel from vllm.model_executor.models.glm4_vision_encoder import EVA2CLIPModel
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalInputs from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalKwargs
from vllm.multimodal.base import MultiModalData from vllm.multimodal.base import MultiModalData
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
from vllm.sequence import (VLLM_TOKEN_ID_ARRAY_TYPE, IntermediateTensors, from vllm.sequence import (VLLM_TOKEN_ID_ARRAY_TYPE, IntermediateTensors,
@ -74,7 +74,7 @@ def mm_input_mapper_for_glmv(
raise raise
pixel_values = raw_batch_data['images'] pixel_values = raw_batch_data['images']
return MultiModalInputs({'pixel_values': pixel_values}) return MultiModalKwargs({'pixel_values': pixel_values})
def merge_glm_vision_embeddings( def merge_glm_vision_embeddings(

View File

@ -34,7 +34,7 @@ from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.model_executor.models.persimmon import PersimmonForCausalLM from vllm.model_executor.models.persimmon import PersimmonForCausalLM
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY from vllm.multimodal import MULTIMODAL_REGISTRY
from vllm.multimodal.base import MultiModalInputs from vllm.multimodal.base import MultiModalKwargs
from vllm.multimodal.image import cached_get_image_processor from vllm.multimodal.image import cached_get_image_processor
from vllm.multimodal.utils import (cached_get_tokenizer, from vllm.multimodal.utils import (cached_get_tokenizer,
consecutive_placeholder_ranges) consecutive_placeholder_ranges)
@ -218,7 +218,7 @@ def input_mapper_for_fuyu(ctx: InputContext, data: object):
]) ])
# image has been processed with prompt in input processor # image has been processed with prompt in input processor
return MultiModalInputs({"pixel_values": data}) return MultiModalKwargs({"pixel_values": data})
@MULTIMODAL_REGISTRY.register_image_input_mapper(input_mapper_for_fuyu) @MULTIMODAL_REGISTRY.register_image_input_mapper(input_mapper_for_fuyu)

View File

@ -16,7 +16,7 @@ from vllm.inputs import (INPUT_REGISTRY, DecoderOnlyInputs, InputContext,
token_inputs) token_inputs)
from vllm.model_executor.layers.quantization import QuantizationConfig from vllm.model_executor.layers.quantization import QuantizationConfig
from vllm.multimodal import MULTIMODAL_REGISTRY from vllm.multimodal import MULTIMODAL_REGISTRY
from vllm.multimodal.base import MultiModalInputs from vllm.multimodal.base import MultiModalKwargs
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
from vllm.utils import is_list_of from vllm.utils import is_list_of
@ -324,12 +324,12 @@ class H2OVLInputPipeline(InternVLInputPipeline):
data: object, data: object,
*, *,
max_dynamic_patch: Optional[int] = None, max_dynamic_patch: Optional[int] = None,
) -> MultiModalInputs: ) -> MultiModalKwargs:
# NOTE: Preprocessing for the image data is done in the # NOTE: Preprocessing for the image data is done in the
# 'input_processor' function during actual inference. # 'input_processor' function during actual inference.
if isinstance(data, dict): if isinstance(data, dict):
return MultiModalInputs(data) return MultiModalKwargs(data)
# The section below is only used with dummy data during # The section below is only used with dummy data during
# memory profiling. # memory profiling.
@ -347,7 +347,7 @@ class H2OVLInputPipeline(InternVLInputPipeline):
pixel_values = [image_pixel_values_mapper(img) for img in data] pixel_values = [image_pixel_values_mapper(img) for img in data]
else: else:
return MultiModalInputs({"image_embeds": data}) return MultiModalKwargs({"image_embeds": data})
model_config = ctx.model_config model_config = ctx.model_config
tokenizer = cached_get_tokenizer( tokenizer = cached_get_tokenizer(
model_config.tokenizer, model_config.tokenizer,
@ -359,7 +359,7 @@ class H2OVLInputPipeline(InternVLInputPipeline):
return_tensors="pt", return_tensors="pt",
)[0] )[0]
return MultiModalInputs({ return MultiModalKwargs({
"pixel_values": pixel_values, "pixel_values": pixel_values,
"image_token_id": image_token_id "image_token_id": image_token_id
}) })

View File

@ -36,7 +36,7 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
from vllm.model_executor.layers.sampler import Sampler, SamplerOutput from vllm.model_executor.layers.sampler import Sampler, SamplerOutput
from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalInputs from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalKwargs
from vllm.multimodal.image import cached_get_image_processor from vllm.multimodal.image import cached_get_image_processor
from vllm.sequence import IntermediateTensors, SequenceData from vllm.sequence import IntermediateTensors, SequenceData
from vllm.transformers_utils.processor import cached_get_processor from vllm.transformers_utils.processor import cached_get_processor
@ -127,7 +127,7 @@ def input_mapper_for_idefics3(
logger.error("Failed to process image (%s)", data) logger.error("Failed to process image (%s)", data)
raise raise
return MultiModalInputs(batch_data) return MultiModalKwargs(batch_data)
def _resize_output_size(height: int, def _resize_output_size(height: int,

View File

@ -26,7 +26,7 @@ from vllm.model_executor.models.intern_vit import (InternVisionModel,
InternVisionPatchModel) InternVisionPatchModel)
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY from vllm.multimodal import MULTIMODAL_REGISTRY
from vllm.multimodal.base import MultiModalInputs from vllm.multimodal.base import MultiModalKwargs
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
from vllm.sequence import IntermediateTensors from vllm.sequence import IntermediateTensors
from vllm.utils import is_list_of from vllm.utils import is_list_of
@ -346,7 +346,7 @@ class InternVLInputPipeline:
# we can't stack here because images may have different num_patches # we can't stack here because images may have different num_patches
data = [image_pixel_values_mapper(img) for img in data] data = [image_pixel_values_mapper(img) for img in data]
else: else:
return MultiModalInputs({"image_embeds": data}) return MultiModalKwargs({"image_embeds": data})
model_config = ctx.model_config model_config = ctx.model_config
tokenizer = cached_get_tokenizer( tokenizer = cached_get_tokenizer(
model_config.tokenizer, model_config.tokenizer,
@ -355,7 +355,7 @@ class InternVLInputPipeline:
add_special_tokens=False, add_special_tokens=False,
return_tensors="pt")[0] return_tensors="pt")[0]
return MultiModalInputs({ return MultiModalKwargs({
"pixel_values": data, "pixel_values": data,
"image_token_id": image_token_id "image_token_id": image_token_id
}) })

View File

@ -52,7 +52,7 @@ from vllm.model_executor.models.qwen2 import Qwen2Model
from vllm.model_executor.models.utils import LLMWrapper from vllm.model_executor.models.utils import LLMWrapper
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY from vllm.multimodal import MULTIMODAL_REGISTRY
from vllm.multimodal.base import MultiModalInputs from vllm.multimodal.base import MultiModalKwargs
from vllm.multimodal.image import cached_get_image_processor from vllm.multimodal.image import cached_get_image_processor
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
from vllm.sequence import IntermediateTensors, SequenceData from vllm.sequence import IntermediateTensors, SequenceData
@ -374,7 +374,7 @@ def input_mapper_for_minicpmv(ctx: InputContext, data: object):
batch_data["slice_start_id"] = data[0]["slice_start_id"] batch_data["slice_start_id"] = data[0]["slice_start_id"]
batch_data["slice_end_id"] = data[0]["slice_end_id"] batch_data["slice_end_id"] = data[0]["slice_end_id"]
return MultiModalInputs(batch_data) return MultiModalKwargs(batch_data)
class MiniCPMVBaseModel(nn.Module, SupportsMultiModal, SupportsPP): class MiniCPMVBaseModel(nn.Module, SupportsMultiModal, SupportsPP):

View File

@ -1162,7 +1162,7 @@ class MllamaForConditionalGeneration(nn.Module, SupportsMultiModal):
def _parse_and_validate_image_input(self, **kwargs: object): def _parse_and_validate_image_input(self, **kwargs: object):
# tensor with the same shape will be batched together by # tensor with the same shape will be batched together by
# MultiModalInputs.batch, so pixel_values here can be: # MultiModalKwargs.batch, so pixel_values here can be:
# - List[List[torch.Tensor]]: # - List[List[torch.Tensor]]:
# with shape (num_tiles, 3, image_res, image_res) # with shape (num_tiles, 3, image_res, image_res)
# - List[torch.Tensor]: # - List[torch.Tensor]:

View File

@ -37,7 +37,7 @@ from vllm.model_executor.layers.sampler import SamplerOutput, get_sampler
from vllm.model_executor.layers.vocab_parallel_embedding import ( from vllm.model_executor.layers.vocab_parallel_embedding import (
ParallelLMHead, VocabParallelEmbedding) ParallelLMHead, VocabParallelEmbedding)
from vllm.model_executor.model_loader.weight_utils import default_weight_loader from vllm.model_executor.model_loader.weight_utils import default_weight_loader
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalInputs from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalKwargs
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
from vllm.sequence import (VLLM_TOKEN_ID_ARRAY_TYPE, IntermediateTensors, from vllm.sequence import (VLLM_TOKEN_ID_ARRAY_TYPE, IntermediateTensors,
SequenceData) SequenceData)
@ -866,7 +866,7 @@ def image_input_mapper_for_molmo(
ctx: InputContext, ctx: InputContext,
data: object, data: object,
): ):
return MultiModalInputs(data) return MultiModalKwargs(data)
def dummy_data_for_molmo(ctx: InputContext, seq_len: int, def dummy_data_for_molmo(ctx: InputContext, seq_len: int,

View File

@ -30,7 +30,7 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
from vllm.model_executor.models.utils import merge_multimodal_embeddings from vllm.model_executor.models.utils import merge_multimodal_embeddings
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY from vllm.multimodal import MULTIMODAL_REGISTRY
from vllm.multimodal.base import MultiModalInputs from vllm.multimodal.base import MultiModalKwargs
from vllm.multimodal.utils import (cached_get_tokenizer, from vllm.multimodal.utils import (cached_get_tokenizer,
consecutive_placeholder_ranges) consecutive_placeholder_ranges)
from vllm.sequence import IntermediateTensors, SequenceData from vllm.sequence import IntermediateTensors, SequenceData
@ -94,8 +94,8 @@ def dummy_data_for_pixtral(ctx: InputContext, seq_len: int,
def input_mapper_for_pixtral(ctx: InputContext, def input_mapper_for_pixtral(ctx: InputContext,
data: object) -> MultiModalInputs: data: object) -> MultiModalKwargs:
"""Maps the input data to its MultiModalInputs (if any). """Maps the input data to its MultiModalKwargs (if any).
Args: Args:
ctx: Context of the loaded model. ctx: Context of the loaded model.
@ -103,7 +103,7 @@ def input_mapper_for_pixtral(ctx: InputContext,
to pixel_values in .forward() for a visual QWenLMHeadModel model. to pixel_values in .forward() for a visual QWenLMHeadModel model.
Returns: Returns:
MultiModalInputs containing the stacked normalized images tensor or MultiModalKwargs containing the stacked normalized images tensor or
image embeddings. image embeddings.
""" """
# Early exit if we have provided an image to a language only Qwen model # Early exit if we have provided an image to a language only Qwen model
@ -121,7 +121,7 @@ def input_mapper_for_pixtral(ctx: InputContext,
dtype=torch.float16) dtype=torch.float16)
images.append(image) images.append(image)
return MultiModalInputs({"images": images}) return MultiModalKwargs({"images": images})
def input_processor_for_pixtral(ctx: InputContext, inputs: DecoderOnlyInputs): def input_processor_for_pixtral(ctx: InputContext, inputs: DecoderOnlyInputs):

View File

@ -43,7 +43,7 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
from vllm.model_executor.models.module_mapping import MultiModelKeys from vllm.model_executor.models.module_mapping import MultiModelKeys
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY from vllm.multimodal import MULTIMODAL_REGISTRY
from vllm.multimodal.base import MultiModalInputs from vllm.multimodal.base import MultiModalKwargs
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
from vllm.sequence import IntermediateTensors, SequenceData from vllm.sequence import IntermediateTensors, SequenceData
from vllm.utils import is_list_of from vllm.utils import is_list_of
@ -722,8 +722,8 @@ def input_processor_for_qwen(ctx: InputContext,
multi_modal_data=multi_modal_data) multi_modal_data=multi_modal_data)
def input_mapper_for_qwen(ctx: InputContext, data: object) -> MultiModalInputs: def input_mapper_for_qwen(ctx: InputContext, data: object) -> MultiModalKwargs:
"""Maps the input data to its MultiModalInputs (if any). """Maps the input data to its MultiModalKwargs (if any).
Args: Args:
ctx: Context of the loaded model. ctx: Context of the loaded model.
@ -731,7 +731,7 @@ def input_mapper_for_qwen(ctx: InputContext, data: object) -> MultiModalInputs:
to pixel_values in .forward() for a visual QWenLMHeadModel model. to pixel_values in .forward() for a visual QWenLMHeadModel model.
Returns: Returns:
MultiModalInputs containing the stacked normalized images tensor or MultiModalKwargs containing the stacked normalized images tensor or
image embeddings. image embeddings.
""" """
# Early exit if we have provided an image to a language only Qwen model # Early exit if we have provided an image to a language only Qwen model
@ -740,7 +740,7 @@ def input_mapper_for_qwen(ctx: InputContext, data: object) -> MultiModalInputs:
logger.warning( logger.warning(
"Images were provided but this model has no visual config; " "Images were provided but this model has no visual config; "
"multimodal inputs will not be forwarded to the model.") "multimodal inputs will not be forwarded to the model.")
return MultiModalInputs() return MultiModalKwargs()
model_config = ctx.model_config model_config = ctx.model_config
tokenizer = cached_get_tokenizer( tokenizer = cached_get_tokenizer(
@ -784,7 +784,7 @@ def input_mapper_for_qwen(ctx: InputContext, data: object) -> MultiModalInputs:
data = [data] data = [data]
transformed_images = [transform(datum) for datum in data] transformed_images = [transform(datum) for datum in data]
pixel_values = torch.stack(transformed_images, dim=0) pixel_values = torch.stack(transformed_images, dim=0)
return MultiModalInputs({"pixel_values": pixel_values}) return MultiModalKwargs({"pixel_values": pixel_values})
def build_normalization_transform(image_size: int) -> transforms.Compose: def build_normalization_transform(image_size: int) -> transforms.Compose:

View File

@ -42,7 +42,7 @@ from vllm.model_executor.model_loader.weight_utils import (
default_weight_loader, maybe_remap_kv_scale_name) default_weight_loader, maybe_remap_kv_scale_name)
from vllm.model_executor.models.qwen2 import Qwen2Model from vllm.model_executor.models.qwen2 import Qwen2Model
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalInputs from vllm.multimodal import MULTIMODAL_REGISTRY, MultiModalKwargs
from vllm.multimodal.utils import consecutive_placeholder_ranges from vllm.multimodal.utils import consecutive_placeholder_ranges
from vllm.sequence import IntermediateTensors, SequenceData from vllm.sequence import IntermediateTensors, SequenceData
@ -221,13 +221,13 @@ def input_processor_for_qwen2_audio(
def input_mapper_for_qwen2_audio( def input_mapper_for_qwen2_audio(
ctx: InputContext, ctx: InputContext,
multi_modal_data: Union[np.ndarray, List[np.ndarray]], multi_modal_data: Union[np.ndarray, List[np.ndarray]],
) -> MultiModalInputs: ) -> MultiModalKwargs:
"""Input mapper for Qwen2-Audio.""" """Input mapper for Qwen2-Audio."""
if not isinstance(multi_modal_data, list): if not isinstance(multi_modal_data, list):
multi_modal_data = [multi_modal_data] multi_modal_data = [multi_modal_data]
if len(multi_modal_data) == 0: if len(multi_modal_data) == 0:
return MultiModalInputs() return MultiModalKwargs()
processor = cached_get_processor(ctx.model_config.model) processor = cached_get_processor(ctx.model_config.model)
audio_feature_extractor = processor.feature_extractor audio_feature_extractor = processor.feature_extractor
@ -254,7 +254,7 @@ def input_mapper_for_qwen2_audio(
logger.error("Failed to process audio (%s)", multi_modal_data) logger.error("Failed to process audio (%s)", multi_modal_data)
raise raise
return MultiModalInputs(batch_data) return MultiModalKwargs(batch_data)
@INPUT_REGISTRY.register_dummy_data(dummy_data_for_qwen2_audio) @INPUT_REGISTRY.register_dummy_data(dummy_data_for_qwen2_audio)

View File

@ -57,7 +57,7 @@ from vllm.model_executor.layers.vocab_parallel_embedding import ParallelLMHead
from vllm.model_executor.model_loader.weight_utils import default_weight_loader from vllm.model_executor.model_loader.weight_utils import default_weight_loader
from vllm.model_executor.models.qwen2 import Qwen2Model from vllm.model_executor.models.qwen2 import Qwen2Model
from vllm.multimodal import (MULTIMODAL_REGISTRY, MultiModalDataDict, from vllm.multimodal import (MULTIMODAL_REGISTRY, MultiModalDataDict,
MultiModalInputs) MultiModalKwargs)
from vllm.multimodal.base import MultiModalData from vllm.multimodal.base import MultiModalData
from vllm.multimodal.image import cached_get_image_processor from vllm.multimodal.image import cached_get_image_processor
from vllm.multimodal.utils import cached_get_tokenizer from vllm.multimodal.utils import cached_get_tokenizer
@ -576,10 +576,10 @@ def mm_input_mapper_for_qwen2_vl(
*, *,
min_pixels: Optional[int] = None, min_pixels: Optional[int] = None,
max_pixels: Optional[int] = None, max_pixels: Optional[int] = None,
) -> MultiModalInputs: ) -> MultiModalKwargs:
"""Input mapper for Qwen2-VL.""" """Input mapper for Qwen2-VL."""
if data_type_key == "image" and isinstance(data, dict): if data_type_key == "image" and isinstance(data, dict):
return MultiModalInputs({ return MultiModalKwargs({
"image_embeds": data.get("image_embeds"), "image_embeds": data.get("image_embeds"),
"image_grid_thw": data.get("image_grid_thw"), "image_grid_thw": data.get("image_grid_thw"),
}) })
@ -613,7 +613,7 @@ def mm_input_mapper_for_qwen2_vl(
logger.error("Failed to process image (%s)", data) logger.error("Failed to process image (%s)", data)
raise raise
return MultiModalInputs(batch_data) return MultiModalKwargs(batch_data)
image_input_mapper_for_qwen2_vl = partial(mm_input_mapper_for_qwen2_vl, image_input_mapper_for_qwen2_vl = partial(mm_input_mapper_for_qwen2_vl,

View File

@ -24,7 +24,7 @@ from vllm.model_executor.layers.quantization import QuantizationConfig
from vllm.model_executor.layers.sampler import SamplerOutput, get_sampler from vllm.model_executor.layers.sampler import SamplerOutput, get_sampler
from vllm.model_executor.model_loader.loader import DefaultModelLoader from vllm.model_executor.model_loader.loader import DefaultModelLoader
from vllm.model_executor.sampling_metadata import SamplingMetadata from vllm.model_executor.sampling_metadata import SamplingMetadata
from vllm.multimodal import (MULTIMODAL_REGISTRY, MultiModalInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, MultiModalKwargs,
NestedTensors) NestedTensors)
from vllm.multimodal.utils import (cached_get_tokenizer, from vllm.multimodal.utils import (cached_get_tokenizer,
consecutive_placeholder_ranges, consecutive_placeholder_ranges,
@ -116,11 +116,11 @@ def input_mapper_for_ultravox(ctx: InputContext, data: object):
data = [data] data = [data]
if len(data) == 0: if len(data) == 0:
return MultiModalInputs() return MultiModalKwargs()
# If the audio inputs are embeddings, no need for preprocessing # If the audio inputs are embeddings, no need for preprocessing
if is_list_of(data, torch.Tensor, check="all"): if is_list_of(data, torch.Tensor, check="all"):
return MultiModalInputs({"audio_embeds": data}) return MultiModalKwargs({"audio_embeds": data})
audio_features = [] audio_features = []
for audio_input in data: for audio_input in data:
@ -154,7 +154,7 @@ def input_mapper_for_ultravox(ctx: InputContext, data: object):
# Remove the batch dimension because we're wrapping it in a list. # Remove the batch dimension because we're wrapping it in a list.
audio_features.append(single_audio_features.squeeze(0)) audio_features.append(single_audio_features.squeeze(0))
return MultiModalInputs({"audio_features": audio_features}) return MultiModalKwargs({"audio_features": audio_features})
def input_processor_for_ultravox(ctx: InputContext, inputs: DecoderOnlyInputs): def input_processor_for_ultravox(ctx: InputContext, inputs: DecoderOnlyInputs):

View File

@ -1,5 +1,5 @@
from .base import (BatchedTensorInputs, MultiModalDataBuiltins, from .base import (BatchedTensorInputs, MultiModalDataBuiltins,
MultiModalDataDict, MultiModalInputs, MultiModalDataDict, MultiModalKwargs,
MultiModalPlaceholderDict, MultiModalPlaceholderMap, MultiModalPlaceholderDict, MultiModalPlaceholderMap,
MultiModalPlugin, NestedTensors) MultiModalPlugin, NestedTensors)
from .registry import MultiModalRegistry from .registry import MultiModalRegistry
@ -17,7 +17,7 @@ __all__ = [
"BatchedTensorInputs", "BatchedTensorInputs",
"MultiModalDataBuiltins", "MultiModalDataBuiltins",
"MultiModalDataDict", "MultiModalDataDict",
"MultiModalInputs", "MultiModalKwargs",
"MultiModalPlaceholderDict", "MultiModalPlaceholderDict",
"MultiModalPlaceholderMap", "MultiModalPlaceholderMap",
"MultiModalPlugin", "MultiModalPlugin",
@ -25,3 +25,18 @@ __all__ = [
"MULTIMODAL_REGISTRY", "MULTIMODAL_REGISTRY",
"MultiModalRegistry", "MultiModalRegistry",
] ]
def __getattr__(name: str):
import warnings
if name == "MultiModalInputs":
msg = ("MultiModalInputs has been renamed to MultiModalKwargs. "
"The original name will take another meaning in an upcoming "
"version.")
warnings.warn(DeprecationWarning(msg), stacklevel=2)
return MultiModalKwargs
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

View File

@ -1,5 +1,5 @@
from vllm.inputs.registry import InputContext from vllm.inputs.registry import InputContext
from vllm.multimodal.base import MultiModalInputs, MultiModalPlugin from vllm.multimodal.base import MultiModalKwargs, MultiModalPlugin
class AudioPlugin(MultiModalPlugin): class AudioPlugin(MultiModalPlugin):
@ -9,7 +9,7 @@ class AudioPlugin(MultiModalPlugin):
return "audio" return "audio"
def _default_input_mapper(self, ctx: InputContext, data: object, def _default_input_mapper(self, ctx: InputContext, data: object,
**mm_processor_kwargs) -> MultiModalInputs: **mm_processor_kwargs) -> MultiModalKwargs:
raise NotImplementedError("There is no default audio input mapper") raise NotImplementedError("There is no default audio input mapper")
def _default_max_multimodal_tokens(self, ctx: InputContext) -> int: def _default_max_multimodal_tokens(self, ctx: InputContext) -> int:

View File

@ -30,15 +30,15 @@ Uses a list instead of a tensor if the dimensions of each element do not match.
BatchedTensorInputs: TypeAlias = Dict[str, NestedTensors] BatchedTensorInputs: TypeAlias = Dict[str, NestedTensors]
""" """
A dictionary containing nested tensors which have been batched via A dictionary containing nested tensors which have been batched via
:meth:`MultiModalInputs.batch`. :meth:`MultiModalKwargs.batch`.
""" """
class _MultiModalInputsBase(UserDict[str, NestedTensors]): class _MultiModalKwargsBase(UserDict[str, NestedTensors]):
pass pass
class MultiModalInputs(_MultiModalInputsBase): class MultiModalKwargs(_MultiModalKwargsBase):
""" """
A dictionary that represents the keyword arguments to A dictionary that represents the keyword arguments to
:meth:`~torch.nn.Module.forward`. :meth:`~torch.nn.Module.forward`.
@ -58,7 +58,7 @@ class MultiModalInputs(_MultiModalInputsBase):
if isinstance(nested_tensors, (int, float)): if isinstance(nested_tensors, (int, float)):
return torch.tensor(nested_tensors) return torch.tensor(nested_tensors)
stacked = [MultiModalInputs._try_stack(t) for t in nested_tensors] stacked = [MultiModalKwargs._try_stack(t) for t in nested_tensors]
if not is_list_of(stacked, torch.Tensor, check="all"): if not is_list_of(stacked, torch.Tensor, check="all"):
# Only tensors (not lists) can be stacked. # Only tensors (not lists) can be stacked.
return stacked return stacked
@ -71,7 +71,7 @@ class MultiModalInputs(_MultiModalInputsBase):
return torch.stack(tensors_) return torch.stack(tensors_)
@staticmethod @staticmethod
def batch(inputs_list: List["MultiModalInputs"]) -> BatchedTensorInputs: def batch(inputs_list: List["MultiModalKwargs"]) -> BatchedTensorInputs:
""" """
Batch multiple inputs together into a dictionary. Batch multiple inputs together into a dictionary.
@ -95,7 +95,7 @@ class MultiModalInputs(_MultiModalInputsBase):
item_lists[k].append(v) item_lists[k].append(v)
return { return {
k: MultiModalInputs._try_stack(item_list) k: MultiModalKwargs._try_stack(item_list)
for k, item_list in item_lists.items() for k, item_list in item_lists.items()
} }
@ -177,7 +177,7 @@ A dictionary containing placeholder ranges.
""" """
MultiModalInputMapper = Callable[[InputContext, MultiModalData[object]], MultiModalInputMapper = Callable[[InputContext, MultiModalData[object]],
MultiModalInputs] MultiModalKwargs]
""" """
Return a dictionary to be passed as keyword arguments to Return a dictionary to be passed as keyword arguments to
:meth:`~torch.nn.Module.forward`. This is similar in concept to tokenizers :meth:`~torch.nn.Module.forward`. This is similar in concept to tokenizers
@ -226,7 +226,7 @@ class MultiModalPlugin(ABC):
ctx: InputContext, ctx: InputContext,
data: MultiModalData[object], data: MultiModalData[object],
**mm_processor_kwargs, **mm_processor_kwargs,
) -> MultiModalInputs: ) -> MultiModalKwargs:
""" """
Return a dictionary to be passed as keyword arguments to Return a dictionary to be passed as keyword arguments to
:meth:`~torch.nn.Module.forward`. This is similar in concept to :meth:`~torch.nn.Module.forward`. This is similar in concept to
@ -275,7 +275,7 @@ class MultiModalPlugin(ABC):
model_config: "ModelConfig", model_config: "ModelConfig",
data: MultiModalData[object], data: MultiModalData[object],
mm_processor_kwargs: Dict[str, Any], mm_processor_kwargs: Dict[str, Any],
) -> MultiModalInputs: ) -> MultiModalKwargs:
""" """
Transform the data into a dictionary of model inputs using the Transform the data into a dictionary of model inputs using the
input mapper registered for that model. input mapper registered for that model.
@ -585,3 +585,18 @@ class MultiModalPlaceholderMap:
return MultiModalPlaceholderMap.IndexMap(src=src_indices, return MultiModalPlaceholderMap.IndexMap(src=src_indices,
dest=dest_indices) dest=dest_indices)
def __getattr__(name: str):
import warnings
if name == "MultiModalInputs":
msg = ("MultiModalInputs has been renamed to MultiModalKwargs. "
"The original name will take another meaning in an upcoming "
"version.")
warnings.warn(DeprecationWarning(msg), stacklevel=2)
return MultiModalKwargs
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

View File

@ -10,7 +10,7 @@ from vllm.logger import init_logger
from vllm.transformers_utils.processor import get_image_processor from vllm.transformers_utils.processor import get_image_processor
from vllm.utils import is_list_of from vllm.utils import is_list_of
from .base import MultiModalData, MultiModalInputs, MultiModalPlugin from .base import MultiModalData, MultiModalKwargs, MultiModalPlugin
if TYPE_CHECKING: if TYPE_CHECKING:
from vllm.config import ModelConfig from vllm.config import ModelConfig
@ -43,12 +43,12 @@ class ImagePlugin(MultiModalPlugin):
ctx: InputContext, ctx: InputContext,
data: MultiModalData[object], data: MultiModalData[object],
**mm_processor_kwargs, **mm_processor_kwargs,
) -> MultiModalInputs: ) -> MultiModalKwargs:
model_config = ctx.model_config model_config = ctx.model_config
# Processed by input processor # Processed by input processor
if isinstance(data, BatchFeature): if isinstance(data, BatchFeature):
return MultiModalInputs(data.data) return MultiModalKwargs(data.data)
# PIL image # PIL image
if isinstance(data, Image.Image) or is_list_of(data, Image.Image): if isinstance(data, Image.Image) or is_list_of(data, Image.Image):
@ -78,11 +78,11 @@ class ImagePlugin(MultiModalPlugin):
type(image_processor).__name__) type(image_processor).__name__)
raise raise
return MultiModalInputs(batch_data) return MultiModalKwargs(batch_data)
# Image embedding # Image embedding
elif isinstance(data, torch.Tensor) or is_list_of(data, torch.Tensor): elif isinstance(data, torch.Tensor) or is_list_of(data, torch.Tensor):
return MultiModalInputs({"image_embeds": data}) return MultiModalKwargs({"image_embeds": data})
raise TypeError(f"Invalid image type: {type(data)}") raise TypeError(f"Invalid image type: {type(data)}")

View File

@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, Any, Dict, Mapping, Optional, Sequence
from vllm.logger import init_logger from vllm.logger import init_logger
from .audio import AudioPlugin from .audio import AudioPlugin
from .base import (MultiModalDataDict, MultiModalInputMapper, MultiModalInputs, from .base import (MultiModalDataDict, MultiModalInputMapper, MultiModalKwargs,
MultiModalPlugin, MultiModalTokensCalc, NestedTensors) MultiModalPlugin, MultiModalTokensCalc, NestedTensors)
from .image import ImagePlugin from .image import ImagePlugin
from .video import VideoPlugin from .video import VideoPlugin
@ -103,7 +103,7 @@ class MultiModalRegistry:
model_config: "ModelConfig", model_config: "ModelConfig",
data: MultiModalDataDict, data: MultiModalDataDict,
mm_processor_kwargs: Optional[Dict[str, Any]] = None, mm_processor_kwargs: Optional[Dict[str, Any]] = None,
) -> MultiModalInputs: ) -> MultiModalKwargs:
""" """
Apply an input mapper to the data passed to the model. Apply an input mapper to the data passed to the model.
@ -139,7 +139,7 @@ class MultiModalRegistry:
merged_dict[input_key] = input_tensor merged_dict[input_key] = input_tensor
return MultiModalInputs(merged_dict) return MultiModalKwargs(merged_dict)
def create_input_mapper(self, model_config: "ModelConfig"): def create_input_mapper(self, model_config: "ModelConfig"):
""" """

View File

@ -9,7 +9,7 @@ from vllm.transformers_utils.processor import get_video_processor
from vllm.transformers_utils.tokenizer import get_tokenizer from vllm.transformers_utils.tokenizer import get_tokenizer
from vllm.utils import is_list_of from vllm.utils import is_list_of
from .base import MultiModalData, MultiModalInputs from .base import MultiModalData, MultiModalKwargs
from .image import ImagePlugin from .image import ImagePlugin
if TYPE_CHECKING: if TYPE_CHECKING:
@ -55,7 +55,7 @@ class VideoPlugin(ImagePlugin):
ctx: InputContext, ctx: InputContext,
data: MultiModalData[object], data: MultiModalData[object],
**mm_processor_kwargs, **mm_processor_kwargs,
) -> MultiModalInputs: ) -> MultiModalKwargs:
model_config = ctx.model_config model_config = ctx.model_config
if isinstance(data, list) and len(data) == 1: if isinstance(data, list) and len(data) == 1:
@ -79,7 +79,7 @@ class VideoPlugin(ImagePlugin):
logger.error("Failed to process video (%s)", data) logger.error("Failed to process video (%s)", data)
raise raise
return MultiModalInputs(batch_data) return MultiModalKwargs(batch_data)
raise TypeError(f"Invalid video type: {type(data)}") raise TypeError(f"Invalid video type: {type(data)}")

View File

@ -18,7 +18,7 @@ except (ModuleNotFoundError, ImportError) as err:
"CUDA and ROCm flash attention backend.") from err "CUDA and ROCm flash attention backend.") from err
from vllm.logger import init_logger from vllm.logger import init_logger
from vllm.multimodal import MultiModalInputs from vllm.multimodal import MultiModalKwargs
from vllm.sequence import ExecuteModelRequest, IntermediateTensors from vllm.sequence import ExecuteModelRequest, IntermediateTensors
from vllm.worker.model_runner import (ModelInputForGPUWithSamplingMetadata, from vllm.worker.model_runner import (ModelInputForGPUWithSamplingMetadata,
ModelRunner) ModelRunner)
@ -280,7 +280,7 @@ class TP1DraftModelRunner(ModelRunner):
kv_caches=kv_caches, kv_caches=kv_caches,
attn_metadata=model_input.attn_metadata, attn_metadata=model_input.attn_metadata,
intermediate_tensors=intermediate_tensors, intermediate_tensors=intermediate_tensors,
**MultiModalInputs.as_kwargs(multi_modal_kwargs, **MultiModalKwargs.as_kwargs(multi_modal_kwargs,
device=self.device), device=self.device),
**kwargs, **kwargs,
) )

View File

@ -5,7 +5,7 @@ import torch
from vllm.attention import AttentionMetadata from vllm.attention import AttentionMetadata
from vllm.model_executor.layers.sampler import SamplerOutput from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.multimodal import MultiModalInputs from vllm.multimodal import MultiModalKwargs
from vllm.sequence import IntermediateTensors, SequenceGroupMetadata from vllm.sequence import IntermediateTensors, SequenceGroupMetadata
from vllm.utils import make_tensor_with_pad from vllm.utils import make_tensor_with_pad
from vllm.worker.cpu_model_runner import (CPUModelRunner, from vllm.worker.cpu_model_runner import (CPUModelRunner,
@ -287,7 +287,7 @@ class CPUEncoderDecoderModelRunner(CPUModelRunner):
kv_caches, kv_caches,
"attn_metadata": "attn_metadata":
model_input.attn_metadata, model_input.attn_metadata,
**MultiModalInputs.as_kwargs(model_input.multi_modal_kwargs or {}, **MultiModalKwargs.as_kwargs(model_input.multi_modal_kwargs or {},
device=self.device), device=self.device),
"intermediate_tensors": "intermediate_tensors":
intermediate_tensors, intermediate_tensors,

View File

@ -15,7 +15,7 @@ from vllm.model_executor.layers.rotary_embedding import MRotaryEmbedding
from vllm.model_executor.layers.sampler import SamplerOutput from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.model_executor.model_loader import get_model from vllm.model_executor.model_loader import get_model
from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs,
MultiModalInputs, MultiModalPlaceholderMap) MultiModalKwargs, MultiModalPlaceholderMap)
from vllm.sequence import (IntermediateTensors, SequenceData, from vllm.sequence import (IntermediateTensors, SequenceData,
SequenceGroupMetadata) SequenceGroupMetadata)
from vllm.utils import make_tensor_with_pad from vllm.utils import make_tensor_with_pad
@ -200,7 +200,7 @@ class ModelInputForCPUBuilder(ModelRunnerInputBuilderBase[ModelInputForCPU]):
slot_mapping: List[int] = [] slot_mapping: List[int] = []
seq_lens: List[int] = [] seq_lens: List[int] = []
multi_modal_inputs_list: List[MultiModalInputs] = [] multi_model_kwargs_list: List[MultiModalKwargs] = []
multi_modal_placeholder_maps: Dict[ multi_modal_placeholder_maps: Dict[
str, str,
MultiModalPlaceholderMap] = defaultdict(MultiModalPlaceholderMap) MultiModalPlaceholderMap] = defaultdict(MultiModalPlaceholderMap)
@ -225,7 +225,7 @@ class ModelInputForCPUBuilder(ModelRunnerInputBuilderBase[ModelInputForCPU]):
._compute_multi_modal_input( ._compute_multi_modal_input(
seq_group_metadata, seq_data, computed_len, seq_group_metadata, seq_data, computed_len,
seq_group_metadata.mm_processor_kwargs) seq_group_metadata.mm_processor_kwargs)
multi_modal_inputs_list.append(mm_kwargs) multi_model_kwargs_list.append(mm_kwargs)
for modality, placeholder_map in placeholder_maps.items(): for modality, placeholder_map in placeholder_maps.items():
multi_modal_placeholder_maps[modality].extend( multi_modal_placeholder_maps[modality].extend(
placeholder_map) placeholder_map)
@ -297,7 +297,7 @@ class ModelInputForCPUBuilder(ModelRunnerInputBuilderBase[ModelInputForCPU]):
multi_modal_placeholder_index_maps=placeholder_index_maps, multi_modal_placeholder_index_maps=placeholder_index_maps,
) )
multi_modal_kwargs = MultiModalInputs.batch(multi_modal_inputs_list) multi_modal_kwargs = MultiModalKwargs.batch(multi_model_kwargs_list)
return (input_tokens, input_positions, attn_metadata, seq_lens, return (input_tokens, input_positions, attn_metadata, seq_lens,
multi_modal_kwargs) multi_modal_kwargs)
@ -520,7 +520,7 @@ class CPUModelRunner(ModelRunnerBase[ModelInputForCPU]):
kv_caches, kv_caches,
"attn_metadata": "attn_metadata":
model_input.attn_metadata, model_input.attn_metadata,
**MultiModalInputs.as_kwargs(model_input.multi_modal_kwargs or {}, **MultiModalKwargs.as_kwargs(model_input.multi_modal_kwargs or {},
device=self.device), device=self.device),
"intermediate_tensors": "intermediate_tensors":
intermediate_tensors, intermediate_tensors,

View File

@ -8,7 +8,7 @@ from vllm.distributed import get_pp_group
from vllm.forward_context import set_forward_context from vllm.forward_context import set_forward_context
from vllm.logger import init_logger from vllm.logger import init_logger
from vllm.model_executor.pooling_metadata import PoolingMetadata from vllm.model_executor.pooling_metadata import PoolingMetadata
from vllm.multimodal import MultiModalInputs from vllm.multimodal import MultiModalKwargs
from vllm.pooling_params import PoolingParams from vllm.pooling_params import PoolingParams
from vllm.sequence import (IntermediateTensors, PoolerOutput, SequenceData, from vllm.sequence import (IntermediateTensors, PoolerOutput, SequenceData,
SequenceGroupMetadata) SequenceGroupMetadata)
@ -104,7 +104,7 @@ class EmbeddingModelRunner(
kv_caches=kv_caches, kv_caches=kv_caches,
attn_metadata=model_input.attn_metadata, attn_metadata=model_input.attn_metadata,
intermediate_tensors=intermediate_tensors, intermediate_tensors=intermediate_tensors,
**MultiModalInputs.as_kwargs(multi_modal_kwargs, **MultiModalKwargs.as_kwargs(multi_modal_kwargs,
device=self.device)) device=self.device))
if (self.observability_config is not None if (self.observability_config is not None

View File

@ -18,7 +18,7 @@ from vllm.logger import init_logger
from vllm.model_executor import SamplingMetadata from vllm.model_executor import SamplingMetadata
from vllm.model_executor.layers.sampler import SamplerOutput from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.model_executor.model_loader.utils import get_architecture_class_name from vllm.model_executor.model_loader.utils import get_architecture_class_name
from vllm.multimodal import (MULTIMODAL_REGISTRY, MultiModalInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, MultiModalKwargs,
MultiModalRegistry) MultiModalRegistry)
from vllm.sampling_params import SamplingParams from vllm.sampling_params import SamplingParams
from vllm.sequence import (IntermediateTensors, PoolerOutput, from vllm.sequence import (IntermediateTensors, PoolerOutput,
@ -206,7 +206,7 @@ class EncoderDecoderModelRunner(GPUModelRunnerBase[EncoderDecoderModelInput]):
kv_caches=kv_caches, kv_caches=kv_caches,
attn_metadata=model_input.attn_metadata, attn_metadata=model_input.attn_metadata,
intermediate_tensors=intermediate_tensors, intermediate_tensors=intermediate_tensors,
**MultiModalInputs.as_kwargs(multi_modal_kwargs, **MultiModalKwargs.as_kwargs(multi_modal_kwargs,
device=self.device), device=self.device),
**seqlen_agnostic_kwargs) **seqlen_agnostic_kwargs)

View File

@ -36,7 +36,7 @@ from vllm.model_executor import SamplingMetadata
from vllm.model_executor.layers.sampler import SamplerOutput from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.model_executor.model_loader import get_model from vllm.model_executor.model_loader import get_model
from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs,
MultiModalInputs) MultiModalKwargs)
from vllm.sampling_params import SamplingParams from vllm.sampling_params import SamplingParams
from vllm.sequence import (IntermediateTensors, SequenceData, from vllm.sequence import (IntermediateTensors, SequenceData,
SequenceGroupMetadata) SequenceGroupMetadata)
@ -716,7 +716,7 @@ class HPUModelRunnerBase(ModelRunnerBase[TModelInputForHPU]):
context_lens: List[int] = [] context_lens: List[int] = []
query_lens: List[int] = [] query_lens: List[int] = []
prefix_block_tables: List[List[int]] = [] prefix_block_tables: List[List[int]] = []
multi_modal_inputs_list: List[MultiModalInputs] = [] multi_model_kwargs_list: List[MultiModalKwargs] = []
if len(seq_group_metadata_list) == 0: if len(seq_group_metadata_list) == 0:
return PreparePromptMetadata.empty() return PreparePromptMetadata.empty()
@ -777,7 +777,7 @@ class HPUModelRunnerBase(ModelRunnerBase[TModelInputForHPU]):
mm_data = seq_group_metadata.multi_modal_data mm_data = seq_group_metadata.multi_modal_data
if mm_data: if mm_data:
mm_kwargs = self.multi_modal_input_mapper(mm_data) mm_kwargs = self.multi_modal_input_mapper(mm_data)
multi_modal_inputs_list.append(mm_kwargs) multi_model_kwargs_list.append(mm_kwargs)
if seq_group_metadata.block_tables is None: if seq_group_metadata.block_tables is None:
# During memory profiling, the block tables are not initialized # During memory profiling, the block tables are not initialized
@ -876,7 +876,7 @@ class HPUModelRunnerBase(ModelRunnerBase[TModelInputForHPU]):
multi_modal_placeholder_index_maps= multi_modal_placeholder_index_maps=
None # FIXME(kzawora): mutli-modality will not work here None # FIXME(kzawora): mutli-modality will not work here
) )
multi_modal_kwargs = MultiModalInputs.batch(multi_modal_inputs_list) multi_modal_kwargs = MultiModalKwargs.batch(multi_model_kwargs_list)
return PreparePromptMetadata(input_tokens=input_tokens, return PreparePromptMetadata(input_tokens=input_tokens,
input_positions=input_positions, input_positions=input_positions,

View File

@ -38,7 +38,7 @@ from vllm.model_executor.model_loader.tensorizer import TensorizerConfig
from vllm.model_executor.models import supports_lora, supports_multimodal from vllm.model_executor.models import supports_lora, supports_multimodal
from vllm.model_executor.models.utils import set_cpu_offload_max_bytes from vllm.model_executor.models.utils import set_cpu_offload_max_bytes
from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs,
MultiModalInputs, MultiModalPlaceholderMap, MultiModalKwargs, MultiModalPlaceholderMap,
MultiModalRegistry) MultiModalRegistry)
from vllm.platforms import current_platform from vllm.platforms import current_platform
from vllm.prompt_adapter.layers import PromptAdapterMapping from vllm.prompt_adapter.layers import PromptAdapterMapping
@ -252,7 +252,7 @@ class ModelInputForGPUBuilder(ModelRunnerInputBuilderBase[ModelInputForGPU]):
prompt_adapter_request: Optional[PromptAdapterRequest] = None, prompt_adapter_request: Optional[PromptAdapterRequest] = None,
# Multi-modal inputs. # Multi-modal inputs.
multi_modal_inputs: Optional[MultiModalInputs] = None, multi_model_kwargs: Optional[MultiModalKwargs] = None,
multi_modal_placeholder_maps: Optional[Dict[ multi_modal_placeholder_maps: Optional[Dict[
str, MultiModalPlaceholderMap]] = None, str, MultiModalPlaceholderMap]] = None,
@ -373,7 +373,7 @@ class ModelInputForGPUBuilder(ModelRunnerInputBuilderBase[ModelInputForGPU]):
prompt_adapter_prompt_mapping or []) prompt_adapter_prompt_mapping or [])
self.prompt_adapter_request = prompt_adapter_request self.prompt_adapter_request = prompt_adapter_request
self.multi_modal_inputs = multi_modal_inputs self.multi_model_kwargs = multi_model_kwargs
self.multi_modal_placeholder_maps = multi_modal_placeholder_maps self.multi_modal_placeholder_maps = multi_modal_placeholder_maps
self.prefix_cache_hit = prefix_cache_hit self.prefix_cache_hit = prefix_cache_hit
@ -661,7 +661,7 @@ class ModelInputForGPUBuilder(ModelRunnerInputBuilderBase[ModelInputForGPU]):
mm_kwargs = self.multi_modal_input_mapper( mm_kwargs = self.multi_modal_input_mapper(
mm_data, mm_data,
mm_processor_kwargs=seq_group_metadata.mm_processor_kwargs) mm_processor_kwargs=seq_group_metadata.mm_processor_kwargs)
inter_data.multi_modal_inputs = mm_kwargs inter_data.multi_model_kwargs = mm_kwargs
inter_data.multi_modal_placeholder_maps = placeholder_maps inter_data.multi_modal_placeholder_maps = placeholder_maps
# special processing for mrope position deltas. # special processing for mrope position deltas.
@ -935,11 +935,11 @@ class ModelInputForGPUBuilder(ModelRunnerInputBuilderBase[ModelInputForGPU]):
) )
# Multi-modal data. # Multi-modal data.
multi_modal_inputs_list = [ multi_model_kwargs_list = [
data.multi_modal_inputs for data in self.inter_data_list data.multi_model_kwargs for data in self.inter_data_list
if data.multi_modal_inputs is not None if data.multi_model_kwargs is not None
] ]
multi_modal_kwargs = MultiModalInputs.batch(multi_modal_inputs_list) multi_modal_kwargs = MultiModalKwargs.batch(multi_model_kwargs_list)
return self.model_input_cls( return self.model_input_cls(
input_tokens=input_tokens_tensor, input_tokens=input_tokens_tensor,
@ -1649,7 +1649,7 @@ class ModelRunner(GPUModelRunnerBase[ModelInputForGPUWithSamplingMetadata]):
kv_caches=kv_caches, kv_caches=kv_caches,
attn_metadata=model_input.attn_metadata, attn_metadata=model_input.attn_metadata,
intermediate_tensors=intermediate_tensors, intermediate_tensors=intermediate_tensors,
**MultiModalInputs.as_kwargs(multi_modal_kwargs, **MultiModalKwargs.as_kwargs(multi_modal_kwargs,
device=self.device), device=self.device),
**seqlen_agnostic_kwargs) **seqlen_agnostic_kwargs)

View File

@ -13,7 +13,7 @@ from vllm.model_executor import SamplingMetadata
from vllm.model_executor.layers.sampler import SamplerOutput from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.model_executor.model_loader.neuron import get_neuron_model from vllm.model_executor.model_loader.neuron import get_neuron_model
from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs,
MultiModalInputs) MultiModalKwargs)
from vllm.sequence import IntermediateTensors, SequenceGroupMetadata from vllm.sequence import IntermediateTensors, SequenceGroupMetadata
from vllm.utils import is_pin_memory_available, make_tensor_with_pad from vllm.utils import is_pin_memory_available, make_tensor_with_pad
from vllm.worker.model_runner_base import ModelRunnerBase, ModelRunnerInputBase from vllm.worker.model_runner_base import ModelRunnerBase, ModelRunnerInputBase
@ -122,7 +122,7 @@ class NeuronModelRunner(ModelRunnerBase[ModelInputForNeuron]):
input_block_ids: List[int] = [] input_block_ids: List[int] = []
seq_lens: List[int] = [] seq_lens: List[int] = []
multi_modal_inputs_list: List[MultiModalInputs] = [] multi_model_kwargs_list: List[MultiModalKwargs] = []
for seq_group_metadata in seq_group_metadata_list: for seq_group_metadata in seq_group_metadata_list:
assert seq_group_metadata.is_prompt assert seq_group_metadata.is_prompt
seq_ids = list(seq_group_metadata.seq_data.keys()) seq_ids = list(seq_group_metadata.seq_data.keys())
@ -149,7 +149,7 @@ class NeuronModelRunner(ModelRunnerBase[ModelInputForNeuron]):
mm_data, mm_data,
mm_processor_kwargs=seq_group_metadata.mm_processor_kwargs, mm_processor_kwargs=seq_group_metadata.mm_processor_kwargs,
) )
multi_modal_inputs_list.append(mm_kwargs) multi_model_kwargs_list.append(mm_kwargs)
max_seq_len = max(seq_lens) max_seq_len = max(seq_lens)
assert max_seq_len > 0 assert max_seq_len > 0
@ -167,7 +167,7 @@ class NeuronModelRunner(ModelRunnerBase[ModelInputForNeuron]):
dtype=torch.long, dtype=torch.long,
device=self.device) device=self.device)
multi_modal_kwargs = MultiModalInputs.batch(multi_modal_inputs_list) multi_modal_kwargs = MultiModalKwargs.batch(multi_model_kwargs_list)
return (input_tokens, input_positions, input_block_ids, seq_lens, return (input_tokens, input_positions, input_block_ids, seq_lens,
multi_modal_kwargs) multi_modal_kwargs)
@ -314,7 +314,7 @@ class NeuronModelRunner(ModelRunnerBase[ModelInputForNeuron]):
input_ids=model_input.input_tokens, input_ids=model_input.input_tokens,
positions=model_input.input_positions, positions=model_input.input_positions,
input_block_ids=model_input.input_block_ids, input_block_ids=model_input.input_block_ids,
**MultiModalInputs.as_kwargs(model_input.multi_modal_kwargs or {}, **MultiModalKwargs.as_kwargs(model_input.multi_modal_kwargs or {},
device=self.device), device=self.device),
) )

View File

@ -13,7 +13,7 @@ from vllm.model_executor import SamplingMetadata
from vllm.model_executor.layers.sampler import SamplerOutput from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.model_executor.model_loader.openvino import get_model from vllm.model_executor.model_loader.openvino import get_model
from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs,
MultiModalInputs, MultiModalPlaceholderMap) MultiModalKwargs, MultiModalPlaceholderMap)
from vllm.sequence import SequenceGroupMetadata from vllm.sequence import SequenceGroupMetadata
from vllm.worker.model_runner_base import ModelRunnerBase from vllm.worker.model_runner_base import ModelRunnerBase
@ -102,7 +102,7 @@ class OpenVINOModelRunner(ModelRunnerBase):
seq_lens: List[int] = [] seq_lens: List[int] = []
past_lens: List[int] = [] past_lens: List[int] = []
query_lens: List[int] = [] query_lens: List[int] = []
multi_modal_inputs_list: List[MultiModalInputs] = [] multi_model_kwargs_list: List[MultiModalKwargs] = []
multi_modal_placeholder_maps: Dict[ multi_modal_placeholder_maps: Dict[
str, str,
MultiModalPlaceholderMap] = defaultdict(MultiModalPlaceholderMap) MultiModalPlaceholderMap] = defaultdict(MultiModalPlaceholderMap)
@ -226,7 +226,7 @@ class OpenVINOModelRunner(ModelRunnerBase):
mm_data, mm_data,
mm_processor_kwargs=seq_group_metadata. mm_processor_kwargs=seq_group_metadata.
mm_processor_kwargs) mm_processor_kwargs)
multi_modal_inputs_list.append(mm_kwargs) multi_model_kwargs_list.append(mm_kwargs)
for modality, placeholder_map in placeholder_maps.items(): for modality, placeholder_map in placeholder_maps.items():
multi_modal_placeholder_maps[modality].extend( multi_modal_placeholder_maps[modality].extend(
@ -275,7 +275,7 @@ class OpenVINOModelRunner(ModelRunnerBase):
multi_modal_placeholder_index_maps=placeholder_index_maps, multi_modal_placeholder_index_maps=placeholder_index_maps,
) )
multi_modal_kwargs = MultiModalInputs.batch(multi_modal_inputs_list) multi_modal_kwargs = MultiModalKwargs.batch(multi_model_kwargs_list)
return ModelInput( return ModelInput(
input_tokens, input_tokens,
@ -341,7 +341,7 @@ class OpenVINOModelRunner(ModelRunnerBase):
kv_caches, kv_caches,
"attn_metadata": "attn_metadata":
attn_metadata, attn_metadata,
**MultiModalInputs.as_kwargs(multi_modal_kwargs or {}, **MultiModalKwargs.as_kwargs(multi_modal_kwargs or {},
device=self.device), device=self.device),
} }

View File

@ -18,7 +18,7 @@ from vllm.model_executor import SamplingMetadataCache
from vllm.model_executor.layers.sampler import SamplerOutput from vllm.model_executor.layers.sampler import SamplerOutput
from vllm.model_executor.model_loader import get_model from vllm.model_executor.model_loader import get_model
from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs, from vllm.multimodal import (MULTIMODAL_REGISTRY, BatchedTensorInputs,
MultiModalInputs, MultiModalPlaceholderMap, MultiModalKwargs, MultiModalPlaceholderMap,
MultiModalRegistry) MultiModalRegistry)
from vllm.sampling_params import SamplingParams from vllm.sampling_params import SamplingParams
from vllm.sequence import IntermediateTensors, SequenceGroupMetadata from vllm.sequence import IntermediateTensors, SequenceGroupMetadata
@ -160,7 +160,7 @@ class ModelInputForXPUBuilder(ModelRunnerInputBuilderBase[ModelInputForXPU]):
input_positions: List[int] = [] input_positions: List[int] = []
slot_mapping: List[int] = [] slot_mapping: List[int] = []
seq_lens: List[int] = [] seq_lens: List[int] = []
multi_modal_inputs_list: List[MultiModalInputs] = [] multi_model_kwargs_list: List[MultiModalKwargs] = []
multi_modal_placeholder_maps: Dict[ multi_modal_placeholder_maps: Dict[
str, str,
MultiModalPlaceholderMap] = defaultdict(MultiModalPlaceholderMap) MultiModalPlaceholderMap] = defaultdict(MultiModalPlaceholderMap)
@ -192,7 +192,7 @@ class ModelInputForXPUBuilder(ModelRunnerInputBuilderBase[ModelInputForXPU]):
.from_seq_group(seq_group_metadata, positions_range) .from_seq_group(seq_group_metadata, positions_range)
mm_kwargs = self.runner.multi_modal_input_mapper(mm_data) mm_kwargs = self.runner.multi_modal_input_mapper(mm_data)
multi_modal_inputs_list.append(mm_kwargs) multi_model_kwargs_list.append(mm_kwargs)
for modality, placeholder_map in placeholder_maps.items(): for modality, placeholder_map in placeholder_maps.items():
multi_modal_placeholder_maps[modality].extend( multi_modal_placeholder_maps[modality].extend(
@ -264,7 +264,7 @@ class ModelInputForXPUBuilder(ModelRunnerInputBuilderBase[ModelInputForXPU]):
block_tables=torch.tensor([], device=self.device, dtype=torch.int), block_tables=torch.tensor([], device=self.device, dtype=torch.int),
) )
multi_modal_kwargs = MultiModalInputs.batch(multi_modal_inputs_list) multi_modal_kwargs = MultiModalKwargs.batch(multi_model_kwargs_list)
return (input_tokens, input_positions, attn_metadata, seq_lens, return (input_tokens, input_positions, attn_metadata, seq_lens,
multi_modal_kwargs) multi_modal_kwargs)
@ -565,7 +565,7 @@ class XPUModelRunner(ModelRunnerBase[ModelInputForXPUWithSamplingMetadata]):
kv_caches=kv_caches, kv_caches=kv_caches,
attn_metadata=model_input.attn_metadata, attn_metadata=model_input.attn_metadata,
intermediate_tensors=intermediate_tensors, intermediate_tensors=intermediate_tensors,
**MultiModalInputs.as_kwargs(model_input.multi_modal_kwargs or {}, **MultiModalKwargs.as_kwargs(model_input.multi_modal_kwargs or {},
device=self.device)) device=self.device))
# Compute the logits in the last pipeline stage. # Compute the logits in the last pipeline stage.
if not get_pp_group().is_last_rank: if not get_pp_group().is_last_rank: