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
[Bugfix] Fix ModernBert cuda graph capturing in v1 (#21901)
Signed-off-by: Isotr0py <mozf@mail2.sysu.edu.cn> Signed-off-by: Isotr0py <2037008807@qq.com>
Isotr0py committed
Aug 9, 2025 at 13:17 UTC
429e4e2d420f7c648d37b7d90430f5df6a7dc61f
5 files changed
+39
-42
tests/models/language/pooling/mteb_utils.py
+3
-2
@@ -162,7 +162,8 @@ def mteb_test_embed_models(hf_runner,
162
vllm_runner,
163
model_info: EmbedModelInfo,
164
vllm_extra_kwargs=None,
165
- hf_model_callback=None):
165
+ hf_model_callback=None,
166
+ atol=MTEB_RERANK_TOL):
167
if not model_info.enable_test:
168
# A model family has many models with the same architecture,
169
# and we don't need to test each one.
@@ -198,7 +199,7 @@ def mteb_test_embed_models(hf_runner,
199
print("SentenceTransformers:", st_dtype, st_main_score)
200
print("Difference:", st_main_score - vllm_main_score)
201
201
- assert st_main_score == pytest.approx(vllm_main_score, abs=MTEB_EMBED_TOL)
202
+ assert st_main_score == pytest.approx(vllm_main_score, abs=atol)
203
204
205
def run_mteb_rerank(cross_encoder, tasks, languages):
vllm/model_executor/models/bert.py
+1
-1
@@ -466,7 +466,7 @@ class BertEmbeddingModel(nn.Module, SupportsQuant):
466
467
def forward(
468
self,
469
- input_ids: Optional[torch.Tensor],
469
+ input_ids: torch.Tensor,
470
positions: torch.Tensor,
471
token_type_ids: Optional[torch.Tensor] = None,
472
intermediate_tensors: Optional[IntermediateTensors] = None,
vllm/model_executor/models/bert_with_rope.py
+21
-25
@@ -8,13 +8,15 @@ from torch import nn
8
from transformers import PretrainedConfig
9
10
from vllm.attention import Attention, AttentionType
11
+from vllm.compilation.decorators import support_torch_compile
12
from vllm.config import CacheConfig, VllmConfig
13
from vllm.distributed import (divide, get_tensor_model_parallel_rank,
14
get_tensor_model_parallel_world_size,
15
tensor_model_parallel_all_reduce)
16
from vllm.model_executor.layers.activation import (get_act_and_mul_fn,
17
get_act_fn)
17
-from vllm.model_executor.layers.fused_moe import fused_moe
18
+from vllm.model_executor.layers.fused_moe.fused_moe import (
19
+ fused_topk, torch_vllm_outplace_fused_experts)
20
from vllm.model_executor.layers.linear import (ColumnParallelLinear,
21
MergedColumnParallelLinear,
22
QKVParallelLinear,
@@ -284,15 +286,22 @@ class NomicMoE(nn.Module):
286
hidden_states = hidden_states.view(-1, self.hidden_size)
287
# router_logits: (num_tokens, n_experts)
288
router_logits, _ = self.router(hidden_states)
287
- final_hidden_states = fused_moe(hidden_states,
288
- self.w1,
289
- self.w2,
290
- router_logits,
291
- self.top_k,
292
- renormalize=False,
293
- inplace=False,
294
- activation=self.hidden_act,
295
- is_act_and_mul=False)
289
+ # FIXME(Isotr0py): This implementation is too tricky,
290
+ # we should use FusedMoE instead in the future
291
+ # after supporting ungated activation for it.
292
+ topk_weights, topk_ids, _ = fused_topk(hidden_states,
293
+ router_logits,
294
+ self.top_k,
295
+ renormalize=False)
296
+ final_hidden_states = torch_vllm_outplace_fused_experts(
297
+ hidden_states=hidden_states,
298
+ w1=self.w1,
299
+ w2=self.w2,
300
+ topk_weights=topk_weights,
301
+ topk_ids=topk_ids,
302
+ activation=self.hidden_act,
303
+ is_act_and_mul=False,
304
+ )
305
306
if self.tp_size > 1:
307
final_hidden_states = tensor_model_parallel_all_reduce(
@@ -391,6 +400,7 @@ class BertWithRopeEncoder(nn.Module):
400
return hidden_states
401
402
403
+@support_torch_compile
404
class BertWithRope(nn.Module, SupportsQuant):
405
hf_to_vllm_mapper = WeightsMapper(orig_to_new_prefix={"model.": ""})
406
@@ -407,7 +417,7 @@ class BertWithRope(nn.Module, SupportsQuant):
417
418
def forward(
419
self,
410
- input_ids: Optional[torch.Tensor],
420
+ input_ids: torch.Tensor,
421
positions: torch.Tensor,
422
intermediate_tensors: Optional[IntermediateTensors] = None,
423
inputs_embeds: Optional[torch.Tensor] = None,
@@ -554,20 +564,6 @@ class JinaRobertaModel(BertWithRope):
564
"norm2": "mlp_ln",
565
})
566
557
- def forward(
558
- self,
559
- input_ids: torch.Tensor,
560
- position_ids: torch.Tensor,
561
- intermediate_tensors: Optional[IntermediateTensors] = None,
562
- inputs_embeds: Optional[torch.Tensor] = None,
563
- token_type_ids: Optional[torch.Tensor] = None,
564
- ) -> torch.Tensor:
565
- return super().forward(input_ids=input_ids,
566
- positions=position_ids,
567
- intermediate_tensors=intermediate_tensors,
568
- inputs_embeds=inputs_embeds,
569
- token_type_ids=token_type_ids)
570
-
567
@torch.inference_mode()
568
def jina_merge_lora_weights(self, weights: Iterable[tuple[str,
569
torch.Tensor]]):
vllm/model_executor/models/modernbert.py
+11
-11
@@ -8,6 +8,7 @@ from torch import nn
8
from transformers import ModernBertConfig
9
10
from vllm.attention import Attention, AttentionType
11
+from vllm.compilation.decorators import support_torch_compile
12
from vllm.config import VllmConfig
13
from vllm.distributed import get_tensor_model_parallel_world_size
14
from vllm.model_executor.layers.linear import (QKVParallelLinear,
@@ -46,7 +47,7 @@ class ModernBertEmbeddings(nn.Module):
47
input_ids: torch.Tensor,
48
inputs_embeds: Optional[torch.Tensor] = None,
49
) -> torch.Tensor:
49
- if inputs_embeds:
50
+ if inputs_embeds is not None:
51
return self.norm(inputs_embeds)
52
else:
53
inputs_embeds = self.tok_embeddings(input_ids)
@@ -117,7 +118,7 @@ class ModernBertAttention(nn.Module):
118
def forward(
119
self,
120
hidden_states: torch.Tensor,
120
- position_ids: Optional[torch.LongTensor] = None,
121
+ position_ids: torch.Tensor,
122
) -> torch.Tensor:
123
qkv, _ = self.Wqkv(hidden_states)
124
q, k, v = qkv.split([self.all_head_size] * 3, dim=-1)
@@ -169,9 +170,9 @@ class ModernBertLayer(nn.Module):
170
def forward(
171
self,
172
hidden_states: torch.Tensor,
172
- position_ids: Optional[torch.LongTensor] = None,
173
- ):
174
- attn_outputs = self.attn(self.attn_norm(hidden_states),
173
+ position_ids: torch.Tensor,
174
+ ) -> torch.Tensor:
175
+ attn_outputs = self.attn(hidden_states=self.attn_norm(hidden_states),
176
position_ids=position_ids)
177
hidden_states = hidden_states + attn_outputs
178
mlp_output = self.mlp(self.mlp_norm(hidden_states))
@@ -192,13 +193,14 @@ class ModernBertEncoderLayer(nn.Module):
193
def forward(
194
self,
195
hidden_states: torch.Tensor,
195
- position_ids: Optional[torch.LongTensor] = None,
196
+ position_ids: torch.Tensor,
197
) -> torch.Tensor:
198
for i, layer in enumerate(self.layers):
199
hidden_states = layer(hidden_states, position_ids)
200
return hidden_states
201
202
203
+@support_torch_compile
204
class ModernBertModel(nn.Module):
205
hf_to_vllm_mapper = WeightsMapper(
206
orig_to_new_prefix={"layers.": "encoder_layer.layers."})
@@ -234,13 +236,11 @@ class ModernBertModel(nn.Module):
236
237
def forward(
238
self,
237
- input_ids: Optional[torch.LongTensor] = None,
238
- positions: Optional[torch.Tensor] = None,
239
+ input_ids: torch.Tensor,
240
+ positions: torch.Tensor,
241
intermediate_tensors: Optional[IntermediateTensors] = None,
242
inputs_embeds: Optional[torch.Tensor] = None,
241
- position_ids: Optional[torch.LongTensor] = None,
243
) -> torch.Tensor:
243
- position_ids = positions if positions is not None else position_ids
244
if inputs_embeds is not None:
245
hidden_states = inputs_embeds
246
else:
@@ -249,7 +249,7 @@ class ModernBertModel(nn.Module):
249
250
outputs = self.encoder_layer(
251
hidden_states=hidden_states,
252
- position_ids=position_ids,
252
+ position_ids=positions,
253
)
254
norm_outputs = self.final_norm(outputs)
255
return norm_outputs
vllm/model_executor/models/roberta.py
+3
-3
@@ -105,7 +105,7 @@ class RobertaEmbeddingModel(BertEmbeddingModel):
105
106
def forward(
107
self,
108
- input_ids: Optional[torch.Tensor],
108
+ input_ids: torch.Tensor,
109
positions: torch.Tensor,
110
token_type_ids: Optional[torch.Tensor] = None,
111
intermediate_tensors: Optional[IntermediateTensors] = None,
@@ -119,8 +119,8 @@ class RobertaEmbeddingModel(BertEmbeddingModel):
119
position_ids=positions,
120
padding_idx=self.padding_idx)
121
122
- return self.model(input_ids=input_ids,
123
- position_ids=positions,
122
+ return self.model(input_ids,
123
+ positions,
124
token_type_ids=token_type_ids,
125
inputs_embeds=inputs_embeds,
126
intermediate_tensors=intermediate_tensors)