A high-throughput and memory-efficient inference and serving engine for LLMs
Mirrored from https://github.com/tduncan-lum/Nvidia-Optimization-Stack---VLLM.git
Synced Nov 15, 21:00 UTC
[V1]`SupportsV0Only` protocol for model definitions (#13959)
Signed-off-by: Roger Wang <ywang@roblox.com>
Roger Wang committed
Feb 27, 2025 at 17:02 UTC
6c85da3a1859cbd4bc3cd76fc7210a33af077264
19 files changed
+93
-32
vllm/config.py
+5
@@ -1039,6 +1039,11 @@ class ModelConfig:
1039
def runner_type(self) -> RunnerType:
1040
return _TASK_RUNNER[self.task]
1041
1042
+ @property
1043
+ def is_v1_compatible(self) -> bool:
1044
+ architectures = getattr(self.hf_config, "architectures", [])
1045
+ return ModelRegistry.is_v1_compatible(architectures)
1046
+
1047
1048
class CacheConfig:
1049
"""Configuration for the KV cache.
vllm/model_executor/models/__init__.py
+5
-2
@@ -1,8 +1,9 @@
1
# SPDX-License-Identifier: Apache-2.0
2
3
from .interfaces import (HasInnerState, SupportsLoRA, SupportsMultiModal,
4
- SupportsPP, has_inner_state, supports_lora,
5
- supports_multimodal, supports_pp)
4
+ SupportsPP, SupportsV0Only, has_inner_state,
5
+ supports_lora, supports_multimodal, supports_pp,
6
+ supports_v0_only)
7
from .interfaces_base import (VllmModelForPooling, VllmModelForTextGeneration,
8
is_pooling_model, is_text_generation_model)
9
from .registry import ModelRegistry
@@ -21,4 +22,6 @@ __all__ = [
22
"supports_multimodal",
23
"SupportsPP",
24
"supports_pp",
25
+ "SupportsV0Only",
26
+ "supports_v0_only",
27
]
vllm/model_executor/models/bamba.py
+3
-2
@@ -32,7 +32,8 @@ from vllm.model_executor.sampling_metadata import SamplingMetadata
32
from vllm.sequence import IntermediateTensors
33
from vllm.utils import LayerBlockType
34
35
-from .interfaces import HasInnerState, IsHybrid, SupportsLoRA, SupportsPP
35
+from .interfaces import (HasInnerState, IsHybrid, SupportsLoRA, SupportsPP,
36
+ SupportsV0Only)
37
from .utils import (is_pp_missing_parameter,
38
make_empty_intermediate_tensors_factory, make_layers,
39
maybe_prefix)
@@ -366,7 +367,7 @@ class BambaModel(nn.Module):
367
368
369
class BambaForCausalLM(nn.Module, HasInnerState, SupportsLoRA, SupportsPP,
369
- IsHybrid):
370
+ IsHybrid, SupportsV0Only):
371
packed_modules_mapping = {
372
"qkv_proj": [
373
"q_proj",
vllm/model_executor/models/bart.py
+2
-1
@@ -43,6 +43,7 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
43
from vllm.model_executor.sampling_metadata import SamplingMetadata
44
from vllm.sequence import IntermediateTensors
45
46
+from .interfaces import SupportsV0Only
47
from .utils import maybe_prefix
48
49
logger = logging.get_logger(__name__)
@@ -776,7 +777,7 @@ class BartModel(nn.Module):
777
return decoder_outputs
778
779
779
-class BartForConditionalGeneration(nn.Module):
780
+class BartForConditionalGeneration(nn.Module, SupportsV0Only):
781
base_model_prefix = "model"
782
783
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
vllm/model_executor/models/bert.py
+2
-2
@@ -26,7 +26,7 @@ from vllm.sequence import IntermediateTensors, PoolerOutput
26
from vllm.transformers_utils.config import (
27
get_cross_encoder_activation_function)
28
29
-from .interfaces import SupportsCrossEncoding
29
+from .interfaces import SupportsCrossEncoding, SupportsV0Only
30
from .utils import WeightsMapper, maybe_prefix
31
32
@@ -385,7 +385,7 @@ class BertModel(nn.Module):
385
return loaded_params
386
387
388
-class BertEmbeddingModel(nn.Module):
388
+class BertEmbeddingModel(nn.Module, SupportsV0Only):
389
"""A model that uses Bert to provide embedding functionalities.
390
391
This class encapsulates the BertModel and provides an interface for
vllm/model_executor/models/florence2.py
+2
-2
@@ -29,7 +29,7 @@ from vllm.multimodal.processing import (BaseProcessingInfo,
29
from vllm.multimodal.profiling import BaseDummyInputsBuilder, ProcessorInputs
30
from vllm.sequence import IntermediateTensors
31
32
-from .interfaces import SupportsMultiModal
32
+from .interfaces import SupportsMultiModal, SupportsV0Only
33
from .utils import AutoWeightsLoader, flatten_bn, merge_multimodal_embeddings
34
35
@@ -651,7 +651,7 @@ class Florence2LanguageModel(nn.Module):
651
return decoder_outputs
652
653
654
-class Florence2LanguageForConditionalGeneration(nn.Module):
654
+class Florence2LanguageForConditionalGeneration(nn.Module, SupportsV0Only):
655
656
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
657
super().__init__()
vllm/model_executor/models/gritlm.py
+3
-1
@@ -19,6 +19,8 @@ from vllm.sequence import (IntermediateTensors, PoolerOutput,
19
PoolingSequenceGroupOutput)
20
from vllm.transformers_utils.tokenizer import cached_tokenizer_from_config
21
22
+from .interfaces import SupportsV0Only
23
+
24
logger = init_logger(__name__)
25
26
@@ -177,7 +179,7 @@ class GritLMPooler(nn.Module):
179
return PoolerOutput(outputs=pooled_outputs)
180
181
180
-class GritLM(LlamaForCausalLM):
182
+class GritLM(LlamaForCausalLM, SupportsV0Only):
183
"""This class implements the embedding model for parasail-ai/GritLM-7B-vllm.
184
185
The class inherits from LlamaForCausalLM and provides a custom pooling
vllm/model_executor/models/interfaces.py
+26
@@ -498,3 +498,29 @@ def supports_transcription(
498
return isinstance(model, SupportsTranscription)
499
500
return isinstance(model, SupportsTranscription)
501
+
502
+
503
+@runtime_checkable
504
+class SupportsV0Only(Protocol):
505
+ """Models with this interface are not compatible with V1 vLLM."""
506
+
507
+ supports_v0_only: ClassVar[Literal[True]] = True
508
+
509
+
510
+@overload
511
+def supports_v0_only(model: Type[object]) -> TypeIs[Type[SupportsV0Only]]:
512
+ ...
513
+
514
+
515
+@overload
516
+def supports_v0_only(model: object) -> TypeIs[SupportsV0Only]:
517
+ ...
518
+
519
+
520
+def supports_v0_only(
521
+ model: Union[Type[object], object],
522
+) -> Union[TypeIs[Type[SupportsV0Only]], TypeIs[SupportsV0Only]]:
523
+ if isinstance(model, type):
524
+ return isinstance(model, SupportsV0Only)
525
+
526
+ return isinstance(model, SupportsV0Only)
vllm/model_executor/models/jamba.py
+3
-2
@@ -30,7 +30,8 @@ from vllm.model_executor.sampling_metadata import SamplingMetadata
30
from vllm.sequence import IntermediateTensors, PoolerOutput
31
from vllm.utils import LayerBlockType
32
33
-from .interfaces import HasInnerState, IsHybrid, SupportsLoRA, SupportsPP
33
+from .interfaces import (HasInnerState, IsHybrid, SupportsLoRA, SupportsPP,
34
+ SupportsV0Only)
35
from .utils import (is_pp_missing_parameter,
36
make_empty_intermediate_tensors_factory, make_layers,
37
maybe_prefix)
@@ -353,7 +354,7 @@ class JambaModel(nn.Module):
354
355
356
class JambaForCausalLM(nn.Module, HasInnerState, SupportsLoRA, SupportsPP,
356
- IsHybrid):
357
+ IsHybrid, SupportsV0Only):
358
packed_modules_mapping = {
359
"qkv_proj": [
360
"q_proj",
vllm/model_executor/models/mamba.py
+4
-2
@@ -19,7 +19,8 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
19
DEFAULT_VOCAB_PADDING_SIZE, ParallelLMHead, VocabParallelEmbedding)
20
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
21
from vllm.model_executor.models.interfaces import (HasInnerState,
22
- IsAttentionFree, SupportsPP)
22
+ IsAttentionFree, SupportsPP,
23
+ SupportsV0Only)
24
from vllm.model_executor.models.mamba_cache import (MambaCacheManager,
25
MambaCacheParams)
26
from vllm.model_executor.sampling_metadata import SamplingMetadata
@@ -155,7 +156,8 @@ class MambaModel(nn.Module):
156
return hidden_states
157
158
158
-class MambaForCausalLM(nn.Module, HasInnerState, IsAttentionFree, SupportsPP):
159
+class MambaForCausalLM(nn.Module, HasInnerState, IsAttentionFree, SupportsPP,
160
+ SupportsV0Only):
161
162
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
163
config = vllm_config.model_config.hf_config
vllm/model_executor/models/mamba2.py
+4
-2
@@ -22,7 +22,8 @@ from vllm.model_executor.layers.vocab_parallel_embedding import (
22
DEFAULT_VOCAB_PADDING_SIZE, ParallelLMHead, VocabParallelEmbedding)
23
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
24
from vllm.model_executor.models.interfaces import (HasInnerState,
25
- IsAttentionFree)
25
+ IsAttentionFree,
26
+ SupportsV0Only)
27
from vllm.model_executor.models.mamba_cache import (MambaCacheManager,
28
MambaCacheParams)
29
from vllm.model_executor.sampling_metadata import SamplingMetadata
@@ -174,7 +175,8 @@ class Mamba2Model(nn.Module):
175
return hidden_states
176
177
177
-class Mamba2ForCausalLM(nn.Module, HasInnerState, IsAttentionFree):
178
+class Mamba2ForCausalLM(nn.Module, HasInnerState, IsAttentionFree,
179
+ SupportsV0Only):
180
181
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
182
config = vllm_config.model_config.hf_config
vllm/model_executor/models/minicpmv.py
+4
-2
@@ -63,7 +63,8 @@ from vllm.platforms import current_platform
63
from vllm.sequence import IntermediateTensors
64
65
from .idefics2_vision_model import Idefics2VisionTransformer
66
-from .interfaces import SupportsLoRA, SupportsMultiModal, SupportsPP
66
+from .interfaces import (SupportsLoRA, SupportsMultiModal, SupportsPP,
67
+ SupportsV0Only)
68
from .utils import AutoWeightsLoader, maybe_prefix
69
70
CPU_DEVICE = torch.device("cpu")
@@ -804,7 +805,8 @@ class MiniCPMVMultiModalProcessor(BaseMultiModalProcessor[_I]):
805
return result
806
807
807
-class MiniCPMVBaseModel(nn.Module, SupportsMultiModal, SupportsPP):
808
+class MiniCPMVBaseModel(nn.Module, SupportsMultiModal, SupportsPP,
809
+ SupportsV0Only):
810
"""
811
The abstract class of MiniCPMV can only be inherited, but cannot be
812
instantiated.
vllm/model_executor/models/mllama.py
+3
-2
@@ -63,7 +63,7 @@ from vllm.multimodal.processing import (BaseProcessingInfo,
63
from vllm.multimodal.profiling import BaseDummyInputsBuilder, ProcessorInputs
64
65
from .clip import CLIPMLP
66
-from .interfaces import SupportsMultiModal
66
+from .interfaces import SupportsMultiModal, SupportsV0Only
67
from .llama import LlamaDecoderLayer, LlamaMLP
68
from .utils import maybe_prefix
69
@@ -1128,7 +1128,8 @@ class MllamaForCausalLM(nn.Module):
1128
@MULTIMODAL_REGISTRY.register_processor(MllamaMultiModalProcessor,
1129
info=MllamaProcessingInfo,
1130
dummy_inputs=MllamaDummyInputsBuilder)
1131
-class MllamaForConditionalGeneration(nn.Module, SupportsMultiModal):
1131
+class MllamaForConditionalGeneration(nn.Module, SupportsMultiModal,
1132
+ SupportsV0Only):
1133
packed_modules_mapping = {
1134
"qkv_proj": ["q_proj", "k_proj", "v_proj"],
1135
"gate_up_proj": ["gate_proj", "up_proj"]
vllm/model_executor/models/paligemma.py
+2
-2
@@ -18,7 +18,7 @@ from vllm.multimodal.inputs import NestedTensors
18
from vllm.sequence import IntermediateTensors
19
from vllm.transformers_utils.tokenizer import cached_tokenizer_from_config
20
21
-from .interfaces import SupportsMultiModal, SupportsPP
21
+from .interfaces import SupportsMultiModal, SupportsPP, SupportsV0Only
22
from .siglip import (SiglipVisionModel, dummy_image_for_siglip,
23
dummy_seq_data_for_siglip, get_max_siglip_image_tokens)
24
from .utils import (AutoWeightsLoader, init_vllm_registered_model,
@@ -136,7 +136,7 @@ class PaliGemmaMultiModalProjector(nn.Module):
136
@INPUT_REGISTRY.register_dummy_data(dummy_data_for_paligemma)
137
@INPUT_REGISTRY.register_input_processor(input_processor_for_paligemma)
138
class PaliGemmaForConditionalGeneration(nn.Module, SupportsMultiModal,
139
- SupportsPP):
139
+ SupportsPP, SupportsV0Only):
140
packed_modules_mapping = {
141
"qkv_proj": [
142
"q_proj",
vllm/model_executor/models/prithvi_geospatial_mae.py
+4
-2
@@ -25,7 +25,8 @@ from transformers import BatchFeature
25
from vllm.config import VllmConfig
26
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
27
from vllm.model_executor.models.interfaces import (IsAttentionFree,
28
- SupportsMultiModal)
28
+ SupportsMultiModal,
29
+ SupportsV0Only)
30
from vllm.model_executor.models.utils import AutoWeightsLoader
31
from vllm.model_executor.pooling_metadata import PoolingMetadata
32
from vllm.multimodal import MULTIMODAL_REGISTRY
@@ -111,7 +112,8 @@ class PrithviGeoSpatialMAEMultiModalProcessor(BaseMultiModalProcessor):
112
PrithviGeoSpatialMAEMultiModalProcessor,
113
info=PrithviGeoSpatialMAEProcessingInfo,
114
dummy_inputs=PrithviGeoSpatialMAEInputBuilder)
114
-class PrithviGeoSpatialMAE(nn.Module, IsAttentionFree, SupportsMultiModal):
115
+class PrithviGeoSpatialMAE(nn.Module, IsAttentionFree, SupportsMultiModal,
116
+ SupportsV0Only):
117
""" Prithvi Masked Autoencoder"""
118
119
def _instantiate_model(self, config: dict) -> Optional[nn.Module]:
vllm/model_executor/models/qwen2_rm.py
+3
-2
@@ -17,7 +17,7 @@ from vllm.model_executor.layers.pooler import Pooler, PoolingType, SimplePooler
17
from vllm.model_executor.pooling_metadata import PoolingMetadata
18
from vllm.sequence import IntermediateTensors, PoolerOutput
19
20
-from .interfaces import SupportsLoRA, SupportsPP
20
+from .interfaces import SupportsLoRA, SupportsPP, SupportsV0Only
21
from .qwen2 import Qwen2Model
22
from .utils import AutoWeightsLoader, maybe_prefix
23
@@ -33,7 +33,8 @@ class ReLU(nn.Module):
33
return self.activation(input)
34
35
36
-class Qwen2RewardBaseModel(nn.Module, SupportsLoRA, SupportsPP):
36
+class Qwen2RewardBaseModel(nn.Module, SupportsLoRA, SupportsPP,
37
+ SupportsV0Only):
38
packed_modules_mapping = {
39
"qkv_proj": [
40
"q_proj",
vllm/model_executor/models/registry.py
+12
-2
@@ -22,7 +22,7 @@ from vllm.logger import init_logger
22
23
from .interfaces import (has_inner_state, is_attention_free, is_hybrid,
24
supports_cross_encoding, supports_multimodal,
25
- supports_pp, supports_transcription)
25
+ supports_pp, supports_transcription, supports_v0_only)
26
from .interfaces_base import is_text_generation_model
27
28
logger = init_logger(__name__)
@@ -228,6 +228,7 @@ class _ModelInfo:
228
is_attention_free: bool
229
is_hybrid: bool
230
supports_transcription: bool
231
+ supports_v0_only: bool
232
233
@staticmethod
234
def from_model_cls(model: Type[nn.Module]) -> "_ModelInfo":
@@ -241,7 +242,9 @@ class _ModelInfo:
242
has_inner_state=has_inner_state(model),
243
is_attention_free=is_attention_free(model),
244
is_hybrid=is_hybrid(model),
244
- supports_transcription=supports_transcription(model))
245
+ supports_transcription=supports_transcription(model),
246
+ supports_v0_only=supports_v0_only(model),
247
+ )
248
249
250
class _BaseRegisteredModel(ABC):
@@ -504,6 +507,13 @@ class _ModelRegistry:
507
model_cls, _ = self.inspect_model_cls(architectures)
508
return model_cls.supports_transcription
509
510
+ def is_v1_compatible(
511
+ self,
512
+ architectures: Union[str, List[str]],
513
+ ) -> bool:
514
+ model_cls, _ = self.inspect_model_cls(architectures)
515
+ return not model_cls.supports_v0_only
516
+
517
518
ModelRegistry = _ModelRegistry({
519
model_arch:
vllm/model_executor/models/roberta.py
+3
-2
@@ -19,7 +19,7 @@ from vllm.sequence import IntermediateTensors, PoolerOutput
19
from vllm.transformers_utils.config import (
20
get_cross_encoder_activation_function)
21
22
-from .interfaces import SupportsCrossEncoding
22
+from .interfaces import SupportsCrossEncoding, SupportsV0Only
23
24
25
def roberta_task_weights_filter(
@@ -191,7 +191,8 @@ class RobertaEmbeddingModel(BertEmbeddingModel):
191
assert len(loaded), "Unable to load RobertaEmbeddingModel"
192
193
194
-class RobertaForSequenceClassification(nn.Module, SupportsCrossEncoding):
194
+class RobertaForSequenceClassification(nn.Module, SupportsCrossEncoding,
195
+ SupportsV0Only):
196
"""A model that uses Roberta to provide embedding functionalities.
197
198
This class encapsulates the BertModel and provides an interface for
vllm/model_executor/models/whisper.py
+3
-2
@@ -34,7 +34,8 @@ from vllm.multimodal.processing import (BaseProcessingInfo,
34
PromptReplacement, PromptUpdate)
35
from vllm.multimodal.profiling import BaseDummyInputsBuilder, ProcessorInputs
36
37
-from .interfaces import SupportsMultiModal, SupportsTranscription
37
+from .interfaces import (SupportsMultiModal, SupportsTranscription,
38
+ SupportsV0Only)
39
from .utils import (AutoWeightsLoader, WeightsMapper, cast_overflow_tensors,
40
make_layers)
41
@@ -643,7 +644,7 @@ class WhisperMultiModalProcessor(
644
info=WhisperProcessingInfo,
645
dummy_inputs=WhisperDummyInputsBuilder)
646
class WhisperForConditionalGeneration(nn.Module, SupportsTranscription,
646
- SupportsMultiModal):
647
+ SupportsMultiModal, SupportsV0Only):
648
packed_modules_mapping = {
649
"self_attn.qkv_proj": [
650
"self_attn.q_proj",