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
[Model] Explicit `default_pooling_type` interface (#23736)
Signed-off-by: DarkLight1337 <tlleungac@connect.ust.hk>
Cyrus Leung committed
Aug 27, 2025 at 21:24 UTC
5eeef1b90852917b300ed67b98e341eb846ba2e9
11 files changed
+51
-33
vllm/model_executor/models/bert.py
+2
-2
@@ -28,8 +28,8 @@ from vllm.model_executor.pooling_metadata import PoolingMetadata
28
from vllm.sequence import IntermediateTensors
29
from vllm.tasks import PoolingTask
30
31
-from .interfaces import (SupportsCrossEncoding, SupportsQuant,
32
- default_pooling_type)
31
+from .interfaces import SupportsCrossEncoding, SupportsQuant
32
+from .interfaces_base import default_pooling_type
33
from .utils import AutoWeightsLoader, WeightsMapper, maybe_prefix
34
35
vllm/model_executor/models/bert_with_rope.py
+3
-2
@@ -27,13 +27,14 @@ from vllm.model_executor.layers.rotary_embedding import get_rope
27
from vllm.model_executor.layers.vocab_parallel_embedding import (
28
VocabParallelEmbedding)
29
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
30
-from vllm.model_executor.models.interfaces import (SupportsQuant,
31
- default_pooling_type)
30
from vllm.model_executor.models.utils import WeightsMapper
31
from vllm.model_executor.utils import set_weight_attrs
32
from vllm.platforms import current_platform
33
from vllm.sequence import IntermediateTensors
34
35
+from .interfaces import SupportsQuant
36
+from .interfaces_base import default_pooling_type
37
+
38
39
class BertWithRopeEmbedding(nn.Module):
40
vllm/model_executor/models/gritlm.py
+1
-1
@@ -20,7 +20,7 @@ from vllm.sequence import PoolerOutput
20
from vllm.tasks import PoolingTask
21
from vllm.transformers_utils.tokenizer import cached_tokenizer_from_config
22
23
-from .interfaces import default_pooling_type
23
+from .interfaces_base import default_pooling_type
24
25
logger = init_logger(__name__)
26
vllm/model_executor/models/interfaces.py
+1
-18
@@ -3,7 +3,7 @@
3
4
from collections.abc import Iterable, Mapping, MutableSequence
5
from typing import (TYPE_CHECKING, ClassVar, Literal, Optional, Protocol,
6
- TypeVar, Union, overload, runtime_checkable)
6
+ Union, overload, runtime_checkable)
7
8
import numpy as np
9
import torch
@@ -641,23 +641,6 @@ def supports_cross_encoding(
641
return is_pooling_model(model) and _supports_cross_encoding(model)
642
643
644
-_T = TypeVar("_T", bound=type[torch.nn.Module])
645
-
646
-
647
-def default_pooling_type(pooling_type: str):
648
- """Set default_pooling_type decorator. """
649
-
650
- def func(model: _T) -> _T:
651
- model.default_pooling_type = pooling_type # type: ignore
652
- return model
653
-
654
- return func
655
-
656
-
657
-def get_default_pooling_type(model: Union[type[object], object]) -> str:
658
- return getattr(model, "default_pooling_type", "LAST")
659
-
660
-
644
class SupportsQuant:
645
"""The interface required for all models that support quantization."""
646
vllm/model_executor/models/interfaces_base.py
+28
@@ -144,6 +144,17 @@ class VllmModelForPooling(VllmModel[T_co], Protocol[T_co]):
144
MRO of your model class.
145
"""
146
147
+ default_pooling_type: ClassVar[str] = "LAST"
148
+ """
149
+ Indicates the
150
+ [vllm.model_executor.layers.pooler.PoolerConfig.pooling_type][]
151
+ to use by default.
152
+
153
+ You can use the
154
+ [vllm.model_executor.models.interfaces_base.default_pooling_type][]
155
+ decorator to conveniently set this field.
156
+ """
157
+
158
pooler: Pooler
159
"""The pooler is only called on TP rank 0."""
160
@@ -165,3 +176,20 @@ def is_pooling_model(
176
return False
177
178
return getattr(model, "is_pooling_model", False)
179
+
180
+
181
+_T = TypeVar("_T", bound=type[nn.Module])
182
+
183
+
184
+def default_pooling_type(pooling_type: str):
185
+ """Decorator to set `VllmModelForPooling.default_pooling_type`."""
186
+
187
+ def func(model: _T) -> _T:
188
+ model.default_pooling_type = pooling_type # type: ignore
189
+ return model
190
+
191
+ return func
192
+
193
+
194
+def get_default_pooling_type(model: Union[type[object], object]) -> str:
195
+ return getattr(model, "default_pooling_type", "LAST")
vllm/model_executor/models/internlm2.py
+2
-1
@@ -31,7 +31,8 @@ from vllm.model_executor.model_loader.weight_utils import default_weight_loader
31
from vllm.model_executor.sampling_metadata import SamplingMetadata
32
from vllm.sequence import IntermediateTensors
33
34
-from .interfaces import SupportsLoRA, SupportsPP, default_pooling_type
34
+from .interfaces import SupportsLoRA, SupportsPP
35
+from .interfaces_base import default_pooling_type
36
from .utils import (is_pp_missing_parameter,
37
make_empty_intermediate_tensors_factory, make_layers,
38
maybe_prefix)
vllm/model_executor/models/modernbert.py
+2
-1
@@ -26,7 +26,8 @@ from vllm.model_executor.pooling_metadata import PoolingMetadata
26
from vllm.sequence import IntermediateTensors
27
from vllm.tasks import PoolingTask
28
29
-from .interfaces import SupportsCrossEncoding, default_pooling_type
29
+from .interfaces import SupportsCrossEncoding
30
+from .interfaces_base import default_pooling_type
31
from .utils import WeightsMapper, maybe_prefix
32
33
vllm/model_executor/models/prithvi_geospatial_mae.py
+4
-3
@@ -27,9 +27,6 @@ from transformers import BatchFeature
27
from vllm.config import VllmConfig
28
from vllm.model_executor.layers.pooler import DispatchPooler, Pooler
29
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
30
-from vllm.model_executor.models.interfaces import (
31
- IsAttentionFree, MultiModalEmbeddings, SupportsMultiModalWithRawInput,
32
- default_pooling_type)
30
from vllm.model_executor.models.utils import AutoWeightsLoader
31
from vllm.multimodal import MULTIMODAL_REGISTRY
32
from vllm.multimodal.inputs import (ImageItem, ModalityData,
@@ -43,6 +40,10 @@ from vllm.multimodal.processing import (BaseMultiModalProcessor,
40
from vllm.multimodal.profiling import BaseDummyInputsBuilder
41
from vllm.sequence import IntermediateTensors
42
43
+from .interfaces import (IsAttentionFree, MultiModalEmbeddings,
44
+ SupportsMultiModalWithRawInput)
45
+from .interfaces_base import default_pooling_type
46
+
47
48
def _prithvi_field_config(hf_inputs: Mapping[str, torch.Tensor]):
49
# This model receives in input a multi-dimensional tensor representing
vllm/model_executor/models/qwen2_rm.py
+2
-1
@@ -18,7 +18,8 @@ from vllm.model_executor.layers.linear import (ColumnParallelLinear,
18
from vllm.model_executor.layers.pooler import DispatchPooler, Pooler
19
from vllm.sequence import IntermediateTensors
20
21
-from .interfaces import SupportsLoRA, SupportsPP, default_pooling_type
21
+from .interfaces import SupportsLoRA, SupportsPP
22
+from .interfaces_base import default_pooling_type
23
from .qwen2 import Qwen2Model
24
from .utils import AutoWeightsLoader, maybe_prefix
25
vllm/model_executor/models/registry.py
+4
-3
@@ -25,11 +25,12 @@ from vllm.logger import init_logger
25
from vllm.transformers_utils.dynamic_module import (
26
try_get_class_from_dynamic_module)
27
28
-from .interfaces import (get_default_pooling_type, has_inner_state, has_noops,
29
- is_attention_free, is_hybrid, supports_cross_encoding,
28
+from .interfaces import (has_inner_state, has_noops, is_attention_free,
29
+ is_hybrid, supports_cross_encoding,
30
supports_multimodal, supports_multimodal_raw_input,
31
supports_pp, supports_transcription, supports_v0_only)
32
-from .interfaces_base import is_pooling_model, is_text_generation_model
32
+from .interfaces_base import (get_default_pooling_type, is_pooling_model,
33
+ is_text_generation_model)
34
35
logger = init_logger(__name__)
36
vllm/model_executor/models/roberta.py
+2
-1
@@ -22,7 +22,8 @@ from vllm.model_executor.models.utils import (AutoWeightsLoader, WeightsMapper,
22
from vllm.sequence import IntermediateTensors
23
24
from .bert_with_rope import BertWithRope, JinaRobertaModel
25
-from .interfaces import SupportsCrossEncoding, default_pooling_type
25
+from .interfaces import SupportsCrossEncoding
26
+from .interfaces_base import default_pooling_type
27
28
29
class RobertaEmbedding(nn.Module):