[Mypy Fix] Mypy fix for "vllm/model_executor/models/[eE][fF]" (#53381)

Signed-off-by: yewentao256 <zhyanwentao@126.com>

Wentao Ye committed Aug 22, 2026 at 15:41 UTC 811d12ee26fa119cf8faae44d80330becf1e7fe3
16 files changed +71 -84
tools/pre_commit/mypy.py
-2
@@ -112,8 +112,6 @@ SEPARATE_GROUPS = [
112 ]
113
114 EXCLUDE = [
115 - r"vllm/model_executor/models/[eE]",
116 - r"vllm/model_executor/models/[fF]",
115 r"vllm/model_executor/models/[gG]",
116 r"vllm/model_executor/models/[hH]",
117 r"vllm/model_executor/models/[iI]",
vllm/compilation/decorators.py
+4 -2
@@ -106,8 +106,10 @@ def support_torch_compile(
106 @overload
107 def support_torch_compile(
108 *,
109 - dynamic_arg_dims: dict[str, int | list[int] | dict[int, str]] | None,
110 - mark_unbacked_dims: dict[str, int | list[int]] | None,
109 + dynamic_arg_dims: dict[str, int | list[int] | dict[int, str]] | None = None,
110 + mark_unbacked_dims: dict[str, int | list[int]] | None = None,
111 + enable_if: Callable[[VllmConfig], bool] | None = None,
112 + is_encoder: bool = False,
113 ) -> Callable[[type[_T]], type[_T]]: ...
114
115
vllm/model_executor/models/eagle2_5_vl.py
+2 -1
@@ -150,6 +150,7 @@ class Eagle2_5_VLForConditionalGeneration(
150 config = vllm_config.model_config.hf_config
151 quant_config = vllm_config.quant_config
152 multimodal_config = vllm_config.model_config.multimodal_config
153 + assert multimodal_config is not None
154
155 self.config = config
156 self.multimodal_config = multimodal_config
@@ -187,7 +188,7 @@ class Eagle2_5_VLForConditionalGeneration(
188 prefix=maybe_prefix(prefix, "language_model"),
189 )
190
190 - self.img_context_token_id = None
191 + self.img_context_token_id: int | None = None
192
193 self.make_empty_intermediate_tensors = (
194 self.language_model.make_empty_intermediate_tensors
vllm/model_executor/models/ernie45_moe.py
+2 -1
@@ -127,7 +127,7 @@ class Ernie4_5_MoeMoE(nn.Module):
127 self.layer_idx = layer_idx
128 self.tp_size = get_tensor_model_parallel_world_size()
129
130 - self.moe_num_shared_experts = getattr(config, "moe_num_shared_experts", None)
130 + self.moe_num_shared_experts = getattr(config, "moe_num_shared_experts", 0)
131 self.ep_group = get_ep_group().device_group
132 self.ep_size = self.ep_group.size()
133 self.n_routed_experts: int = config.moe_num_experts
@@ -163,6 +163,7 @@ class Ernie4_5_MoeMoE(nn.Module):
163 torch.empty(config.moe_num_experts, dtype=torch.float32)
164 )
165
166 + self.shared_experts: Ernie4_5_MoeMLP | None
167 if self.has_shared_experts:
168 intermediate_size = (
169 config.moe_intermediate_size * config.moe_num_shared_experts
vllm/model_executor/models/ernie45_vl.py
+27 -20
@@ -1076,7 +1076,7 @@ class Ernie4_5VLMultiModalProcessor(BaseMultiModalProcessor[Ernie4_5_VLProcessin
1076 def _pixel_values_norm(
1077 self,
1078 pixel_values: torch.Tensor,
1079 - mm_kwargs: object,
1079 + mm_kwargs: Mapping[str, object],
1080 ) -> torch.Tensor:
1081 hf_config = self.info.get_hf_config()
1082 vision_config = hf_config.vision_config
@@ -1125,6 +1125,7 @@ class Ernie4_5VLMultiModalProcessor(BaseMultiModalProcessor[Ernie4_5_VLProcessin
1125
1126 prompt_text = self.dummy_inputs.get_dummy_text(mm_items.get_all_counts())
1127
1128 + mm_data = dict(mm_data)
1129 if "images" not in mm_data:
1130 mm_data["images"] = []
1131 if "videos" not in mm_data:
@@ -1136,15 +1137,15 @@ class Ernie4_5VLMultiModalProcessor(BaseMultiModalProcessor[Ernie4_5_VLProcessin
1137 hf_processor, "supports_video_metadata", False
1138 )
1139
1139 - if mm_data["videos"] and not supports_video_metadata:
1140 + videos = mm_data["videos"]
1141 + assert isinstance(videos, Sequence)
1142 + if videos and not supports_video_metadata:
1143 # Old HF processor, unwrap tuple to pure frames
1144 logger.warning_once(
1145 "HF processor doesn't support video metadata. "
1146 "Timestamps will NOT be rendered. Please upgrade the model."
1147 )
1145 - mm_data["videos"] = [
1146 - v[0] if isinstance(v, tuple) else v for v in mm_data["videos"]
1147 - ]
1148 + mm_data["videos"] = [v[0] if isinstance(v, tuple) else v for v in videos]
1149
1150 processor_output = self.info.ctx.call_hf_processor(
1151 hf_processor,
@@ -1286,6 +1287,7 @@ class Ernie4_5_VLDummyInputsBuilder(BaseDummyInputsBuilder[Ernie4_5_VLProcessing
1287
1288 image_overrides = mm_options.get("image")
1289 video_overrides = mm_options.get("video")
1290 + assert video_overrides is None or isinstance(video_overrides, VideoDummyOptions)
1291
1292 return {
1293 "image": self._get_dummy_images(
@@ -1541,10 +1543,14 @@ class Ernie4_5_VLMoeForConditionalGeneration(
1543
1544 offset = mm_feature.mm_position.offset
1545 if mm_feature.modality == "image":
1544 - t, h, w = mm_feature.data["image_grid_thw"].data.tolist()
1546 + grid_thw = mm_feature.data["image_grid_thw"].data
1547 + assert isinstance(grid_thw, torch.Tensor)
1548 + t, h, w = grid_thw.tolist()
1549 yield offset, t, h // spatial_conv_size, w // spatial_conv_size
1550 elif mm_feature.modality == "video":
1547 - t, h, w = mm_feature.data["video_grid_thw"].data.tolist()
1551 + grid_thw = mm_feature.data["video_grid_thw"].data
1552 + assert isinstance(grid_thw, torch.Tensor)
1553 + t, h, w = grid_thw.tolist()
1554 yield (
1555 offset,
1556 t // temporal_conv_size,
@@ -1563,12 +1569,11 @@ class Ernie4_5_VLMoeForConditionalGeneration(
1569 if pixel_values is None:
1570 return None
1571
1566 - if pixel_values is not None:
1567 - return Ernie4_5_VLImagePixelInputs(
1568 - type="pixel_values",
1569 - pixel_values=pixel_values,
1570 - image_grid_thw=image_grid_thw,
1571 - )
1572 + return Ernie4_5_VLImagePixelInputs(
1573 + type="pixel_values",
1574 + pixel_values=pixel_values,
1575 + image_grid_thw=image_grid_thw,
1576 + )
1577
1578 def _parse_and_validate_video_input(
1579 self, **kwargs: object
@@ -1579,12 +1584,11 @@ class Ernie4_5_VLMoeForConditionalGeneration(
1584 if pixel_values_videos is None:
1585 return None
1586
1582 - if pixel_values_videos is not None:
1583 - return Ernie4_5_VLVideoPixelInputs(
1584 - type="pixel_values_videos",
1585 - pixel_values_videos=pixel_values_videos,
1586 - video_grid_thw=video_grid_thw,
1587 - )
1587 + return Ernie4_5_VLVideoPixelInputs(
1588 + type="pixel_values_videos",
1589 + pixel_values_videos=pixel_values_videos,
1590 + video_grid_thw=video_grid_thw,
1591 + )
1592
1593 # -- SupportsEncoderCudaGraph protocol methods --
1594 #
@@ -1748,6 +1752,7 @@ class Ernie4_5_VLMoeForConditionalGeneration(
1752 # the actual batch grid_thw, then scatter the post-merge embeddings.
1753 # Ernie only uses the single "default" encoder path.
1754 output = outputs["default"]
1755 + assert batch_mm_kwargs is not None
1756 grid_thw_cpu = batch_mm_kwargs["image_grid_thw"]
1757 grid_thw = grid_thw_cpu.to(output.device, non_blocking=True)
1758 # The valid token count slices the graph output for the eager
@@ -1799,7 +1804,9 @@ class Ernie4_5_VLMoeForConditionalGeneration(
1804 return video_embeds.split(sizes.tolist())
1805
1806 def _parse_and_validate_multimodal_inputs(self, **kwargs: object) -> dict:
1802 - modalities = {}
1807 + modalities: dict[
1808 + str, Ernie4_5_VLImageInputs | Ernie4_5_VLVideoInputs | None
1809 + ] = {}
1810
1811 # Preserve the order of modalities if there are multiple of them
1812 # from the order of kwargs.
vllm/model_executor/models/ernie45_vl_moe.py
+4 -2
@@ -232,6 +232,7 @@ class Ernie4_5_VLMoeMoE(nn.Module):
232
233 assert text_moe_layer_start_index <= text_moe_layer_end_index
234
235 + self.shared_experts: Ernie4_5_VLMoeMLP | None
236 if self.has_shared_experts:
237 intermediate_size = (
238 config.moe_intermediate_size[0] * config.moe_num_shared_experts
@@ -771,9 +772,10 @@ class Ernie4_5_VLMoeForCausalLM(nn.Module, SupportsPP):
772 if is_pp_missing_parameter(name, self):
773 continue
774 # Remapping the name of FP8 kv-scale.
774 - name = maybe_remap_kv_scale_name(name, params_dict)
775 - if name is None:
775 + remapped_name = maybe_remap_kv_scale_name(name, params_dict)
776 + if remapped_name is None:
777 continue
778 + name = remapped_name
779
780 param = params_dict[name]
781
vllm/model_executor/models/exaone4_5.py
+1
@@ -332,6 +332,7 @@ class Exaone4_5_ForConditionalGeneration(Qwen2_5_VLForConditionalGeneration):
332 config: Exaone4_5_Config = vllm_config.model_config.hf_config
333 self.vllm_config = vllm_config
334 multimodal_config = vllm_config.model_config.multimodal_config
335 + assert multimodal_config is not None
336
337 self.use_data_parallel = multimodal_config.mm_encoder_tp_mode == "data"
338 self.config = config
vllm/model_executor/models/exaone4_5_mtp.py
+1 -8
@@ -48,17 +48,11 @@ class Exaone4_5MultiTokenPredictor(ExaoneMoeMultiTokenPredictor):
48
49 model_config = vllm_config.model_config
50 quant_config = vllm_config.quant_config
51 - lora_config = vllm_config.lora_config
51 config = model_config.hf_config
52 text_config = config.text_config
53
54 self.config = config
56 - lora_vocab = (
57 - (lora_config.lora_extra_vocab_size * (lora_config.max_loras or 1))
58 - if lora_config
59 - else 0
60 - )
61 - self.vocab_size = config.vocab_size + lora_vocab
55 + self.vocab_size = config.vocab_size
56 self.org_vocab_size = config.vocab_size
57
58 self.mtp_start_layer_idx = text_config.num_hidden_layers
@@ -67,7 +61,6 @@ class Exaone4_5MultiTokenPredictor(ExaoneMoeMultiTokenPredictor):
61 self.embed_tokens = VocabParallelEmbedding(
62 self.vocab_size,
63 text_config.hidden_size,
70 - org_num_embeddings=config.vocab_size,
64 )
65
66 self.fc = ColumnParallelLinear(
vllm/model_executor/models/exaone_moe.py
+3 -20
@@ -41,7 +41,6 @@ from vllm.model_executor.layers.logits_processor import LogitsProcessor
41 from vllm.model_executor.layers.quantization import QuantizationConfig
42 from vllm.model_executor.layers.rotary_embedding import get_rope
43 from vllm.model_executor.layers.vocab_parallel_embedding import (
44 - DEFAULT_VOCAB_PADDING_SIZE,
44 ParallelLMHead,
45 VocabParallelEmbedding,
46 )
@@ -112,6 +111,7 @@ class ExaoneMoe(nn.Module):
111 self.n_physical_experts = self.n_logical_experts + self.n_redundant_experts
112 self.n_local_physical_experts = self.n_physical_experts // self.ep_size
113
114 + self.shared_experts: ExaoneMoeGatedMLP | None
115 if getattr(config, "num_shared_experts", 0) > 0:
116 intermediate_size = config.moe_intermediate_size * config.num_shared_experts
117 self.shared_experts = ExaoneMoeGatedMLP(
@@ -292,7 +292,7 @@ class ExaoneMoeDecoderLayer(nn.Module):
292 config: PretrainedConfig,
293 cache_config: CacheConfig | None = None,
294 quant_config: QuantizationConfig | None = None,
295 - is_mtp: bool = None,
295 + is_mtp: bool = False,
296 prefix: str = "",
297 ) -> None:
298 super().__init__()
@@ -381,26 +381,19 @@ class ExaoneMoeModel(nn.Module):
381 config = vllm_config.model_config.hf_config
382 cache_config = vllm_config.cache_config
383 quant_config = vllm_config.quant_config
384 - lora_config = vllm_config.lora_config
384 self.num_redundant_experts = (
385 vllm_config.parallel_config.eplb_config.num_redundant_experts
386 )
387
388 self.config = config
389 self.quant_config = quant_config
391 - lora_vocab = (
392 - (lora_config.lora_extra_vocab_size * (lora_config.max_loras or 1))
393 - if lora_config
394 - else 0
395 - )
396 - self.vocab_size = config.vocab_size + lora_vocab
390 + self.vocab_size = config.vocab_size
391 if get_pp_group().is_first_rank or (
392 config.tie_word_embeddings and get_pp_group().is_last_rank
393 ):
394 self.embed_tokens = VocabParallelEmbedding(
395 self.vocab_size,
396 config.hidden_size,
403 - org_num_embeddings=config.vocab_size,
397 quant_config=quant_config,
398 )
399 else:
@@ -497,10 +490,8 @@ class ExaoneMoeForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
490 super().__init__()
491 config = vllm_config.model_config.hf_config.get_text_config()
492 quant_config = vllm_config.quant_config
500 - lora_config = vllm_config.lora_config
493
494 self.config = config
503 - self.lora_config = lora_config
495 self.quant_config = quant_config
496
497 self.model = ExaoneMoeModel(
@@ -509,17 +500,9 @@ class ExaoneMoeForCausalLM(nn.Module, SupportsLoRA, SupportsPP):
500 )
501 if get_pp_group().is_last_rank:
502 self.unpadded_vocab_size = config.vocab_size
512 - if lora_config:
513 - self.unpadded_vocab_size += lora_config.lora_extra_vocab_size
503 self.lm_head = ParallelLMHead(
504 self.unpadded_vocab_size,
505 config.hidden_size,
517 - org_num_embeddings=config.vocab_size,
518 - padding_size=DEFAULT_VOCAB_PADDING_SIZE
519 - # We need bigger padding if using lora for kernel
520 - # compatibility
521 - if not lora_config
522 - else lora_config.lora_vocab_padding_size,
506 quant_config=quant_config,
507 )
508 if config.tie_word_embeddings:
vllm/model_executor/models/exaone_moe_mtp.py
+1 -8
@@ -46,16 +46,10 @@ class ExaoneMoeMultiTokenPredictor(nn.Module):
46
47 model_config = vllm_config.model_config
48 quant_config = vllm_config.quant_config
49 - lora_config = vllm_config.lora_config
49 config = model_config.hf_config
50
51 self.config = config
53 - lora_vocab = (
54 - (lora_config.lora_extra_vocab_size * (lora_config.max_loras or 1))
55 - if lora_config
56 - else 0
57 - )
58 - self.vocab_size = config.vocab_size + lora_vocab
52 + self.vocab_size = config.vocab_size
53 self.org_vocab_size = config.vocab_size
54
55 self.mtp_start_layer_idx = config.num_hidden_layers
@@ -64,7 +58,6 @@ class ExaoneMoeMultiTokenPredictor(nn.Module):
58 self.embed_tokens = VocabParallelEmbedding(
59 self.vocab_size,
60 config.hidden_size,
67 - org_num_embeddings=config.vocab_size,
61 )
62
63 self.fc = ColumnParallelLinear(
vllm/model_executor/models/extract_hidden_states.py
+4 -2
@@ -231,7 +231,7 @@ class CacheOnlyAttentionLayer(nn.Module, AttentionLayerBase):
231 head_size: int,
232 cache_config: CacheConfig | None = None,
233 prefix: str = "",
234 - attn_type: str = AttentionType.DECODER,
234 + attn_type: AttentionType = AttentionType.DECODER,
235 ):
236 super().__init__()
237
@@ -329,7 +329,9 @@ class ExtractHiddenStatesModel(nn.Module):
329 super().__init__()
330
331 self.vllm_config = vllm_config
332 - self.hf_config = vllm_config.speculative_config.draft_model_config.hf_config
332 + speculative_config = vllm_config.speculative_config
333 + assert speculative_config is not None
334 + self.hf_config = speculative_config.draft_model_config.hf_config
335 self.hidden_size = vllm_config.model_config.get_hidden_size()
336 self.target_num_hidden_layers = (
337 vllm_config.model_config.get_total_num_hidden_layers()
vllm/model_executor/models/falcon.py
+1
@@ -413,6 +413,7 @@ class FalconModel(nn.Module):
413 else:
414 hidden_states = self.embed_input_ids(input_ids)
415 else:
416 + assert intermediate_tensors is not None
417 hidden_states = intermediate_tensors["hidden_states"]
418 for layer in islice(self.h, self.start_layer, self.end_layer):
419 hidden_states = layer(positions, hidden_states)
vllm/model_executor/models/fireredasr2.py
+2 -1
@@ -12,7 +12,7 @@ from transformers import (
12 )
13
14 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
15 -from vllm.config.multimodal import BaseDummyOptions
15 +from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
16 from vllm.config.speech_to_text import SpeechToTextParams
17 from vllm.inputs import MultiModalDataDict, PromptType
18 from vllm.logger import init_logger
@@ -216,6 +216,7 @@ class FireRedASR2DummyInputsBuilder(BaseDummyInputsBuilder[FireRedASR2Processing
216 num_audios = mm_counts.get("audio", 0)
217
218 audio_overrides = mm_options.get("audio")
219 + assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
220
221 ret = {
222 "audio": self._get_dummy_audios(
vllm/model_executor/models/fireredlid.py
+8 -11
@@ -18,14 +18,13 @@ from __future__ import annotations
18 from collections.abc import Iterable, Mapping, Sequence
19 from typing import Annotated, Literal
20
21 -import numpy as np
21 import torch
22 from torch import nn
23 from transformers import BatchFeature
24
25 from vllm.config import ModelConfig, VllmConfig
27 -from vllm.config.multimodal import BaseDummyOptions
28 -from vllm.config.speech_to_text import SpeechToTextConfig
26 +from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
27 +from vllm.config.speech_to_text import SpeechToTextConfig, SpeechToTextParams
28 from vllm.distributed import get_tensor_model_parallel_world_size
29 from vllm.inputs import MultiModalDataDict, PromptType
30 from vllm.logger import init_logger
@@ -431,6 +430,7 @@ class FireRedLIDDummyInputsBuilder(BaseDummyInputsBuilder[FireRedLIDProcessingIn
430 audio_len = feature_extractor.chunk_length * sampling_rate
431 num_audios = mm_counts.get("audio", 0)
432 audio_overrides = mm_options.get("audio")
433 + assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
434 return {
435 "audio": self._get_dummy_audios(
436 length=audio_len,
@@ -747,13 +747,7 @@ class FireRedLIDForConditionalGeneration(
747 @classmethod
748 def get_generation_prompt(
749 cls,
750 - audio: np.ndarray,
751 - stt_config: SpeechToTextConfig,
752 - model_config: ModelConfig,
753 - language: str | None,
754 - task_type: Literal["transcribe", "translate"],
755 - request_prompt: str,
756 - to_language: str | None,
750 + stt_params: SpeechToTextParams,
751 ) -> PromptType:
752 """Build the prompt for the FireRedLID encoder-decoder model.
753
@@ -764,7 +758,10 @@ class FireRedLIDForConditionalGeneration(
758 "encoder_prompt": {
759 "prompt": "",
760 "multi_modal_data": {
767 - "audio": (audio, int(stt_config.sample_rate)),
761 + "audio": (
762 + stt_params.audio,
763 + int(stt_params.stt_config.sample_rate),
764 + ),
765 },
766 },
767 "decoder_prompt": {
vllm/model_executor/models/funasr.py
+8 -5
@@ -14,7 +14,7 @@ from transformers import (
14 )
15
16 from vllm.config import ModelConfig, SpeechToTextConfig, VllmConfig
17 -from vllm.config.multimodal import BaseDummyOptions
17 +from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
18 from vllm.config.speech_to_text import SpeechToTextParams
19 from vllm.distributed import get_tensor_model_parallel_world_size
20 from vllm.inputs import MultiModalDataDict, PromptType
@@ -261,8 +261,8 @@ class SinusoidalPositionEncoder(torch.nn.Module):
261
262 def encode(
263 self,
264 - positions: torch.Tensor = None,
265 - depth: int = None,
264 + positions: torch.Tensor,
265 + depth: int,
266 dtype: torch.dtype = torch.float32,
267 ):
268 batch_size = positions.size(0)
@@ -573,8 +573,8 @@ class Transformer(nn.Module):
573 ]
574 )
575
576 - def forward(self, hidden_states: torch.Tensor, ilens: int = 0):
577 - max_len = max(ilens)
576 + def forward(self, hidden_states: torch.Tensor, ilens: torch.Tensor):
577 + max_len = ilens.max()
578 hidden_states = hidden_states[:, :max_len, :]
579 batch_size, seq_len, dim = hidden_states.size()
580 chunk_num = (seq_len - 1) // self.k + 1
@@ -682,6 +682,8 @@ class FunASRModel(nn.Module):
682 self.feat_permute = False
683
684 if self.feat_permute:
685 + if not isinstance(speech, torch.Tensor):
686 + raise NotImplementedError("List audio inputs cannot be permuted")
687 encoder_out, encoder_out_lens = self.encoder.audio_encoder(
688 speech.permute(0, 2, 1), speech_lengths
689 )
@@ -739,6 +741,7 @@ class FunASRDummyInputsBuilder(BaseDummyInputsBuilder[FunASRProcessingInfo]):
741 num_audios = mm_counts.get("audio", 0)
742
743 audio_overrides = mm_options.get("audio")
744 + assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
745
746 return {
747 "audio": self._get_dummy_audios(
vllm/model_executor/models/funaudiochat.py
+3 -1
@@ -26,7 +26,7 @@ from transformers.feature_extraction_utils import BatchFeature
26 from transformers.modeling_outputs import BaseModelOutput
27
28 from vllm.config import VllmConfig
29 -from vllm.config.multimodal import BaseDummyOptions
29 +from vllm.config.multimodal import AudioDummyOptions, BaseDummyOptions
30 from vllm.inputs import MultiModalDataDict
31 from vllm.model_executor.layers.attention.mm_encoder_attention import MMEncoderAttention
32 from vllm.model_executor.layers.linear import QKVParallelLinear, RowParallelLinear
@@ -600,6 +600,7 @@ class FunAudioChatDummyInputsBuilder(
600 num_audios = int(mm_counts.get("audio", 0))
601
602 audio_overrides = mm_options.get("audio")
603 + assert audio_overrides is None or isinstance(audio_overrides, AudioDummyOptions)
604 return {
605 "audio": self._get_dummy_audios(
606 length=audio_len,
@@ -635,6 +636,7 @@ class FunAudioChatMultiModalProcessor(
636 processed_data = BatchFeature({"input_ids": input_ids})
637 processed_data.update(passthrough_data)
638 return processed_data
639 + assert isinstance(audios, Sequence)
640
641 feature_extractor = self.info.get_feature_extractor(**hf_processor_mm_kwargs)
642 sr = int(feature_extractor.sampling_rate)