Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@
from vllm.outputs import RequestOutput
from vllm.sampling_params import BeamSearchParams
from vllm.transformers_utils.utils import maybe_model_redirect
from vllm.utils import is_list_of, set_default_torch_num_threads
from vllm.utils import set_default_torch_num_threads
from vllm.utils.collections import is_list_of

logger = init_logger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from transformers.video_utils import VideoMetadata

from vllm.logprobs import SampleLogprobs
from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of

from .....conftest import HfRunner, ImageAsset, ImageTestAssets
from .types import RunnerOutput
Expand Down
2 changes: 1 addition & 1 deletion tests/models/multimodal/processing/test_tensor_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@
from vllm.multimodal.processing import BaseMultiModalProcessor, InputProcessingContext
from vllm.multimodal.utils import group_mm_kwargs_by_modality
from vllm.transformers_utils.tokenizer import cached_tokenizer_from_config
from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of

from ...registry import _MULTIMODAL_EXAMPLE_MODELS, HF_EXAMPLE_MODELS
from ...utils import dummy_hf_overrides
Expand Down
31 changes: 31 additions & 0 deletions tests/utils_/test_collections.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# SPDX-License-Identifier: Apache-2.0
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
import pytest

from vllm.utils.collections import swap_dict_values


@pytest.mark.parametrize(
"obj,key1,key2",
[
# Tests for both keys exist
({1: "a", 2: "b"}, 1, 2),
# Tests for one key does not exist
({1: "a", 2: "b"}, 1, 3),
# Tests for both keys do not exist
({1: "a", 2: "b"}, 3, 4),
],
)
def test_swap_dict_values(obj, key1, key2):
original_obj = obj.copy()

swap_dict_values(obj, key1, key2)

if key1 in original_obj:
assert obj[key2] == original_obj[key1]
else:
assert key2 not in obj
if key2 in original_obj:
assert obj[key1] == original_obj[key2]
else:
assert key1 not in obj
25 changes: 0 additions & 25 deletions tests/utils_/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,6 @@
sha256,
split_host_port,
split_zmq_path,
swap_dict_values,
unique_filepath,
)

Expand Down Expand Up @@ -516,30 +515,6 @@ def build_ctx():
_ = placeholder_attr.module


@pytest.mark.parametrize(
"obj,key1,key2",
[
# Tests for both keys exist
({1: "a", 2: "b"}, 1, 2),
# Tests for one key does not exist
({1: "a", 2: "b"}, 1, 3),
# Tests for both keys do not exist
({1: "a", 2: "b"}, 3, 4),
],
)
def test_swap_dict_values(obj, key1, key2):
original_obj = obj.copy()
swap_dict_values(obj, key1, key2)
if key1 in original_obj:
assert obj[key2] == original_obj[key1]
else:
assert key2 not in obj
if key2 in original_obj:
assert obj[key1] == original_obj[key2]
else:
assert key1 not in obj


def test_model_specification(
parser_with_config, cli_config_file, cli_config_file_with_model
):
Expand Down
3 changes: 2 additions & 1 deletion vllm/entrypoints/llm.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@
get_cached_tokenizer,
)
from vllm.usage.usage_lib import UsageContext
from vllm.utils import Counter, Device, as_iter, is_list_of
from vllm.utils import Counter, Device
from vllm.utils.collections import as_iter, is_list_of
from vllm.v1.engine import EngineCoreRequest
from vllm.v1.engine.llm_engine import LLMEngine
from vllm.v1.sample.logits_processor import LogitsProcessor
Expand Down
2 changes: 1 addition & 1 deletion vllm/entrypoints/openai/serving_chat.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@
truncate_tool_call_ids,
validate_request_params,
)
from vllm.utils import as_list
from vllm.utils.collections import as_list

logger = init_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion vllm/entrypoints/openai/serving_completion.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@
from vllm.outputs import RequestOutput
from vllm.sampling_params import BeamSearchParams, SamplingParams
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.utils import as_list
from vllm.utils.asyncio import merge_async_iterators
from vllm.utils.collections import as_list

