test_initialization.py 6.18 KB
Newer Older
1
# SPDX-License-Identifier: Apache-2.0
2
# SPDX-FileCopyrightText: Copyright contributors to the vLLM project
3

4
from functools import partial
5
6
7
8
9
from unittest.mock import patch

import pytest

from vllm import LLM
10
from vllm.utils import GiB_bytes
11
12
from vllm.v1.core.kv_cache_utils import (generate_scheduler_kv_cache_config,
                                         get_kv_cache_configs)
13
from vllm.v1.engine.core import EngineCore as V1EngineCore
14

15
from ..utils import create_new_process_for_each_test
16
17
from .registry import (_TRANSFORMERS_BACKEND_MODELS, AUTO_EXAMPLE_MODELS,
                       HF_EXAMPLE_MODELS, HfExampleModels)
18
from .utils import dummy_hf_overrides
19

20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# This minimal list of model architectures is smaller than the total list of
# supported models. The intention is that in the "typical" regression testing
# scenario, we only test initializing these models. This subset was chosen
# to include representative examples of model varieties/workloads (conditional
# generation, sequence classification, causal LM, ranking, chat, reward model,
# multimodal, geospatial, voice, embedding, MTP)
MINIMAL_MODEL_ARCH_LIST = [
    "LlavaForConditionalGeneration", "Llama4ForConditionalGeneration",
    "BertForSequenceClassification", "Gemma3nForCausalLM", "JinaVLForRanking",
    "InternVLChatModel", "InternLM2ForRewardModel",
    "TransformersForMultimodalLM", "PrithviGeoSpatialMAE", "UltravoxModel",
    "DeepSeekMTPModel", "XLMRobertaModel"
]

# This list is the complement of the minimal list above. The intention is that
# this list of models is only tested in a "special case" i.e. most PRs should
# not test these models
OTHER_MODEL_ARCH_LIST = (set(HF_EXAMPLE_MODELS.get_supported_archs()) -
                         set(MINIMAL_MODEL_ARCH_LIST))

40

41
@create_new_process_for_each_test()
42
43
44
45
46
def can_initialize(model_arch: str, monkeypatch: pytest.MonkeyPatch,
                   EXAMPLE_MODELS: HfExampleModels):
    """The reason for using create_new_process_for_each_test is to avoid
    the WARNING:
        "We must use the 'spawn' multiprocessing start method. Overriding
47
        VLLM_WORKER_MULTIPROC_METHOD to 'spawn'."
48
    The spawn process causes the _initialize_kv_caches_v1 function below to
49
50
    become ineffective.
    """
51
52

    model_info = EXAMPLE_MODELS.get_hf_info(model_arch)
53
54
    model_info.check_available_online(on_fail="skip")
    model_info.check_transformers_version(on_fail="skip")
55

56
57
    hf_overrides_fn = partial(dummy_hf_overrides,
                              model_arch=model_arch,
58
59
60
61
                              exist_overrides=model_info.hf_overrides,
                              use_original_num_layers=getattr(
                                  model_info, 'use_original_num_layers',
                                  False))
62

63
    # Avoid calling model.forward()
64
65
    def _initialize_kv_caches_v1(self, vllm_config):
        kv_cache_specs = self.model_executor.get_kv_cache_specs()
66
        kv_cache_configs = get_kv_cache_configs(
67
            vllm_config,
68
69
            kv_cache_specs,
            [10 * GiB_bytes],
70
71
72
        )
        scheduler_kv_cache_config = generate_scheduler_kv_cache_config(
            kv_cache_configs)
73
74
75

        # gpu_blocks (> 0), cpu_blocks, scheduler_kv_cache_config
        return 1, 0, scheduler_kv_cache_config
76

77
    with (patch.object(V1EngineCore, "_initialize_kv_caches",
78
79
                       _initialize_kv_caches_v1), monkeypatch.context() as m):
        if model_info.v0_only:
80
81
82
            # NOTE(woosuk): skip the test for V0-only models
            return

83
        if model_arch in ("Phi4FlashForCausalLM", "MotifForCausalLM"):
84
85
            pytest.skip(
                "Differential Flash Attention backend has been removed.")
86
87
88
89
        if model_arch == "GptOssForCausalLM":
            # FIXME: A hack to bypass FA3 assertion because our CI's L4 GPU
            # has cc==8.9 which hasn't supported FA3 yet. Remove this hack when
            # L4 supports FA3.
90
            m.setenv("VLLM_ATTENTION_BACKEND", "TRITON_ATTN")
91
92
        if model_arch == "WhisperForConditionalGeneration":
            m.setenv("VLLM_WORKER_MULTIPROC_METHOD", "spawn")
93
        LLM(
94
            model_info.default,
95
96
            tokenizer=model_info.tokenizer,
            tokenizer_mode=model_info.tokenizer_mode,
97
            revision=model_info.revision,
98
99
100
            enforce_eager=model_info.enforce_eager,
            skip_tokenizer_init=model_info.skip_tokenizer_init,
            dtype=model_info.dtype,
101
102
103
104
            speculative_config={
                "model": model_info.speculative_model,
                "num_speculative_tokens": 1,
            } if model_info.speculative_model else None,
105
            trust_remote_code=model_info.trust_remote_code,
106
            max_model_len=model_info.max_model_len,
107
108
            # these tests seem to produce leftover memory
            gpu_memory_utilization=0.80,
109
            load_format="dummy",
110
111
            model_impl="transformers"
            if model_arch in _TRANSFORMERS_BACKEND_MODELS else "vllm",
112
            hf_overrides=hf_overrides_fn,
113
            max_num_seqs=model_info.max_num_seqs)
114
115


116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
@pytest.mark.parametrize("model_arch", MINIMAL_MODEL_ARCH_LIST)
def test_can_initialize_small_subset(model_arch: str,
                                     monkeypatch: pytest.MonkeyPatch):
    """Test initializing small subset of supported models"""
    if model_arch == "Lfm2ForCausalLM":
        pytest.skip("Skipping until test supports V1-only models")
    can_initialize(model_arch, monkeypatch, HF_EXAMPLE_MODELS)


@pytest.mark.parametrize("model_arch", OTHER_MODEL_ARCH_LIST)
def test_can_initialize_large_subset(model_arch: str,
                                     monkeypatch: pytest.MonkeyPatch):
    """Test initializing large subset of supported models
    
    This test covers the complement of the tests covered in the "small subset"
    test.
    """
133
134
    if model_arch == "Lfm2ForCausalLM":
        pytest.skip("Skipping until test supports V1-only models")
135
136
137
138
139
140
141
142
    can_initialize(model_arch, monkeypatch, HF_EXAMPLE_MODELS)


@pytest.mark.parametrize("model_arch",
                         AUTO_EXAMPLE_MODELS.get_supported_archs())
def test_implicit_converted_models(model_arch: str,
                                   monkeypatch: pytest.MonkeyPatch):
    can_initialize(model_arch, monkeypatch, AUTO_EXAMPLE_MODELS)