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

[CI] Move applicable tests to CPU (#24080)

Signed-off-by: Harry Mellor <19981378+hmellor@users.noreply.github.com> Co-authored-by: Harry Mellor <19981378+hmellor@users.noreply.github.com>

Reza Barazesh committed Sep 30, 2025 at 09:45 UTC bc546f76a145087ceae59e842443193aaf8a91a0
39 files changed +136 -28
.buildkite/test-pipeline.yaml
+49 -16
@@ -50,19 +50,28 @@ steps:
50 mirror_hardwares: [amdexperimental]
51 source_file_dependencies:
52 - vllm/
53 + - tests/multimodal
54 + - tests/utils_
55 + commands:
56 + - pytest -v -s -m 'not cpu_test' multimodal
57 + - pytest -v -s utils_
58 +
59 +- label: Async Engine, Inputs, Utils, Worker Test (CPU) # 4 mins
60 + timeout_in_minutes: 10
61 + source_file_dependencies:
62 + - vllm/
63 - tests/test_inputs.py
64 - tests/test_outputs.py
65 - tests/multimodal
56 - - tests/utils_
66 - tests/standalone_tests/lazy_imports.py
67 - tests/transformers_utils
68 + no_gpu: true
69 commands:
70 - python3 standalone_tests/lazy_imports.py
71 - pytest -v -s test_inputs.py
72 - pytest -v -s test_outputs.py
63 - - pytest -v -s multimodal
64 - - pytest -v -s utils_ # Utils
65 - - pytest -v -s transformers_utils # transformers_utils
73 + - pytest -v -s -m 'cpu_test' multimodal
74 + - pytest -v -s transformers_utils
75
76 - label: Python-only Installation Test # 10min
77 timeout_in_minutes: 20
@@ -287,23 +296,34 @@ steps:
296 - tests/v1
297 commands:
298 # split the test to avoid interference
290 - - pytest -v -s v1/core
299 - pytest -v -s v1/executor
300 - pytest -v -s v1/kv_offload
301 - pytest -v -s v1/sample
302 - pytest -v -s v1/logits_processors
303 - pytest -v -s v1/worker
296 - - pytest -v -s v1/structured_output
304 - pytest -v -s v1/spec_decode
298 - - pytest -v -s v1/kv_connector/unit
299 - - pytest -v -s v1/metrics
305 + - pytest -v -s -m 'not cpu_test' v1/kv_connector/unit
306 + - pytest -v -s -m 'not cpu_test' v1/metrics
307 - pytest -v -s v1/test_oracle.py
308 - pytest -v -s v1/test_request.py
302 - - pytest -v -s v1/test_serial_utils.py
309 # Integration test for streaming correctness (requires special branch).
310 - pip install -U git+https://github.com/robertgshaw2-redhat/lm-evaluation-harness.git@streaming-api
311 - pytest -v -s entrypoints/openai/correctness/test_lmeval.py::test_lm_eval_accuracy_v1_engine
312
313 +- label: V1 Test others (CPU) # 5 mins
314 + source_file_dependencies:
315 + - vllm/
316 + - tests/v1
317 + no_gpu: true
318 + commands:
319 + # split the test to avoid interference
320 + - pytest -v -s v1/core
321 + - pytest -v -s v1/structured_output
322 + - pytest -v -s v1/test_serial_utils.py
323 + - pytest -v -s -m 'cpu_test' v1/kv_connector/unit
324 + - pytest -v -s -m 'cpu_test' v1/metrics
325 +
326 +
327 - label: Examples Test # 30min
328 timeout_in_minutes: 45
329 mirror_hardwares: [amdexperimental]
@@ -533,10 +553,17 @@ steps:
553 source_file_dependencies:
554 - vllm/
555 - tests/tool_use
536 - - tests/mistral_tool_use
556 commands:
538 - - pytest -v -s tool_use
539 - - pytest -v -s mistral_tool_use
557 + - pytest -v -s -m 'not cpu_test' tool_use
558 +
559 +- label: OpenAI-Compatible Tool Use (CPU) # 5 mins
560 + timeout_in_minutes: 10
561 + source_file_dependencies:
562 + - vllm/
563 + - tests/tool_use
564 + no_gpu: true
565 + commands:
566 + - pytest -v -s -m 'cpu_test' tool_use
567
568 ##### models test #####
569
@@ -576,13 +603,19 @@ steps:
603 - vllm/
604 - tests/models/test_transformers.py
605 - tests/models/test_registry.py
606 + commands:
607 + - pytest -v -s models/test_transformers.py models/test_registry.py
608 +
609 +- label: Basic Models Test (Other CPU) # 5min
610 + timeout_in_minutes: 10
611 + torch_nightly: true
612 + source_file_dependencies:
613 + - vllm/
614 - tests/models/test_utils.py
615 - tests/models/test_vision.py
616 + no_gpu: true
617 commands:
582 - - pytest -v -s models/test_transformers.py \
583 - models/test_registry.py \
584 - models/test_utils.py \
585 - models/test_vision.py
618 + - pytest -v -s models/test_utils.py models/test_vision.py
619
620 - label: Language Models Tests (Standard)
621 timeout_in_minutes: 25
.github/mergify.yml
-1
@@ -239,7 +239,6 @@ pull_request_rules:
239 conditions:
240 - or:
241 - files~=^tests/tool_use/
242 - - files~=^tests/mistral_tool_use/
242 - files~=^tests/entrypoints/openai/tool_parsers/
243 - files=tests/entrypoints/openai/test_chat_with_tool_reasoning.py
244 - files~=^vllm/entrypoints/openai/tool_parsers/
docker/Dockerfile.cpu
+9 -8
@@ -47,7 +47,7 @@ ENV PATH="$VIRTUAL_ENV/bin:$PATH"
47
48 ENV UV_HTTP_TIMEOUT=500
49
50 -# Install Python dependencies
50 +# Install Python dependencies
51 ENV PIP_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL}
52 ENV UV_EXTRA_INDEX_URL=${PIP_EXTRA_INDEX_URL}
53 ENV UV_INDEX_STRATEGY="unsafe-best-match"
@@ -104,7 +104,7 @@ RUN --mount=type=cache,target=/root/.cache/uv \
104 --mount=type=cache,target=/root/.cache/ccache \
105 --mount=type=cache,target=/workspace/vllm/.deps,sharing=locked \
106 --mount=type=bind,source=.git,target=.git \
107 - VLLM_TARGET_DEVICE=cpu python3 setup.py bdist_wheel
107 + VLLM_TARGET_DEVICE=cpu python3 setup.py bdist_wheel
108
109 ######################### TEST DEPS #########################
110 FROM base AS vllm-test-deps
@@ -117,7 +117,7 @@ RUN --mount=type=bind,src=requirements/test.in,target=requirements/test.in \
117 uv pip compile requirements/cpu-test.in -o requirements/cpu-test.txt --index-strategy unsafe-best-match --torch-backend cpu
118
119 RUN --mount=type=cache,target=/root/.cache/uv \
120 - uv pip install -r requirements/cpu-test.txt
120 + uv pip install -r requirements/cpu-test.txt
121
122 ######################### DEV IMAGE #########################
123 FROM vllm-build AS vllm-dev
@@ -130,12 +130,12 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
130
131 # install development dependencies (for testing)
132 RUN --mount=type=cache,target=/root/.cache/uv \
133 - uv pip install -e tests/vllm_test_utils
133 + uv pip install -e tests/vllm_test_utils
134
135 RUN --mount=type=cache,target=/root/.cache/uv \
136 --mount=type=cache,target=/root/.cache/ccache \
137 --mount=type=bind,source=.git,target=.git \
138 - VLLM_TARGET_DEVICE=cpu python3 setup.py develop
138 + VLLM_TARGET_DEVICE=cpu python3 setup.py develop
139
140 COPY --from=vllm-test-deps /workspace/vllm/requirements/cpu-test.txt requirements/test.txt
141
@@ -160,11 +160,12 @@ ADD ./benchmarks/ ./benchmarks/
160 ADD ./vllm/collect_env.py .
161 ADD ./.buildkite/ ./.buildkite/
162
163 +# Create symlink for vllm-workspace to maintain CI compatibility
164 +RUN ln -sf /workspace /vllm-workspace
165 +
166 # install development dependencies (for testing)
167 RUN --mount=type=cache,target=/root/.cache/uv \
165 - uv pip install -e tests/vllm_test_utils
166 -
167 -ENTRYPOINT ["bash"]
168 + uv pip install -e tests/vllm_test_utils
169
170 ######################### RELEASE IMAGE #########################
171 FROM base AS vllm-openai
pyproject.toml
+1
@@ -126,6 +126,7 @@ markers = [
126 "core_model: enable this model test in each PR instead of only nightly",
127 "hybrid_model: models that contain mamba layers (including pure SSM and hybrid architectures)",
128 "cpu_model: enable this model test in CPU tests",
129 + "cpu_test: mark test as CPU-only test",
130 "split: run this test as part of a split",
131 "distributed: run this test only in distributed GPU tests",
132 "skip_v1: do not run this test with v1",
tests/models/test_utils.py
+3
@@ -1,10 +1,13 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 +import pytest
5 import torch
6
7 from vllm.model_executor.models.utils import AutoWeightsLoader
8
9 +pytestmark = pytest.mark.cpu_test
10 +
11
12 class ModuleWithBatchNorm(torch.nn.Module):
13
tests/models/test_vision.py
+2
@@ -16,6 +16,8 @@ from vllm.model_executor.models.vision import (
16 from vllm.platforms import current_platform
17 from vllm.utils import get_open_port, update_environment_variables
18
19 +pytestmark = pytest.mark.cpu_test
20 +
21
22 @pytest.mark.parametrize(
23 ("select_layers", "num_layers_loaded", "max_possible_layers",
tests/multimodal/test_cache.py
+2
@@ -19,6 +19,8 @@ from vllm.multimodal.inputs import (MultiModalFieldElem, MultiModalKwargsItem,
19 MultiModalSharedField)
20 from vllm.multimodal.processing import PromptInsertion
21
22 +pytestmark = pytest.mark.cpu_test
23 +
24
25 def _dummy_elem(
26 modality: str,
tests/multimodal/test_hasher.py
+2
@@ -10,6 +10,8 @@ from PIL import Image, ImageDraw
10
11 from vllm.multimodal.hasher import MultiModalHasher
12
13 +pytestmark = pytest.mark.cpu_test
14 +
15 ASSETS_DIR = Path(__file__).parent / "assets"
16 assert ASSETS_DIR.exists()
17
tests/multimodal/test_image.py
+2
@@ -8,6 +8,8 @@ from PIL import Image, ImageChops
8
9 from vllm.multimodal.image import ImageMediaIO, convert_image_mode
10
11 +pytestmark = pytest.mark.cpu_test
12 +
13 ASSETS_DIR = Path(__file__).parent / "assets"
14 assert ASSETS_DIR.exists()
15
tests/multimodal/test_inputs.py
+3
@@ -1,10 +1,13 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 +import pytest
5 import torch
6
7 from vllm.multimodal.inputs import MultiModalKwargs, NestedTensors
8
9 +pytestmark = pytest.mark.cpu_test
10 +
11
12 def assert_nested_tensors_equal(expected: NestedTensors,
13 actual: NestedTensors):
tests/multimodal/test_processing.py
+2
@@ -25,6 +25,8 @@ from vllm.transformers_utils.tokenizer import AnyTokenizer
25
26 from .utils import random_image
27
28 +pytestmark = pytest.mark.cpu_test
29 +
30
31 # yapf: disable
32 @pytest.mark.parametrize(
tests/multimodal/test_registry.py
+2
@@ -11,6 +11,8 @@ from vllm.multimodal import MULTIMODAL_REGISTRY
11
12 from ..models.utils import build_model_context
13
14 +pytestmark = pytest.mark.cpu_test
15 +
16
17 @pytest.mark.parametrize(
18 "model_id,limit_mm_per_prompt,expected",
tests/multimodal/test_video.py
+2
@@ -17,6 +17,8 @@ from vllm.multimodal.video import (VIDEO_LOADER_REGISTRY, VideoLoader,
17
18 from .utils import cosine_similarity, create_video_from_image, normalize_image
19
20 +pytestmark = pytest.mark.cpu_test
21 +
22 NUM_FRAMES = 10
23 FAKE_OUTPUT_1 = np.random.rand(NUM_FRAMES, 1280, 720, 3)
24 FAKE_OUTPUT_2 = np.random.rand(NUM_FRAMES, 1280, 720, 3)
tests/test_inputs.py
+2
@@ -6,6 +6,8 @@ import pytest
6 from vllm.inputs import zip_enc_dec_prompts
7 from vllm.inputs.parse import parse_and_batch_prompt
8
9 +pytestmark = pytest.mark.cpu_test
10 +
11 STRING_INPUTS = [
12 '',
13 'foo',
tests/test_outputs.py
+4
@@ -1,8 +1,12 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3
4 +import pytest
5 +
6 from vllm.outputs import RequestOutput
7
8 +pytestmark = pytest.mark.cpu_test
9 +
10
11 def test_request_output_forward_compatible():
12 output = RequestOutput(request_id="test_request_id",
tests/tool_use/mistral/__init__.py renamed
tests/tool_use/mistral/conftest.py renamed
+2 -2
@@ -12,7 +12,7 @@ from .utils import ARGS, CONFIGS, ServerConfig
12
13
14 # for each server config, download the model and return the config
15 -@pytest.fixture(scope="session", params=CONFIGS.keys())
15 +@pytest.fixture(scope="package", params=CONFIGS.keys())
16 def server_config(request):
17 config = CONFIGS[request.param]
18
@@ -26,7 +26,7 @@ def server_config(request):
26
27
28 # run this for each server config
29 -@pytest.fixture(scope="session")
29 +@pytest.fixture(scope="package")
30 def server(request, server_config: ServerConfig):
31 model = server_config["model"]
32 args_for_model = server_config["arguments"]
tests/tool_use/mistral/test_mistral_tool_calls.py renamed
tests/tool_use/mistral/utils.py renamed
tests/tool_use/test_glm4_moe_tool_parser.py
+2
@@ -10,6 +10,8 @@ from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
10 from vllm.entrypoints.openai.tool_parsers import Glm4MoeModelToolParser
11 from vllm.transformers_utils.tokenizer import get_tokenizer
12
13 +pytestmark = pytest.mark.cpu_test
14 +
15 pytest.skip("skip glm4_moe parser test", allow_module_level=True)
16 # Use a common model that is likely to be available
17 MODEL = "zai-org/GLM-4.5"
tests/tool_use/test_jamba_tool_parser.py
+2
@@ -15,6 +15,8 @@ from vllm.entrypoints.openai.tool_parsers import JambaToolParser
15 from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
16 from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
17
18 +pytestmark = pytest.mark.cpu_test
19 +
20 MODEL = "ai21labs/Jamba-tiny-dev"
21
22
tests/tool_use/test_kimi_k2_tool_parser.py
+2
@@ -10,6 +10,8 @@ from vllm.entrypoints.openai.protocol import FunctionCall, ToolCall
10 from vllm.entrypoints.openai.tool_parsers import KimiK2ToolParser
11 from vllm.transformers_utils.tokenizer import get_tokenizer
12
13 +pytestmark = pytest.mark.cpu_test
14 +
15 # Use a common model that is likely to be available
16 MODEL = "moonshotai/Kimi-K2-Instruct"
17
tests/tool_use/test_minimax_tool_parser.py
+2
@@ -12,6 +12,8 @@ from vllm.entrypoints.openai.protocol import (ChatCompletionToolsParam,
12 from vllm.entrypoints.openai.tool_parsers import MinimaxToolParser
13 from vllm.transformers_utils.tokenizer import get_tokenizer
14
15 +pytestmark = pytest.mark.cpu_test
16 +
17 # Use a common model that is likely to be available
18 MODEL = "MiniMaxAi/MiniMax-M1-40k"
19
tests/tool_use/test_qwen3coder_tool_parser.py
+2
@@ -18,6 +18,8 @@ from vllm.entrypoints.openai.tool_parsers.qwen3xml_tool_parser import (
18 from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
19 from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
20
21 +pytestmark = pytest.mark.cpu_test
22 +
23 MODEL = "Qwen/Qwen3-Coder-30B-A3B-Instruct-FP8"
24
25
tests/tool_use/test_seed_oss_tool_parser.py
+2
@@ -16,6 +16,8 @@ from vllm.entrypoints.openai.tool_parsers import SeedOssToolParser
16 from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
17 from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
18
19 +pytestmark = pytest.mark.cpu_test
20 +
21 # Use a common model that is likely to be available
22 MODEL = "ByteDance-Seed/Seed-OSS-36B-Instruct"
23
tests/tool_use/test_tool_choice_required.py
+2
@@ -12,6 +12,8 @@ from vllm.entrypoints.openai.protocol import (ChatCompletionRequest,
12 ChatCompletionToolsParam)
13 from vllm.entrypoints.openai.serving_chat import OpenAIServingChat
14
15 +pytestmark = pytest.mark.cpu_test
16 +
17 EXAMPLE_TOOLS = [
18 {
19 "type": "function",
tests/tool_use/test_xlam_tool_parser.py
+2
@@ -14,6 +14,8 @@ from vllm.entrypoints.openai.tool_parsers import xLAMToolParser
14 from vllm.transformers_utils.detokenizer_utils import detokenize_incrementally
15 from vllm.transformers_utils.tokenizer import AnyTokenizer, get_tokenizer
16
17 +pytestmark = pytest.mark.cpu_test
18 +
19 # Use a common model that is likely to be available
20 MODEL = "Salesforce/Llama-xLAM-2-8B-fc-r"
21
tests/v1/core/test_async_scheduler.py
+2
@@ -11,6 +11,8 @@ from vllm.v1.utils import ConstantList
11
12 from .utils import create_requests, create_scheduler
13
14 +pytestmark = pytest.mark.cpu_test
15 +
16
17 def _make_model_runner_output(
18 scheduler_output: SchedulerOutput, ) -> ModelRunnerOutput:
tests/v1/core/test_encoder_cache_manager.py
+3
@@ -1,9 +1,12 @@
1 # SPDX-License-Identifier: Apache-2.0
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 +import pytest
4
5 from vllm.multimodal.inputs import MultiModalFeatureSpec, PlaceholderRange
6 from vllm.v1.core.encoder_cache_manager import EncoderCacheManager
7
8 +pytestmark = pytest.mark.cpu_test
9 +
10
11 # ------------------ Mock Classes ------------------ #
12 class MockRequest:
tests/v1/core/test_kv_cache_utils.py
+2
@@ -32,6 +32,8 @@ from vllm.v1.request import Request
32
33 # yapf: enable
34
35 +pytestmark = pytest.mark.cpu_test
36 +
37
38 @pytest.fixture(autouse=True)
39 def _auto_init_hash_fn(request):
tests/v1/core/test_prefix_caching.py
+3 -1
@@ -25,6 +25,8 @@ from vllm.v1.core.kv_cache_utils import (BlockHash, BlockHashWithGroupId,
25 from vllm.v1.kv_cache_interface import (FullAttentionSpec, KVCacheConfig,
26 KVCacheGroupSpec, SlidingWindowSpec)
27
28 +pytestmark = pytest.mark.cpu_test
29 +
30
31 @pytest.fixture(autouse=True)
32 def _auto_init_hash_fn(request):
@@ -1267,7 +1269,7 @@ def test_kv_cache_events(blocks_to_cache: int):
1269
1270
1271 def test_eagle_enabled_removes_last_block():
1270 - """Verify Eagle does NOT remove blocks when request
1272 + """Verify Eagle does NOT remove blocks when request
1273 length is divisible by block size."""
1274 block_size = 16
1275 manager = KVCacheManager(
tests/v1/core/test_scheduler.py
+2
@@ -23,6 +23,8 @@ from vllm.v1.structured_output.request import StructuredOutputRequest
23
24 from .utils import EOS_TOKEN_ID, create_requests, create_scheduler
25
26 +pytestmark = pytest.mark.cpu_test
27 +
28
29 def test_add_requests():
30 scheduler = create_scheduler()
tests/v1/core/test_single_type_kv_cache_manager.py
+3
@@ -3,6 +3,7 @@
3
4 import random
5
6 +import pytest
7 import torch
8
9 from vllm.v1.core.block_pool import BlockPool
@@ -13,6 +14,8 @@ from vllm.v1.core.single_type_kv_cache_manager import (
14 from vllm.v1.kv_cache_interface import (ChunkedLocalAttentionSpec,
15 SlidingWindowSpec)
16
17 +pytestmark = pytest.mark.cpu_test
18 +
19
20 def get_sliding_window_manager(sliding_window_spec, block_pool):
21 return SlidingWindowManager(sliding_window_spec,
tests/v1/kv_connector/unit/test_output_aggreagator.py
+4
@@ -3,9 +3,13 @@
3 from concurrent.futures import Future
4 from typing import Optional
5
6 +import pytest
7 +
8 from vllm.distributed.kv_transfer.kv_connector.utils import KVOutputAggregator
9 from vllm.v1.outputs import KVConnectorOutput, ModelRunnerOutput
10
11 +pytestmark = pytest.mark.cpu_test
12 +
13
14 class DummyModelRunnerOutput(ModelRunnerOutput):
15
tests/v1/kv_connector/unit/test_remote_decode_lifecycle.py
+4
@@ -2,12 +2,16 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 import copy
4
5 +import pytest
6 +
7 from vllm.v1.outputs import EMPTY_MODEL_RUNNER_OUTPUT, KVConnectorOutput
8 from vllm.v1.request import FinishReason, RequestStatus
9
10 from .utils import (assert_scheduler_empty, create_model_runner_output,
11 create_request, create_scheduler, create_vllm_config)
12
13 +pytestmark = pytest.mark.cpu_test
14 +
15
16 def test_basic_lifecycle():
17 """Test lifecycle of a Remote Decode request."""
tests/v1/kv_connector/unit/test_remote_prefill_lifecycle.py
+4
@@ -2,12 +2,16 @@
2 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3 import copy
4
5 +import pytest
6 +
7 from vllm.v1.outputs import EMPTY_MODEL_RUNNER_OUTPUT, KVConnectorOutput
8 from vllm.v1.request import FinishReason, RequestStatus
9
10 from .utils import (assert_scheduler_empty, create_model_runner_output,
11 create_request, create_scheduler, create_vllm_config)
12
13 +pytestmark = pytest.mark.cpu_test
14 +
15
16 def test_basic_lifecycle():
17 """Test lifecycle of a remote prefill."""
tests/v1/metrics/test_metrics_reader.py
+2
@@ -7,6 +7,8 @@ import pytest
7 from vllm.v1.metrics.reader import (Counter, Gauge, Histogram, Vector,
8 get_metrics_snapshot)
9
10 +pytestmark = pytest.mark.cpu_test
11 +
12
13 @pytest.fixture(autouse=True)
14 def test_registry(monkeypatch):
tests/v1/structured_output/test_utils.py
+2
@@ -6,6 +6,8 @@ import pytest
6 from vllm.v1.structured_output.backend_xgrammar import (
7 has_xgrammar_unsupported_json_features)
8
9 +pytestmark = pytest.mark.cpu_test
10 +
11
12 @pytest.fixture
13 def unsupported_string_schemas():
tests/v1/test_serial_utils.py
+2
@@ -16,6 +16,8 @@ from vllm.multimodal.inputs import (MultiModalBatchedField,
16 MultiModalSharedField, NestedTensors)
17 from vllm.v1.serial_utils import MsgpackDecoder, MsgpackEncoder
18
19 +pytestmark = pytest.mark.cpu_test
20 +
21
22 class UnrecognizedType(UserDict):
23