logger = init_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion vllm/entrypoints/openai/serving_embedding.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@
RequestOutput,
)
from vllm.pooling_params import PoolingParams
from vllm.utils import chunk_list
from vllm.utils.asyncio import merge_async_iterators
from vllm.utils.collections import chunk_list

logger = init_logger(__name__)

Expand Down
3 changes: 2 additions & 1 deletion vllm/entrypoints/openai/serving_engine.py
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,14 @@
log_tracing_disabled_warning,
)
from vllm.transformers_utils.tokenizer import AnyTokenizer, MistralTokenizer
from vllm.utils import is_list_of, random_uuid
from vllm.utils import random_uuid
from vllm.utils.asyncio import (
AsyncMicrobatchTokenizer,
collect_from_async_generator,
make_async,
merge_async_iterators,
)
from vllm.utils.collections import is_list_of
from vllm.v1.engine import EngineCoreRequest

logger = init_logger(__name__)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
)
from vllm.logger import init_logger
from vllm.transformers_utils.tokenizer import AnyTokenizer
from vllm.utils import import_from_path, is_list_of
from vllm.utils import import_from_path
from vllm.utils.collections import is_list_of

logger = init_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion vllm/inputs/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

from typing_extensions import TypeIs

from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of

from .data import (
EmbedsPrompt,
Expand Down
2 changes: 1 addition & 1 deletion vllm/model_executor/layers/activation.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from vllm.model_executor.custom_op import CustomOp
from vllm.model_executor.utils import set_weight_attrs
from vllm.platforms import current_platform
from vllm.utils import LazyDict
from vllm.utils.collections import LazyDict

logger = init_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion vllm/model_executor/layers/quantization/gptq.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
RowvLLMParameter,
)
from vllm.transformers_utils.config import get_safetensors_params_metadata
from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of

if TYPE_CHECKING:
from vllm.model_executor.layers.quantization import QuantizationMethods
Expand Down
2 changes: 1 addition & 1 deletion vllm/model_executor/layers/quantization/gptq_marlin.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@
from vllm.platforms import current_platform
from vllm.scalar_type import scalar_types
from vllm.transformers_utils.config import get_safetensors_params_metadata
from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of

logger = init_logger(__name__)

Expand Down
2 changes: 1 addition & 1 deletion vllm/model_executor/models/deepseek_vl2.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@
)
from vllm.transformers_utils.processors.deepseek_vl2 import DeepseekVLV2Processor
from vllm.transformers_utils.tokenizer import cached_tokenizer_from_config
from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of
from vllm.utils.tensor_schema import TensorSchema, TensorShape

from .interfaces import MultiModalEmbeddings, SupportsMultiModal, SupportsPP
Expand Down
2 changes: 1 addition & 1 deletion vllm/model_executor/models/llava_next_video.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
)
from vllm.multimodal.profiling import BaseDummyInputsBuilder
from vllm.sequence import IntermediateTensors
from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of
from vllm.utils.tensor_schema import TensorSchema, TensorShape

from .interfaces import MultiModalEmbeddings, SupportsMultiModal, SupportsPP
Expand Down
2 changes: 1 addition & 1 deletion vllm/model_executor/models/minicpmv.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@
from vllm.multimodal.profiling import BaseDummyInputsBuilder
from vllm.platforms import current_platform
from vllm.sequence import IntermediateTensors
from vllm.utils import flatten_2d_lists
from vllm.utils.collections import flatten_2d_lists
from vllm.utils.tensor_schema import TensorSchema, TensorShape

from .idefics2_vision_model import Idefics2VisionTransformer
Expand Down
2 changes: 1 addition & 1 deletion vllm/model_executor/models/qwen3_vl.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
)
from vllm.multimodal.profiling import BaseDummyInputsBuilder
from vllm.sequence import IntermediateTensors
from vllm.utils import is_list_of
from vllm.utils.collections import is_list_of

