[Mypy Fix] Mypy fix for "vllm/model_executor/models/[cC][dD]" (#52003)
Wentao Ye committed
Aug 12, 2026 at 23:33 UTC
9a276d63753a5b05de394adbdf54680d70a7d906
24 files changed
+153
-66
tools/pre_commit/mypy.py
-3
@@ -111,10 +111,7 @@ SEPARATE_GROUPS = [
111
"tests/v1/worker",
112
]
113
114
-# TODO(woosuk): Include the code from Megatron and HuggingFace.
114
EXCLUDE = [
116
- r"vllm/model_executor/models/[cC]",
117
- r"vllm/model_executor/models/[dD]",
115
r"vllm/model_executor/models/[eE]",
116
r"vllm/model_executor/models/[fF]",
117
r"vllm/model_executor/models/[gG]",
vllm/model_executor/models/clip.py
+3
@@ -142,6 +142,7 @@ class CLIPProcessingInfo(BaseProcessingInfo):
142
143
pooler_config = self.ctx.model_config.pooler_config
144
assert pooler_config is not None
145
+ assert pooler_config.seq_pooling_type is not None
146
147
return get_num_selected_vision_tokens(
148
vision_encoder_info.get_num_image_tokens(
@@ -854,6 +855,7 @@ class CLIPEmbeddingModel(nn.Module, SupportsMultiModal, SupportsQuant):
855
feature_select_strategy: VisionFeatureSelectStrategy | None = None,
856
) -> torch.Tensor:
857
if feature_select_strategy is None:
858
+ assert self.pooler_config.seq_pooling_type is not None
859
feature_select_strategy = _get_vision_feature_select_strategy(
860
self.pooler_config.seq_pooling_type
861
)
@@ -961,6 +963,7 @@ class CLIPEmbeddingModel(nn.Module, SupportsMultiModal, SupportsQuant):
963
raise RuntimeError("PP is not supported for this model")
964
965
# Multimodal inputs
966
+ assert inputs_embeds is not None
967
if not self._is_text_input:
968
return inputs_embeds
969
vllm/model_executor/models/cohere2_moe.py
+2
@@ -178,6 +178,7 @@ class Cohere2MoeAttention(nn.Module):
178
self.max_position_embeddings = getattr(
179
config, "model_max_length", None
180
) or getattr(config, "max_position_embeddings", 8192)
181
+ assert isinstance(self.max_position_embeddings, int)
182
self.qkv_proj = QKVParallelLinear(
183
self.hidden_size,
184
self.head_dim,
@@ -283,6 +284,7 @@ class Cohere2Moe(nn.Module):
284
prefix=f"{prefix}.gate",
285
)
286
287
+ self.shared_experts: Cohere2MoeMLP | None
288
if hasattr(config, "num_shared_experts") and config.num_shared_experts > 0:
289
self.shared_experts = Cohere2MoeMLP(
290
config=config,
vllm/model_executor/models/cohere2_vision.py
+1
-1
@@ -416,7 +416,7 @@ class Cohere2VisionForConditionalGeneration(
416
)
417
418
def _patch_quant_config(
419
- self, config: PretrainedConfig, quant_config: QuantizationConfig
419
+ self, config: PretrainedConfig, quant_config: QuantizationConfig | None
420
):
421
# the awq models from OpenGVLab missing `modules_to_not_convert`
422
# patch the quant_config to add `modules_to_not_convert` back
vllm/model_executor/models/cohere_asr.py
+28
-13
@@ -55,6 +55,7 @@ from vllm.transformers_utils.processors.cohere_asr import (
55
CohereASRFeatureExtractor,
56
CohereASRProcessor,
57
)
58
+from vllm.utils.collection_utils import is_list_of
59
from vllm.v1.attention.backend import (
60
AttentionType,
61
)
@@ -183,6 +184,7 @@ class CohereASRAttention(nn.Module):
184
def forward(
185
self,
186
hidden_states: torch.Tensor,
187
+ encoder_hidden_states: torch.Tensor | None = None,
188
) -> torch.Tensor:
189
qkv, _ = self.qkv_proj(hidden_states)
190
q, k, v = qkv.split([self.q_size, self.kv_size, self.kv_size], dim=-1)
@@ -241,7 +243,7 @@ class CohereASRCrossAttention(CohereASRAttention):
243
def forward(
244
self,
245
hidden_states: torch.Tensor,
244
- encoder_hidden_states: torch.Tensor | None,
246
+ encoder_hidden_states: torch.Tensor | None = None,
247
) -> torch.Tensor:
248
q, _ = self.q_proj(hidden_states)
249
@@ -837,7 +839,7 @@ class CausalConv1D(nn.Conv1d):
839
out_channels: int,
840
kernel_size: int,
841
stride: int = 1,
840
- padding: str | int = 0,
842
+ padding: str | int | list[int] | None = 0,
843
dilation: int = 1,
844
groups: int = 1,
845
bias: bool = True,
@@ -845,6 +847,8 @@ class CausalConv1D(nn.Conv1d):
847
device=None,
848
dtype=None,
849
) -> None:
850
+ self._left_padding: int
851
+ self._right_padding: int
852
if padding is None:
853
self._left_padding = kernel_size - 1
854
self._right_padding = stride - 1
@@ -903,7 +907,7 @@ class ConformerConvolution(nn.Module):
907
d_model: int,
908
kernel_size: int,
909
norm_type: str = "batch_norm",
906
- conv_context_size: int | None = None,
910
+ conv_context_size: int | list[int] | None = None,
911
pointwise_activation: str = "glu_",
912
use_bias: bool = True,
913
) -> None:
@@ -1158,6 +1162,7 @@ class RelPositionMultiHeadAttention(CohereASRMultiHeadAttention):
1162
q, k, v = self.forward_qkv(query, key, value)
1163
q = q.transpose(1, 2) # (batch, time1, head, d_k)
1164
1165
+ assert pos_emb is not None
1166
n_batch_pos = pos_emb.size(0)
1167
p = self.linear_pos(pos_emb).view(n_batch_pos, -1, self.h, self.d_k)
1168
p = p.transpose(1, 2) # (batch, head, time1, d_k)
@@ -1213,7 +1218,7 @@ class ConformerLayer(torch.nn.Module):
1218
n_heads: int = 4,
1219
conv_kernel_size: int = 31,
1220
conv_norm_type: str = "batch_norm",
1216
- conv_context_size: int | None = None,
1221
+ conv_context_size: int | list[int] | None = None,
1222
pos_bias_u: nn.Parameter | torch.Tensor | None = None,
1223
pos_bias_v: nn.Parameter | torch.Tensor | None = None,
1224
att_context_size: list[int] | None = None,
@@ -1382,6 +1387,7 @@ class ConformerEncoder(nn.Module):
1387
conv_kernel_size=conv_kernel_size,
1388
)
1389
1390
+ self.xscale: float | None
1391
if xscaling:
1392
self.xscale = math.sqrt(d_model)
1393
else:
@@ -1633,9 +1639,12 @@ class ConformerEncoder(nn.Module):
1639
) -> tuple[list[list[int]], list[int], list[float], list[int]]:
1640
# convert att_context_size to a standard list of lists
1641
if att_context_size:
1636
- att_context_size_all = list(att_context_size)
1637
- if isinstance(att_context_size_all[0], int):
1638
- att_context_size_all = [att_context_size_all]
1642
+ if is_list_of(att_context_size, int, check="all"):
1643
+ att_context_size_all = [att_context_size]
1644
+ elif is_list_of(att_context_size, list, check="all"):
1645
+ att_context_size_all = att_context_size
1646
+ else:
1647
+ raise ValueError("att_context_size cannot mix nested and flat values")
1648
for i, att_cs in enumerate(att_context_size_all):
1649
if att_context_style == "chunked_limited":
1650
if att_cs[0] > 0 and att_cs[0] % (att_cs[1] + 1) > 0:
@@ -1684,6 +1693,7 @@ class ConformerEncoder(nn.Module):
1693
if conv_context_size == "causal":
1694
conv_context_size = [conv_kernel_size - 1, 0]
1695
else:
1696
+ assert isinstance(conv_context_size, list)
1697
total = conv_context_size[0] + conv_context_size[1] + 1
1698
if total != conv_kernel_size:
1699
raise ValueError(
@@ -1940,7 +1950,7 @@ class CohereASRMultiModalProcessor(EncDecMultiModalProcessor[CohereASRProcessing
1950
):
1951
if mm_data:
1952
feature_extractor = self.info.get_feature_extractor(**mm_kwargs)
1943
- mm_data = dict(audio=mm_data.pop("audios"))
1953
+ mm_data = dict(audio=dict(mm_data).pop("audios"))
1954
mm_kwargs = dict(
1955
**mm_kwargs,
1956
sampling_rate=feature_extractor.sampling_rate,
@@ -2045,7 +2055,6 @@ class CohereAsrForConditionalGeneration(
2055
# (which is different from "_") and encode("▁ABC") ignores the first token
2056
# so the prompt_text is unreliable. However, prompt_token_ids can be used
2057
# to get prompt_text but it wont have the first token "▁".
2048
- prompt_text = None
2058
prompt_token_ids = cls._get_default_prompt_token_ids(
2059
tokenizer,
2060
model_config,
@@ -2053,7 +2062,6 @@ class CohereAsrForConditionalGeneration(
2062
)
2063
2064
return TokensPrompt(
2056
- prompt=prompt_text,
2065
prompt_token_ids=prompt_token_ids,
2066
multi_modal_data={"audio": (audio, stt_config.sample_rate)},
2067
)
@@ -2199,7 +2207,9 @@ class CohereAsrForConditionalGeneration(
2207
audio_input, seq_lens = self._parse_and_validate_audio_input(**kwargs)
2208
2209
if hasattr(audio_input, "input_features"):
2202
- out = self.model.get_encoder_outputs(audio_input["input_features"])
2210
+ out = self.model.get_encoder_outputs(
2211
+ audio_input["input_features"], seq_lens
2212
+ )
2213
else:
2214
out = self.model.get_encoder_outputs(audio_input, seq_lens)
2215
@@ -2219,12 +2229,17 @@ class CohereAsrForConditionalGeneration(
2229
f"Incorrect type of audio features. Got type: {type(input_features)}"
2230
)
2231
2232
+ if not isinstance(length, torch.Tensor):
2233
+ raise ValueError("Audio feature lengths must be a tensor.")
2234
+
2235
if isinstance(input_features, torch.Tensor):
2236
seq_lens = length.reshape(-1)
2237
else:
2238
+ if not is_list_of(input_features, torch.Tensor, check="all"):
2239
+ raise ValueError("All audio features must be tensors.")
2240
input_features = [
2226
- feat.to(self.dtype).squeeze(0).transpose(1, 0)
2227
- for feat in input_features
2241
+ feature.to(self.dtype).squeeze(0).transpose(1, 0)
2242
+ for feature in input_features
2243
]
2244
seq_lens = length.reshape(-1)
2245
input_features = torch.nn.utils.rnn.pad_sequence(
vllm/model_executor/models/cohere_eagle.py
+3
-1
@@ -58,6 +58,7 @@ class CohereEagleModel(nn.Module):
58
start_layer_id: int = 0,
59
) -> None:
60
super().__init__()
61
+ assert vllm_config.speculative_config is not None
62
self.config = vllm_config.speculative_config.draft_model_config.hf_config
63
self.quant_config = get_draft_quant_config(vllm_config)
64
@@ -137,6 +138,7 @@ class CohereEagleModel(nn.Module):
138
class EagleCohereForCausalLM(CohereForCausalLM):
139
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
140
nn.Module.__init__(self)
141
+ assert vllm_config.speculative_config is not None
142
self.config = vllm_config.speculative_config.draft_model_config.hf_config
143
# Flags checked by the speculative proposer to decide whether to share
144
# embed_tokens / lm_head with the target model. Cohere EAGLE checkpoints
@@ -160,7 +162,7 @@ class EagleCohereForCausalLM(CohereForCausalLM):
162
def embed_input_ids(self, input_ids: torch.Tensor) -> torch.Tensor:
163
return self.model.embed_input_ids(input_ids)
164
163
- def forward(
165
+ def forward( # type: ignore[override]
166
self,
167
input_ids: torch.Tensor,
168
positions: torch.Tensor,
vllm/model_executor/models/colmodernvbert.py
+2
@@ -33,6 +33,7 @@ from vllm.multimodal.processing import (
33
PromptUpdate,
34
)
35
from vllm.sequence import IntermediateTensors
36
+from vllm.tokenizers.hf import HfTokenizer
37
from vllm.transformers_utils.configs.colmodernvbert import ColModernVBertConfig
38
39
from .interfaces import (
@@ -161,6 +162,7 @@ class ColModernVBertMultiModalProcessor(
162
tok_kwargs: Mapping[str, object],
163
) -> BatchFeature:
164
tokenizer = self.info.get_tokenizer()
165
+ assert isinstance(tokenizer, HfTokenizer)
166
text_encoding = tokenizer(
167
prompt,
168
return_tensors="pt",
vllm/model_executor/models/colpali.py
+4
-1
@@ -25,6 +25,7 @@ from transformers import BatchFeature, PaliGemmaProcessor
25
26
from vllm.config import VllmConfig
27
from vllm.model_executor.layers.pooler.tokwise import pooler_for_token_embed
28
+from vllm.model_executor.layers.pooler.tokwise.heads import TokenPoolerHead
29
from vllm.model_executor.model_loader.weight_utils import default_weight_loader
30
from vllm.multimodal import MULTIMODAL_REGISTRY
31
@@ -232,7 +233,9 @@ class ColPaliModel(
233
loaded.add(f"custom_text_proj.{param_name}")
234
235
# Update pooler projector for the lazy-creation path
235
- self.pooler.head.projector = self.custom_text_proj
236
+ head = self.pooler.head
237
+ assert isinstance(head, TokenPoolerHead)
238
+ head.projector = self.custom_text_proj
239
240
# Mark pooler projector params as loaded
241
if hasattr(self, "pooler") and hasattr(self.pooler, "head"):
vllm/model_executor/models/commandr.py
+1
@@ -154,6 +154,7 @@ class CohereAttention(nn.Module):
154
self.max_position_embeddings = getattr(
155
config, "model_max_length", None
156
) or getattr(config, "max_position_embeddings", 8192)
157
+ assert isinstance(self.max_position_embeddings, int)
158
self.use_qk_norm = getattr(config, "use_qk_norm", False)
159
self.qkv_proj = QKVParallelLinear(
160
self.hidden_size,
vllm/model_executor/models/config.py
+11
-2
@@ -9,6 +9,7 @@ if TYPE_CHECKING:
9
from transformers import PretrainedConfig
10
11
from vllm.config import CacheConfig, ModelConfig, VllmConfig
12
+ from vllm.config.cache import MambaDType
13
14
15
logger = init_logger(__name__)
@@ -452,6 +453,7 @@ class JambaForSequenceClassificationConfig(VerifyAndUpdateConfig):
453
@staticmethod
454
def verify_and_update_model_config(model_config: "ModelConfig") -> None:
455
pooler_config = model_config.pooler_config
456
+ assert pooler_config is not None
457
if pooler_config.use_activation is None:
458
pooler_config.use_activation = False
459
@@ -518,6 +520,7 @@ class JinaVLForSequenceClassificationConfig(VerifyAndUpdateConfig):
520
config = model_config.hf_config
521
config.num_labels = 1
522
pooler_config = model_config.pooler_config
523
+ assert pooler_config is not None
524
if pooler_config.logit_mean is None:
525
pooler_config.logit_mean = 2.65
526
@@ -540,6 +543,7 @@ class LlamaBidirectionalConfig(VerifyAndUpdateConfig):
543
if pooling_type is None:
544
raise ValueError(f"pool_type {hf_config.pooling!r} not supported")
545
546
+ assert model_config.pooler_config is not None
547
model_config.pooler_config.seq_pooling_type = pooling_type
548
549
@@ -572,10 +576,13 @@ class LlamaNemotronVLConfig(VerifyAndUpdateConfig):
576
if pooling is None and hasattr(hf_config, "llm_config"):
577
pooling = getattr(hf_config.llm_config, "pooling", "avg")
578
579
+ assert isinstance(pooling, str)
580
+
581
pooling_type = pooling_type_map.get(pooling)
582
if pooling_type is None:
583
raise ValueError(f"pool_type {pooling!r} not supported")
584
585
+ assert model_config.pooler_config is not None
586
model_config.pooler_config.seq_pooling_type = pooling_type
587
588
@@ -631,7 +638,7 @@ class MambaModelConfig(VerifyAndUpdateConfig):
638
639
640
class NemotronHForCausalLMConfig(VerifyAndUpdateConfig):
634
- DEFAULT_MAMBA_SSM_CACHE_DTYPE = "float32"
641
+ DEFAULT_MAMBA_SSM_CACHE_DTYPE: "MambaDType" = "float32"
642
"""Only `float32` is known to have no accuracy issues by default."""
643
644
@classmethod
@@ -643,7 +650,7 @@ class NemotronHForCausalLMConfig(VerifyAndUpdateConfig):
650
`float32` if not specified.
651
"""
652
if cache_config.mamba_ssm_cache_dtype == "auto":
646
- mamba_ssm_cache_dtype = getattr(
653
+ mamba_ssm_cache_dtype: MambaDType = getattr(
654
hf_config, "mamba_ssm_cache_dtype", cls.DEFAULT_MAMBA_SSM_CACHE_DTYPE
655
)
656
logger.info(
@@ -729,6 +736,7 @@ class Qwen2ForProcessRewardModelConfig(VerifyAndUpdateConfig):
736
@staticmethod
737
def verify_and_update_model_config(model_config: "ModelConfig") -> None:
738
pooler_config = model_config.pooler_config
739
+ assert pooler_config is not None
740
741
if pooler_config.step_tag_id is None:
742
pooler_config.step_tag_id = 151651
@@ -738,6 +746,7 @@ class Qwen2ForRewardModelConfig(VerifyAndUpdateConfig):
746
@staticmethod
747
def verify_and_update_model_config(model_config: "ModelConfig") -> None:
748
pooler_config = model_config.pooler_config
749
+ assert pooler_config is not None
750
751
if pooler_config.use_activation is None:
752
pooler_config.use_activation = False
vllm/model_executor/models/cosmos3_edge.py
+10
-6
@@ -66,7 +66,7 @@ class Cosmos3EdgeVisionEncoder(Siglip2VisionTransformer):
66
def dtype(self) -> torch.dtype:
67
return self.embeddings.patch_embedding.weight.dtype
68
69
- def forward(
69
+ def encode(
70
self,
71
pixel_values: torch.Tensor,
72
grid_thw: torch.Tensor,
@@ -253,7 +253,7 @@ class Cosmos3EdgeVisionModel(nn.Module):
253
grid_thw: torch.Tensor | list[list[int]],
254
) -> torch.Tensor:
255
grid_thw = torch.as_tensor(grid_thw, dtype=torch.int64, device="cpu")
256
- image_embeds = self.encoder(pixel_values.type(self.dtype), grid_thw=grid_thw)
256
+ image_embeds = self.encoder.encode(pixel_values.type(self.dtype), grid_thw)
257
image_embeds = patch_merging_by_param(
258
image_embeds,
259
grid_thw,
@@ -315,11 +315,10 @@ class Cosmos3EdgeAttention(NemotronHAttention):
315
rope_parameters=config.rope_parameters,
316
)
317
318
- def forward(
318
+ def forward_with_positions(
319
self,
320
positions: torch.Tensor,
321
hidden_states: torch.Tensor,
322
- **kwargs,
322
) -> torch.Tensor:
323
qkv, _ = self.qkv_proj(hidden_states)
324
q, k, v = qkv.split([self.q_size, self.kv_size, self.kv_size], dim=-1)
@@ -367,7 +366,7 @@ class Cosmos3EdgeAttentionDecoderLayer(nn.Module):
366
hidden_states = self.norm(hidden_states)
367
else:
368
hidden_states, residual = self.norm(hidden_states, residual)
370
- hidden_states = self.mixer(positions=positions, hidden_states=hidden_states)
369
+ hidden_states = self.mixer.forward_with_positions(positions, hidden_states)
370
return hidden_states, residual
371
372
@@ -562,6 +561,7 @@ class Cosmos3EdgeForConditionalGeneration(
561
config = vllm_config.model_config.hf_config
562
quant_config = vllm_config.quant_config
563
multimodal_config = vllm_config.model_config.multimodal_config
564
+ assert multimodal_config is not None
565
566
self.config = config
567
self.multimodal_config = multimodal_config
@@ -619,6 +619,8 @@ class Cosmos3EdgeForConditionalGeneration(
619
image_grid_thw=image_grid_thw,
620
)
621
622
+ raise AssertionError
623
+
624
def _parse_and_validate_video_input(
625
self, **kwargs: object
626
) -> Qwen2_5_VLVideoInputs | None:
@@ -645,6 +647,8 @@ class Cosmos3EdgeForConditionalGeneration(
647
video_grid_thw=video_grid_thw,
648
)
649
650
+ raise AssertionError
651
+
652
def _process_image_input(
653
self, image_input: Qwen2_5_VLImageInputs
654
) -> tuple[torch.Tensor, ...]:
@@ -684,7 +688,7 @@ class Cosmos3EdgeForConditionalGeneration(
688
return self._get_image_features(pixel_values_videos, grid_thw)
689
690
def _parse_and_validate_multimodal_inputs(self, **kwargs: object) -> dict:
687
- modalities = {}
691
+ modalities: dict = {}
692
image_input = self._parse_and_validate_image_input(**kwargs)
693
if image_input is not None:
694
modalities["image"] = image_input
vllm/model_executor/models/dbrx.py
+10
-4
@@ -3,6 +3,7 @@
3
4
from collections.abc import Iterable
5
from itertools import islice
6
+from typing import Any
7
8
import torch
9
import torch.nn as nn
@@ -93,8 +94,11 @@ class DbrxExperts(RoutedExperts):
94
param: nn.Parameter,
95
loaded_weight: torch.Tensor,
96
weight_name: str,
96
- param_name: str,
97
- ):
97
+ shard_id: str,
98
+ expert_id: int | None = None,
99
+ return_success: Any = False,
100
+ ) -> Any:
101
+ param_name = shard_id
102
tp_rank = get_tensor_model_parallel_rank()
103
param_data = param.data
104
shard_size = self.intermediate_size
@@ -134,6 +138,7 @@ class DbrxExperts(RoutedExperts):
138
param_data[:] = loaded_weight[:, :, shard]
139
else:
140
param_data[:] = loaded_weight
141
+ return True if return_success else None
142
143
144
class DbrxMoE(nn.Module):
@@ -409,9 +414,10 @@ class DbrxModel(nn.Module):
414
if is_pp_missing_parameter(name, self):
415
continue
416
# Remapping the name of FP8 kv-scale.
412
- name = maybe_remap_kv_scale_name(name, params_dict)
413
- if name is None:
417
+ remapped_name = maybe_remap_kv_scale_name(name, params_dict)
418
+ if remapped_name is None:
419
continue
420
+ name = remapped_name
421
param = params_dict[name]
422
weight_loader = getattr(param, "weight_loader", default_weight_loader)
423
weight_loader(param, loaded_weight)
vllm/model_executor/models/deepencoder.py
+4
-3
@@ -10,7 +10,7 @@
10
# This source code is licensed under the license found in the
11
# LICENSE file in the root directory of this source tree.
12
import math
13
-from collections.abc import Iterable
13
+from collections.abc import Callable, Iterable
14
from functools import partial
15
16
import torch
@@ -73,7 +73,7 @@ class ImageEncoderViT(nn.Module):
73
mlp_ratio: float = 4.0,
74
out_chans: int = 256,
75
qkv_bias: bool = True,
76
- norm_layer: type[nn.Module] = nn.LayerNorm,
76
+ norm_layer: Callable[[int], nn.Module] = nn.LayerNorm,
77
act_layer: type[nn.Module] = nn.GELU,
78
use_abs_pos: bool = True,
79
use_rel_pos: bool = False,
@@ -205,7 +205,7 @@ class Block(nn.Module):
205
num_heads: int,
206
mlp_ratio: float = 4.0,
207
qkv_bias: bool = True,
208
- norm_layer: type[nn.Module] = nn.LayerNorm,
208
+ norm_layer: Callable[[int], nn.Module] = nn.LayerNorm,
209
act_layer: type[nn.Module] = nn.GELU,
210
use_rel_pos: bool = False,
211
rel_pos_zero_init: bool = True,
@@ -326,6 +326,7 @@ class RelPosAttention(PluggableLayer):
326
v = v.view(B, self.num_heads, H * W, -1)
327
328
if self.use_rel_pos:
329
+ assert rel_h is not None and rel_w is not None
330
rel_h = rel_h.view(
331
B, self.num_heads, rel_h.size(1), rel_h.size(2), rel_h.size(3)
332
)
vllm/model_executor/models/deepencoder2.py
+3
-3
@@ -15,6 +15,7 @@ from functools import lru_cache
15
import torch
16
import torch.nn as nn
17
import transformers
18
+from transformers.models.qwen2.modeling_qwen2 import Qwen2Model
19
20
from vllm.model_executor.custom_op import PluggableLayer
21
@@ -49,7 +50,6 @@ class CustomQwen2Decoder(PluggableLayer):
50
super().__init__()
51
52
# load
52
- Qwen2Model = transformers.models.qwen2.modeling_qwen2.Qwen2Model
53
Qwen2Config = transformers.Qwen2Config
54
55
# config
@@ -70,11 +70,11 @@ class CustomQwen2Decoder(PluggableLayer):
70
)
71
72
#
73
- self.model = self._create_custom_model(Qwen2Model, config)
73
+ self.model = self._create_custom_model(config)
74
75
del self.model.embed_tokens
76
77
- def _create_custom_model(self, Qwen2Model, config):
77
+ def _create_custom_model(self, config):
78
"""Qwen2Model"""
79
80
class CustomQwen2ModelInner(Qwen2Model):
vllm/model_executor/models/deepseek_eagle.py
+8
-5
@@ -39,6 +39,7 @@ class DeepseekV2Model(nn.Module):
39
start_layer_id: int = 0,
40
) -> None:
41
super().__init__()
42
+ assert vllm_config.speculative_config is not None
43
self.config = vllm_config.speculative_config.draft_model_config.hf_config
44
quant_config = vllm_config.quant_config
45
self.vocab_size = self.config.vocab_size
@@ -155,7 +156,7 @@ class DeepseekV2Model(nn.Module):
156
break
157
else:
158
for mapping in expert_params_mapping:
158
- param_name, weight_name, expert_id, shard_id = mapping
159
+ param_name, weight_name, expert_id, expert_shard_id = mapping
160
if weight_name not in name:
161
continue
162
name = name.replace(weight_name, param_name)
@@ -166,7 +167,7 @@ class DeepseekV2Model(nn.Module):
167
param,
168
loaded_weight,
169
name,
169
- shard_id=shard_id,
170
+ shard_id=expert_shard_id,
171
expert_id=expert_id,
172
)
173
break
@@ -176,9 +177,10 @@ class DeepseekV2Model(nn.Module):
177
continue
178
179
# Remapping the name of FP8 kv-scale.
179
- name = maybe_remap_kv_scale_name(name, params_dict)
180
- if name is None:
180
+ remapped_name = maybe_remap_kv_scale_name(name, params_dict)
181
+ if remapped_name is None:
182
continue
183
+ name = remapped_name
184
185
param = params_dict[name]
186
weight_loader = getattr(
@@ -192,6 +194,7 @@ class DeepseekV2Model(nn.Module):
194
class EagleDeepseekV3ForCausalLM(DeepseekV3ForCausalLM):
195
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
196
nn.Module.__init__(self)
197
+ assert vllm_config.speculative_config is not None
198
self.config = vllm_config.speculative_config.draft_model_config.hf_config
199
quant_config = vllm_config.quant_config
200
target_layer_num = vllm_config.model_config.get_num_layers(
@@ -222,7 +225,7 @@ class EagleDeepseekV3ForCausalLM(DeepseekV3ForCausalLM):
225
def embed_input_ids(self, input_ids: torch.Tensor) -> torch.Tensor:
226
return self.model.embed_input_ids(input_ids)
227
225
- def forward(
228
+ def forward( # type: ignore[override]
229
self,
230
input_ids: torch.Tensor,
231
positions: torch.Tensor,
vllm/model_executor/models/deepseek_eagle3.py
+3
-1
@@ -159,6 +159,7 @@ class DeepseekV2Eagle3Model(nn.Module):
159
prefix: str = "",
160
) -> None:
161
super().__init__()
162
+ assert vllm_config.speculative_config is not None
163
self.config = vllm_config.speculative_config.draft_model_config.hf_config
164
self.vocab_size = self.config.vocab_size
165
@@ -276,6 +277,7 @@ class Eagle3DeepseekV2ForCausalLM(LocalArgmaxMixin, DeepseekV2ForCausalLM):
277
278
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
279
nn.Module.__init__(self)
280
+ assert vllm_config.speculative_config is not None
281
self.config = vllm_config.speculative_config.draft_model_config.hf_config
282
283
# Ensure draft_vocab_size is set
@@ -318,7 +320,7 @@ class Eagle3DeepseekV2ForCausalLM(LocalArgmaxMixin, DeepseekV2ForCausalLM):
320
) -> torch.Tensor:
321
return self.model.embed_input_ids(input_ids)
322
321
- def forward(
323
+ def forward( # type: ignore[override]
324
self,
325
input_ids: torch.Tensor,
326
positions: torch.Tensor,
vllm/model_executor/models/deepseek_mtp.py
+6
-4
@@ -68,6 +68,7 @@ class DeepSeekMultiTokenPredictorLayer(nn.Module):
68
def __init__(self, vllm_config: VllmConfig, prefix: str) -> None:
69
super().__init__()
70
71
+ assert vllm_config.speculative_config is not None
72
config = vllm_config.speculative_config.draft_model_config.hf_config
73
self.config = config
74
quant_config = vllm_config.quant_config
@@ -423,7 +424,7 @@ class DeepSeekMTP(nn.Module, DeepseekV2MixtureOfExperts):
424
# with expert_id.
425
is_expert_weight = False
426
for mapping in expert_params_mapping:
426
- param_name, weight_name, expert_id, shard_id = mapping
427
+ param_name, weight_name, expert_id, expert_shard_id = mapping
428
if weight_name not in chunk_name:
429
continue
430
@@ -446,7 +447,7 @@ class DeepSeekMTP(nn.Module, DeepseekV2MixtureOfExperts):
447
param,
448
weight_to_load,
449
name_mapped,
449
- shard_id=shard_id,
450
+ shard_id=expert_shard_id,
451
expert_id=expert_id,
452
return_success=True,
453
)
@@ -467,9 +468,10 @@ class DeepSeekMTP(nn.Module, DeepseekV2MixtureOfExperts):
468
if name.endswith(".bias") and name not in params_dict:
469
continue
470
470
- name = maybe_remap_kv_scale_name(name, params_dict)
471
- if name is None:
471
+ remapped_name = maybe_remap_kv_scale_name(name, params_dict)
472
+ if remapped_name is None:
473
continue
474
+ name = remapped_name
475
476
# According to DeepSeek-V3 Technical Report, MTP modules
477
# shares embedding layer. We only load the first weights.
vllm/model_executor/models/deepseek_ocr.py
+11
-2
@@ -49,6 +49,7 @@ from vllm.multimodal.processing import (
49
from vllm.sampling_params import SamplingParams
50
from vllm.sequence import IntermediateTensors
51
from vllm.tokenizers import cached_tokenizer_from_config
52
+from vllm.tokenizers.hf import HfTokenizer
53
from vllm.transformers_utils.configs.deepseek_vl2 import DeepseekVLV2Config
54
from vllm.transformers_utils.processors.deepseek_ocr import (
55
BASE_SIZE,
@@ -184,6 +185,7 @@ class NGramPerReqLogitsProcessor(AdapterLogitsProcessor):
185
)
186
if ngram_size is None:
187
return None
188
+ assert isinstance(ngram_size, int) and isinstance(window_size, int)
189
190
whitelist_token_ids = set(whitelist_token_ids) if whitelist_token_ids else None
191
return NoRepeatNGramLogitsProcessor(
@@ -301,6 +303,7 @@ class DeepseekOCRMultiModalProcessor(
303
304
else:
305
tokenizer = self.info.get_tokenizer()
306
+ assert isinstance(tokenizer, HfTokenizer)
307
processed_outputs = tokenizer(
308
prompt, add_special_tokens=True, return_tensors="pt"
309
)
@@ -342,6 +345,7 @@ class DeepseekOCRMultiModalProcessor(
345
if isinstance(images, ImageEmbeddingItems):
346
num_image_tokens = images.get_feature_size(item_idx)
347
else:
348
+ assert isinstance(images, ImageProcessorItems)
349
size = images.get_image_size(item_idx)
350
351
num_image_tokens = self.info.get_num_image_tokens(
@@ -459,7 +463,11 @@ class DeepseekOCRForCausalLM(
463
images_spatial_crop = kwargs.pop("images_spatial_crop", None)
464
images_crop = kwargs.pop("images_crop", None)
465
462
- if pixel_values is None or torch.sum(pixel_values).item() == 0:
466
+ if pixel_values is None:
467
+ return None
468
+ assert isinstance(pixel_values, torch.Tensor)
469
+ assert images_crop is None or isinstance(images_crop, torch.Tensor)
470
+ if torch.sum(pixel_values).item() == 0:
471
return None
472
473
# Use actual tensor spatial dim instead of hardcoded
@@ -675,7 +683,8 @@ class DeepseekOCRForCausalLM(
683
num_input_tokens = global_input_side**2
684
685
if is_tiled:
678
- num_patches = image_spatial_crop.prod(dim=-1)
686
+ assert image_spatial_crop is not None
687
+ num_patches = int(image_spatial_crop.prod().item())
688
num_input_tokens += num_patches * (local_input_side**2)
689
690
global_output_token = self.global_image_output_token
vllm/model_executor/models/deepseek_ocr2.py
+4
-1
@@ -47,6 +47,7 @@ from vllm.multimodal.processing import (
47
)
48
from vllm.sequence import IntermediateTensors
49
from vllm.tokenizers import cached_tokenizer_from_config
50
+from vllm.tokenizers.hf import HfTokenizer
51
from vllm.transformers_utils.configs.deepseek_vl2 import DeepseekVLV2Config
52
from vllm.transformers_utils.processors.deepseek_ocr import (
53
BASE_SIZE,
@@ -173,6 +174,7 @@ class DeepseekOCR2MultiModalProcessor(
174
175
else:
176
tokenizer = self.info.get_tokenizer()
177
+ assert isinstance(tokenizer, HfTokenizer)
178
processed_outputs = tokenizer(
179
prompt, add_special_tokens=True, return_tensors="pt"
180
)
@@ -214,6 +216,7 @@ class DeepseekOCR2MultiModalProcessor(
216
if isinstance(images, ImageEmbeddingItems):
217
num_image_tokens = images.get_feature_size(item_idx)
218
else:
219
+ assert isinstance(images, ImageProcessorItems)
220
size = images.get_image_size(item_idx)
221
222
num_image_tokens = self.info.get_num_image_tokens(
@@ -284,7 +287,7 @@ class DeepseekOCR2ForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, Support
287
patch_size=16,
288
qkv_bias=True,
289
use_rel_pos=True,
287
- global_attn_indexes=[2, 5, 8, 11],
290
+ global_attn_indexes=(2, 5, 8, 11),
291
window_size=14,
292
out_chans=256,
293
last_conv_output=896,
vllm/model_executor/models/deepseek_v2.py
+13
-6
@@ -626,7 +626,7 @@ class DeepseekV32IndexerCache(torch.nn.Module, AttentionLayerBase):
626
627
def forward(self): ...
628
629
- def get_attn_backend(self) -> AttentionBackend:
629
+ def get_attn_backend(self) -> type[AttentionBackend]:
630
return DeepseekV32IndexerBackend
631
632
@@ -681,6 +681,7 @@ class Indexer(nn.Module):
681
# NOTE: (zyongye) we use fp8 naive cache,
682
# where we store value in fp8 and scale in fp32
683
# per self.quant_block_size element
684
+ assert cache_config is not None
685
self.k_cache = DeepseekV32IndexerCache(
686
head_dim=self.head_dim + self.head_dim // self.quant_block_size * 4,
687
dtype=torch.uint8,
@@ -1107,6 +1108,10 @@ class DeepseekV2MLAAttention(nn.Module):
1108
)
1109
1110
if self.is_v32 and (not _skip_topk or is_mtp_layer):
1111
+ assert q_lora_rank is not None
1112
+ assert cache_config is not None
1113
+ self.indexer_rope_emb: nn.Module | None
1114
+ self.indexer: Indexer | None
1115
self.indexer_rope_emb = get_rope(
1116
qk_rope_head_dim,
1117
max_position=max_position_embeddings,
@@ -1218,6 +1223,7 @@ class DeepseekV2DecoderLayer(nn.Module):
1223
1224
self.use_mha = use_mha
1225
1226
+ attn_cls: typing.Any
1227
if use_mha:
1228
attn_cls = DeepseekAttention
1229
elif model_config.use_mla:
@@ -1508,7 +1514,7 @@ class DeepseekV2Model(nn.Module):
1514
rocm_aiter_moe_shared_expert_enabled = (
1515
rocm_aiter_ops.is_fusion_moe_shared_experts_enabled()
1516
)
1511
- stacked_params_mapping = [
1517
+ stacked_params_mapping: list[tuple[str, str, int | str]] = [
1518
# (param_name, shard_name, shard_id)
1519
("gate_up_proj", "gate_proj", 0),
1520
("gate_up_proj", "up_proj", 1),
@@ -1677,7 +1683,7 @@ class DeepseekV2Model(nn.Module):
1683
# param and delegate to its expert-aware weight_loader
1684
# with expert_id.
1685
for mapping in expert_params_mapping:
1680
- param_name, weight_name, expert_id, shard_id = mapping
1686
+ param_name, weight_name, expert_id, expert_shard_id = mapping
1687
if weight_name not in chunk_name:
1688
continue
1689
@@ -1703,7 +1709,7 @@ class DeepseekV2Model(nn.Module):
1709
param,
1710
weight_to_load,
1711
name_mapped,
1706
- shard_id=shard_id,
1712
+ shard_id=expert_shard_id,
1713
expert_id=expert_id,
1714
return_success=True,
1715
)
@@ -1725,9 +1731,10 @@ class DeepseekV2Model(nn.Module):
1731
continue
1732
1733
# Remapping the name of FP8 kv-scale.
1728
- name = maybe_remap_kv_scale_name(name, params_dict)
1729
- if name is None:
1734
+ remapped_name = maybe_remap_kv_scale_name(name, params_dict)
1735
+ if remapped_name is None:
1736
continue
1737
+ name = remapped_name
1738
1739
if is_pp_missing_parameter(name, self):
1740
continue
vllm/model_executor/models/deepseek_vl2.py
+6
-1
@@ -43,6 +43,7 @@ from vllm.multimodal.processing.processor import (
43
)
44
from vllm.sequence import IntermediateTensors
45
from vllm.tokenizers import cached_tokenizer_from_config
46
+from vllm.tokenizers.hf import HfTokenizer
47
from vllm.transformers_utils.configs.deepseek_vl2 import (
48
DeepseekVLV2Config,
49
MlpProjectorConfig,
@@ -244,6 +245,7 @@ class DeepseekVL2MultiModalProcessor(
245
) -> BatchFeature:
246
if not mm_data:
247
tokenizer = self.info.get_tokenizer()
248
+ assert isinstance(tokenizer, HfTokenizer)
249
return tokenizer(prompt, add_special_tokens=True, return_tensors="pt")
250
251
processed_outputs = super()._call_hf_processor(
@@ -291,6 +293,7 @@ class DeepseekVL2MultiModalProcessor(
293
if isinstance(images, ImageEmbeddingItems):
294
num_image_tokens = images.get_feature_size(item_idx)
295
else:
296
+ assert isinstance(images, ImageProcessorItems)
297
image_size = images.get_image_size(item_idx)
298
299
num_image_tokens = self.info.get_num_image_tokens(
@@ -406,7 +409,9 @@ class DeepseekVLV2ForCausalLM(nn.Module, SupportsMultiModal, SupportsPP):
409
return parent, names[-1]
410
411
# patch for timm ViT instance to support tensor parallel
409
- def patch_vit_for_tp(self, vit: torch.nn.Module, quant_config: QuantizationConfig):
412
+ def patch_vit_for_tp(
413
+ self, vit: torch.nn.Module, quant_config: QuantizationConfig | None
414
+ ):
415
try:
416
import timm
417
except ImportError as e:
vllm/model_executor/models/diffusion_gemma.py
+4
-1
@@ -32,6 +32,7 @@ from vllm.distributed.parallel_state import get_tp_group
32
from vllm.logger import init_logger
33
from vllm.model_executor.layers.layernorm import RMSNorm
34
from vllm.model_executor.layers.logits_processor import LogitsProcessor
35
+from vllm.model_executor.layers.quantization import QuantizationConfig
36
from vllm.model_executor.layers.vocab_parallel_embedding import (
37
ParallelLMHead,
38
)
@@ -195,8 +196,10 @@ class DiffusionGemmaForConditionalGeneration(
196
197
# ---- Vision tower ----
198
vision_config = getattr(config, "vision_config", None)
199
+ self.embed_vision: Gemma4MultimodalEmbedder | None
200
if vision_config is not None:
201
quant_config = vllm_config.quant_config
202
+ tower_quant: QuantizationConfig | None
203
if quant_config and quant_config.get_name() in [
204
"bitsandbytes",
205
"torchao",
@@ -1048,7 +1051,7 @@ class DiffusionSampler:
1051
sampler: Any,
1052
diffusion_config: Any,
1053
vocab_size: int,
1051
- diffusion_states: DiffusionGemmaRequestStates | None = None,
1054
+ diffusion_states: DiffusionGemmaRequestStates,
1055
*,
1056
confidence_threshold: float,
1057
t_min: float,
vllm/model_executor/models/dots_ocr.py
+14
-7
@@ -149,7 +149,7 @@ class DotsOCRProcessingInfo(Qwen2VLProcessingInfo):
149
self,
150
**kwargs: object,
151
) -> Qwen2VLProcessor:
152
- self.get_tokenizer().image_token = IMAGE_TOKEN # Ensure image token is set
152
+ setattr(self.get_tokenizer(), "image_token", IMAGE_TOKEN) # noqa: B010
153
processor = self.ctx.get_hf_processor(
154
Qwen2VLProcessor,
155
**kwargs,
@@ -430,7 +430,7 @@ class DotsVisionBlock(nn.Module):
430
*,
431
cu_seqlens: torch.Tensor,
432
rotary_pos_emb: torch.Tensor,
433
- max_seqlen: int | None = None,
433
+ max_seqlen: torch.Tensor | None = None,
434
) -> torch.Tensor:
435
hidden_states = hidden_states + self.attn(
436
self.norm1(hidden_states),
@@ -483,6 +483,7 @@ class DotsVisionTransformer(nn.Module):
483
)
484
if require_post_norm is None:
485
require_post_norm = len(self.blocks) == config.num_hidden_layers
486
+ self.post_trunk_norm: RMSNorm | None
487
if require_post_norm and self.config.post_norm:
488
self.post_trunk_norm = RMSNorm(config.embed_dim, eps=config.rms_norm_eps)
489
else:
@@ -536,7 +537,7 @@ class DotsVisionTransformer(nn.Module):
537
rotary_pos_emb = rotary_pos_emb_full[pos_ids].flatten(1)
538
return rotary_pos_emb
539
539
- def compute_attn_mask_seqlen(self, cu_seqlens: torch.Tensor) -> int | None:
540
+ def compute_attn_mask_seqlen(self, cu_seqlens: torch.Tensor) -> torch.Tensor | None:
541
max_seqlen = None
542
if self.attn_backend in {
543
AttentionBackendEnum.FLASH_ATTN,
@@ -552,15 +553,17 @@ class DotsVisionTransformer(nn.Module):
553
rotary_pos_emb = self.rot_pos_emb(grid_thw)
554
555
# Convert grid_thw to tensor (always expecting list format now)
555
- grid_thw = torch.tensor(grid_thw, device=hidden_states.device, dtype=torch.long)
556
+ grid_thw_tensor = torch.tensor(
557
+ grid_thw, device=hidden_states.device, dtype=torch.long
558
+ )
559
hidden_states = hidden_states.to(self.dtype)
557
- hidden_states = self.patch_embed(hidden_states, grid_thw)
560
+ hidden_states = self.patch_embed(hidden_states, grid_thw_tensor)
561
562
cu_seqlens = torch.repeat_interleave(
560
- grid_thw[:, 1] * grid_thw[:, 2], grid_thw[:, 0]
563
+ grid_thw_tensor[:, 1] * grid_thw_tensor[:, 2], grid_thw_tensor[:, 0]
564
).cumsum(
565
dim=0,
563
- dtype=grid_thw.dtype if torch.jit.is_tracing() else torch.int32,
566
+ dtype=grid_thw_tensor.dtype if torch.jit.is_tracing() else torch.int32,
567
)
568
cu_seqlens = torch.cat([cu_seqlens.new_zeros(1), cu_seqlens])
569
@@ -620,6 +623,7 @@ class DotsOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, SupportsLoRA
623
def get_placeholder_str(cls, modality: str, i: int) -> str | None:
624
if modality.startswith("image"):
625
return "<|img|><|imgpad|><|endofimg|>"
626
+ return None
627
628
def __init__(self, *, vllm_config: VllmConfig, prefix: str = ""):
629
super().__init__()
@@ -627,6 +631,7 @@ class DotsOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, SupportsLoRA
631
self.config: DotsOCRConfig = vllm_config.model_config.hf_config
632
self.quant_config = vllm_config.quant_config
633
multimodal_config = vllm_config.model_config.multimodal_config
634
+ assert multimodal_config is not None
635
self.use_data_parallel = multimodal_config.mm_encoder_tp_mode == "data"
636
if isinstance(self.config.vision_config, dict):
637
vision_config = DotsVisionConfig(**self.config.vision_config)
@@ -677,6 +682,8 @@ class DotsOCRForCausalLM(nn.Module, SupportsMultiModal, SupportsPP, SupportsLoRA
682
image_grid_thw=image_grid_thw,
683
)
684
685
+ raise AssertionError
686
+
687
def _process_image_input(
688
self, image_input: DotsOCRImageInputs
689
) -> tuple[torch.Tensor, ...]:
vllm/multimodal/processing/dummy_inputs.py
+2
-1
@@ -118,8 +118,9 @@ class BaseDummyInputsBuilder(ABC, Generic[_I]):
118
width: int,
119
height: int,
120
num_images: int,
121
- overrides: ImageDummyOptions | None = None,
121
+ overrides: BaseDummyOptions | None = None,
122
) -> list[Image.Image]:
123
+ assert overrides is None or isinstance(overrides, ImageDummyOptions)
124
if num_images == 0:
125
return []
126
if overrides: