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 10, 12:45 UTC
[Chore] Further cleanup pooler (#31951)
Signed-off-by: DarkLight1337 <tlleungac@connect.ust.hk>
Cyrus Leung committed
Jan 8, 2026 at 18:16 UTC
d1b6fe007f1fd5afb5533a25dd188e1363a119ac
7 files changed
+47
-62
tests/model_executor/test_model_load_with_params.py
+3
-8
@@ -5,12 +5,7 @@ import os
5
6
import pytest
7
8
-from vllm.model_executor.layers.pooler import (
9
- CLSPool,
10
- DispatchPooler,
11
- MeanPool,
12
- PoolingType,
13
-)
8
+from vllm.model_executor.layers.pooler import CLSPool, DispatchPooler, MeanPool
9
from vllm.model_executor.models.bert import BertEmbeddingModel
10
from vllm.model_executor.models.roberta import RobertaEmbeddingModel
11
from vllm.platforms import current_platform
@@ -50,7 +45,7 @@ def test_model_loading_with_params(vllm_runner, monkeypatch):
45
assert model_config.encoder_config["do_lower_case"]
46
47
# asserts on the pooling config files
53
- assert model_config.pooler_config.pooling_type == PoolingType.CLS.name
48
+ assert model_config.pooler_config.pooling_type == "CLS"
49
assert model_config.pooler_config.normalize
50
51
# asserts on the tokenizer loaded
@@ -94,7 +89,7 @@ def test_roberta_model_loading_with_params(vllm_runner, monkeypatch):
89
assert not model_config.encoder_config["do_lower_case"]
90
91
# asserts on the pooling config files
97
- assert model_config.pooler_config.pooling_type == PoolingType.MEAN.name
92
+ assert model_config.pooler_config.pooling_type == "MEAN"
93
assert model_config.pooler_config.normalize
94
95
# asserts on the tokenizer loaded
tests/test_config.py
+1
-2
@@ -25,7 +25,6 @@ from vllm.config.vllm import (
25
OPTIMIZATION_LEVEL_TO_CONFIG,
26
OptimizationLevel,
27
)
28
-from vllm.model_executor.layers.pooler import PoolingType
28
from vllm.platforms import current_platform
29
30
@@ -162,7 +161,7 @@ def test_get_pooling_config():
161
162
assert model_config.pooler_config is not None
163
assert model_config.pooler_config.normalize
165
- assert model_config.pooler_config.pooling_type == PoolingType.MEAN.name
164
+ assert model_config.pooler_config.pooling_type == "MEAN"
165
166
167
@pytest.mark.skipif(
vllm/config/pooler.py
+1
-2
@@ -21,8 +21,7 @@ class PoolerConfig:
21
22
pooling_type: PoolingTypeStr | None = None
23
"""
24
- The pooling method of the pooling model. This should be a key in
25
- [`vllm.model_executor.layers.pooler.PoolingType`][].
24
+ The pooling method of the pooling model.
25
"""
26
27
## for embeddings models
vllm/model_executor/layers/pooler.py
+38
-44
@@ -3,7 +3,6 @@
3
from abc import ABC, abstractmethod
4
from collections.abc import Callable, Mapping, Set
5
from dataclasses import dataclass
6
-from enum import IntEnum
6
from itertools import groupby
7
from typing import TypeAlias, TypeVar
8
@@ -12,13 +11,14 @@ import torch.nn as nn
11
import torch.nn.functional as F
12
from transformers import PretrainedConfig
13
15
-from vllm.config import ModelConfig, PoolerConfig, get_current_vllm_config
14
+from vllm.config import ModelConfig, get_current_vllm_config
15
+from vllm.config.pooler import PoolerConfig, PoolingTypeStr
16
from vllm.logger import init_logger
17
from vllm.model_executor.models.adapters import _load_st_projector
18
from vllm.pooling_params import PoolingParams
19
from vllm.tasks import PoolingTask
20
from vllm.utils.import_utils import resolve_obj_by_qualname
21
-from vllm.v1.outputs import PoolerOutput, TokenPoolerOutput, TokensPoolerOutput
21
+from vllm.v1.outputs import PoolerOutput, TokenPoolerOutput, TokenwisePoolerOutput
22
from vllm.v1.pool.metadata import PoolingMetadata
23
24
logger = init_logger(__name__)
@@ -31,27 +31,17 @@ ClassifierFn = Callable[[torch.Tensor], torch.Tensor]
31
32
33
TokenPoolingMethodOutput: TypeAlias = torch.Tensor | list[torch.Tensor]
34
-TokensPoolingMethodOutput: TypeAlias = list[torch.Tensor] | list[torch.Tensor | None]
35
-TokensPoolingMethodOutputItem: TypeAlias = torch.Tensor | None
36
-PoolingMethodOutput: TypeAlias = TokenPoolingMethodOutput | TokensPoolingMethodOutput
34
+TokenwisePoolingMethodOutput: TypeAlias = list[torch.Tensor] | list[torch.Tensor | None]
35
+TokenwisePoolingMethodOutputItem: TypeAlias = torch.Tensor | None
36
+PoolingMethodOutput: TypeAlias = TokenPoolingMethodOutput | TokenwisePoolingMethodOutput
37
38
TokenPoolerHeadOutput: TypeAlias = torch.Tensor | list[torch.Tensor]
39
-TokensPoolerHeadOutput: TypeAlias = torch.Tensor | None
40
-
41
-
42
-class PoolingType(IntEnum):
43
- """Enumeration for different types of pooling methods."""
44
-
45
- LAST = 0
46
- ALL = 1
47
- CLS = 2
48
- STEP = 3
49
- MEAN = 4
39
+TokenwisePoolerHeadOutput: TypeAlias = torch.Tensor | None
40
41
42
@dataclass(frozen=True)
43
class ResolvedPoolingConfig:
54
- pooling_type: PoolingType
44
+ pooling_type: PoolingTypeStr
45
task: PoolingTask
46
47
@classmethod
@@ -61,7 +51,7 @@ class ResolvedPoolingConfig:
51
pooler_config: PoolerConfig,
52
) -> "ResolvedPoolingConfig":
53
assert pooler_config.pooling_type is not None
64
- return cls(task=task, pooling_type=PoolingType[pooler_config.pooling_type])
54
+ return cls(task=task, pooling_type=pooler_config.pooling_type)
55
56
57
@dataclass(frozen=True)
@@ -112,17 +102,22 @@ def get_cross_encoder_activation_function(config: PretrainedConfig):
102
103
class PoolingMethod(nn.Module, ABC):
104
@staticmethod
115
- def from_pooling_type(pooling_type: PoolingType) -> "PoolingMethod":
116
- if pooling_type == PoolingType.LAST:
105
+ def from_pooling_type(pooling_type: PoolingTypeStr) -> "PoolingMethod":
106
+ if pooling_type == "LAST":
107
return LastPool()
118
- if pooling_type == PoolingType.ALL:
108
+ if pooling_type == "ALL":
109
return AllPool()
120
- if pooling_type == PoolingType.CLS:
110
+ if pooling_type == "CLS":
111
return CLSPool()
122
- if pooling_type == PoolingType.MEAN:
112
+ if pooling_type == "MEAN":
113
return MeanPool()
114
+ if pooling_type == "STEP":
115
+ raise ValueError(
116
+ "'STEP' pooling is handled by StepPooler "
117
+ "and is not a standalone PoolingMethod."
118
+ )
119
125
- raise NotImplementedError(f"Unsupported method: {pooling_type}")
120
+ raise NotImplementedError(f"Unsupported method: {pooling_type!r}")
121
122
@abstractmethod
123
def get_supported_tasks(self) -> Set[PoolingTask]:
@@ -186,13 +181,12 @@ class AllPool(PoolingMethod):
181
self,
182
hidden_states: torch.Tensor,
183
pooling_metadata: PoolingMetadata,
189
- ) -> TokensPoolingMethodOutput:
184
+ ) -> TokenwisePoolingMethodOutput:
185
pooling_cursor = pooling_metadata.get_pooling_cursor()
191
- is_finished = pooling_cursor.is_finished()
192
- hidden_states_lst = list(
193
- hidden_states.split(pooling_cursor.num_scheduled_tokens_cpu.tolist())
186
+ hidden_states_all = hidden_states.split(
187
+ pooling_cursor.num_scheduled_tokens_cpu.tolist()
188
)
195
- hidden_states_lst = [hidden_states_lst[i] for i in pooling_cursor.index]
189
+ hidden_states_lst = [hidden_states_all[i] for i in pooling_cursor.index]
190
191
if not self.enable_chunked_prefill:
192
return hidden_states_lst
@@ -206,7 +200,7 @@ class AllPool(PoolingMethod):
200
201
# 2. Once prefill is finished, send hidden_states_cache to PoolerHead
202
output_list = list[torch.Tensor | None]()
209
- for p, finished in zip(pooling_states, is_finished):
203
+ for p, finished in zip(pooling_states, pooling_cursor.is_finished()):
204
if finished:
205
hidden_states_cache = p.hidden_states_cache
206
if len(hidden_states_cache) == 1:
@@ -620,19 +614,19 @@ class ClassifierPooler(Pooler):
614
return scores
615
616
623
-class TokensPoolerHead(nn.Module, ABC):
617
+class TokenwisePoolerHead(nn.Module, ABC):
618
"""Applicable to pooling strategies that output multiple tokens."""
619
620
@abstractmethod
621
def forward(
622
self,
629
- pooled_data: TokensPoolingMethodOutputItem,
623
+ pooled_data: TokenwisePoolingMethodOutputItem,
624
pooling_param: PoolingParams,
631
- ) -> TokensPoolerHeadOutput:
625
+ ) -> TokenwisePoolerHeadOutput:
626
raise NotImplementedError
627
628
635
-class TokenEmbeddingPoolerHead(TokensPoolerHead):
629
+class TokenEmbeddingPoolerHead(TokenwisePoolerHead):
630
def __init__(self) -> None:
631
super().__init__()
632
@@ -647,9 +641,9 @@ class TokenEmbeddingPoolerHead(TokensPoolerHead):
641
642
def forward(
643
self,
650
- pooled_data: TokensPoolingMethodOutputItem,
644
+ pooled_data: TokenwisePoolingMethodOutputItem,
645
pooling_param: PoolingParams,
652
- ) -> TokensPoolerHeadOutput:
646
+ ) -> TokenwisePoolerHeadOutput:
647
# for unfinished chunked prefill
648
if pooled_data is None:
649
return None
@@ -673,7 +667,7 @@ class TokenEmbeddingPoolerHead(TokensPoolerHead):
667
return pooled_data
668
669
676
-class TokenClassifierPoolerHead(TokensPoolerHead):
670
+class TokenClassifierPoolerHead(TokenwisePoolerHead):
671
def __init__(
672
self,
673
classifier: ClassifierFn | None,
@@ -695,9 +689,9 @@ class TokenClassifierPoolerHead(TokensPoolerHead):
689
690
def forward(
691
self,
698
- pooled_data: TokensPoolingMethodOutputItem,
692
+ pooled_data: TokenwisePoolingMethodOutputItem,
693
pooling_param: PoolingParams,
700
- ) -> TokensPoolerHeadOutput:
694
+ ) -> TokenwisePoolerHeadOutput:
695
# for unfinished chunked prefill
696
if pooled_data is None:
697
return None
@@ -722,7 +716,7 @@ class TokenClassifierPoolerHead(TokensPoolerHead):
716
717
718
class AllPooler(Pooler):
725
- def __init__(self, head: TokensPoolerHead) -> None:
719
+ def __init__(self, head: TokenwisePoolerHead) -> None:
720
super().__init__()
721
722
self.pooling = AllPool()
@@ -735,7 +729,7 @@ class AllPooler(Pooler):
729
self,
730
hidden_states: torch.Tensor,
731
pooling_metadata: PoolingMetadata,
738
- ) -> TokensPoolerOutput:
732
+ ) -> TokenwisePoolerOutput:
733
pooled_data = self.pooling(hidden_states, pooling_metadata)
734
pooling_params = pooling_metadata.pooling_params
735
assert len(pooled_data) == len(pooling_params)
@@ -744,7 +738,7 @@ class AllPooler(Pooler):
738
739
740
class StepPooler(Pooler):
747
- def __init__(self, head: TokensPoolerHead) -> None:
741
+ def __init__(self, head: TokenwisePoolerHead) -> None:
742
super().__init__()
743
744
self.pooling = AllPool()
@@ -790,7 +784,7 @@ class StepPooler(Pooler):
784
self,
785
hidden_states: torch.Tensor,
786
pooling_metadata: PoolingMetadata,
793
- ) -> TokensPoolerOutput:
787
+ ) -> TokenwisePoolerOutput:
788
pooled_data = self.extract_states(hidden_states, pooling_metadata)
789
pooling_params = pooling_metadata.pooling_params
790
assert len(pooled_data) == len(pooling_params)
vllm/model_executor/models/bert.py
+1
-2
@@ -23,7 +23,6 @@ from vllm.model_executor.layers.pooler import (
23
Pooler,
24
PoolingMethod,
25
PoolingParamsUpdate,
26
- PoolingType,
26
TokenPoolerHeadOutput,
27
TokenPoolingMethodOutput,
28
)
@@ -90,7 +89,7 @@ class BertPooler(Pooler):
89
def __init__(self, config: BertConfig):
90
super().__init__()
91
93
- self.pooling = PoolingMethod.from_pooling_type(PoolingType.CLS)
92
+ self.pooling = PoolingMethod.from_pooling_type("CLS")
93
self.dense = nn.Linear(config.hidden_size, config.hidden_size)
94
self.activation = nn.Tanh()
95
vllm/model_executor/models/modernbert.py
+1
-2
@@ -18,7 +18,6 @@ from vllm.model_executor.layers.pooler import (
18
Pooler,
19
PoolingMethod,
20
PoolingParamsUpdate,
21
- PoolingType,
21
TokenPoolerHeadOutput,
22
TokenPoolingMethodOutput,
23
)
@@ -287,7 +286,7 @@ class ModernBertPooler(Pooler):
286
def __init__(self, config: ModernBertConfig):
287
super().__init__()
288
290
- pooling_type = PoolingType[config.classifier_pooling.upper()]
289
+ pooling_type = config.classifier_pooling.upper()
290
self.pooling = PoolingMethod.from_pooling_type(pooling_type)
291
self.dense = nn.Linear(
292
config.hidden_size, config.hidden_size, config.classifier_bias
vllm/v1/outputs.py
+2
-2
@@ -92,8 +92,8 @@ class LogprobsTensors(NamedTuple):
92
# [num_reqs, <dynamic>]
93
# The shape of each element depends on the pooler used
94
TokenPoolerOutput: TypeAlias = torch.Tensor | list[torch.Tensor]
95
-TokensPoolerOutput: TypeAlias = list[torch.Tensor] | list[torch.Tensor | None]
96
-PoolerOutput: TypeAlias = TokenPoolerOutput | TokensPoolerOutput
95
+TokenwisePoolerOutput: TypeAlias = list[torch.Tensor] | list[torch.Tensor | None]
96
+PoolerOutput: TypeAlias = TokenPoolerOutput | TokenwisePoolerOutput
97
98
99
@dataclass