from .interfaces import (
MultiModalEmbeddings,
Expand Down
3 changes: 2 additions & 1 deletion vllm/multimodal/inputs.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
import numpy as np
from typing_extensions import NotRequired, TypeVar, deprecated

from vllm.utils import LazyLoader, full_groupby, is_list_of
from vllm.utils import LazyLoader
from vllm.utils.collections import full_groupby, is_list_of
from vllm.utils.jsontree import json_map_leaves

if TYPE_CHECKING:
Expand Down
11 changes: 7 additions & 4 deletions vllm/multimodal/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
import torch
from typing_extensions import assert_never

from vllm.utils import LazyLoader, is_list_of
from vllm.utils import LazyLoader
from vllm.utils.collections import is_list_of

from .audio import AudioResampler
from .inputs import (
Expand Down Expand Up @@ -364,7 +365,7 @@ def _is_embeddings(
if isinstance(data, torch.Tensor):
return data.ndim == 3
if is_list_of(data, torch.Tensor):
return data[0].ndim == 2
return data[0].ndim == 2 # type: ignore[index]

return False

Expand Down Expand Up @@ -422,6 +423,7 @@ def _parse_audio_data(
if self._is_embeddings(data):
return AudioEmbeddingItems(data)

data_items: list[AudioItem]
if (
is_list_of(data, float)
or isinstance(data, (np.ndarray, torch.Tensor))
Expand All @@ -432,7 +434,7 @@ def _parse_audio_data(
elif isinstance(data, (np.ndarray, torch.Tensor)):
data_items = [elem for elem in data]
else:
data_items = data
data_items = data # type: ignore[assignment]

new_audios = list[np.ndarray]()
for data_item in data_items:
Expand Down Expand Up @@ -485,6 +487,7 @@ def _parse_video_data(
if self._is_embeddings(data):
return VideoEmbeddingItems(data)

data_items: list[VideoItem]
if (
is_list_of(data, PILImage.Image)
or isinstance(data, (np.ndarray, torch.Tensor))
Expand All @@ -496,7 +499,7 @@ def _parse_video_data(
elif isinstance(data, tuple) and len(data) == 2:
data_items = [data]
else:
data_items = data
data_items = data # type: ignore[assignment]

new_videos = list[tuple[np.ndarray, dict[str, Any] | None]]()
metadata_lst: list[dict[str, Any] | None] = []
Expand Down
9 changes: 6 additions & 3 deletions vllm/multimodal/processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
from vllm.logger import init_logger
from vllm.transformers_utils.processor import cached_processor_from_config
from vllm.transformers_utils.tokenizer import AnyTokenizer, decode_tokens, encode_tokens
from vllm.utils import flatten_2d_lists, full_groupby
from vllm.utils.collections import flatten_2d_lists, full_groupby
from vllm.utils.functools import get_allowed_kwarg_only_overrides
from vllm.utils.jsontree import JSONTree, json_map_leaves

Expand Down Expand Up @@ -484,8 +484,11 @@ def modality(self) -> str: ...


def full_groupby_modality(values: Iterable[_M]) -> ItemsView[str, list[_M]]:
"""Convenience function to apply [`full_groupby`][vllm.utils.full_groupby]
based on modality."""
"""
Convenience function to apply
[`full_groupby`][vllm.utils.collections.full_groupby]
based on modality.
"""
return full_groupby(values, key=lambda x: x.modality)


Expand Down
2 changes: 1 addition & 1 deletion vllm/multimodal/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
from vllm.config.multimodal import BaseDummyOptions
from vllm.logger import init_logger
from vllm.transformers_utils.tokenizer import AnyTokenizer, cached_tokenizer_from_config
from vllm.utils import ClassRegistry
from vllm.utils.collections import ClassRegistry

from .cache import BaseMultiModalProcessorCache
from .processing import (
Expand Down
3 changes: 2 additions & 1 deletion vllm/reasoning/abs_reasoning_parsers.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
from typing import TYPE_CHECKING, Any

from vllm.logger import init_logger
from vllm.utils import import_from_path, is_list_of
from vllm.utils import import_from_path
from vllm.utils.collections import is_list_of

if TYPE_CHECKING:
from vllm.entrypoints.openai.protocol import (
Expand Down
Loading