Prhub

#53466 [Mypy Fix] Mypy fix for "vllm/model_executor/models/[tT]"

原始 PR 作者 ZHIHANCHEN03 合并时间 2026-08-26 22:12 文件变更 3 提交数 4 评论 11 代码增减 +14 / -9

执行摘要

修复 telechat2/terratorch 的 mypy 类型错误并调整 EXCLUDE 前缀

作为 #48490 中按字母拆分 mypy 修复工作的一部分,本 PR 继续处理 [tT] 分组的 10 个 mypy 错误。PR body 明确指出:terratorch.py 需注解 loaded_buffers;telechat2.py 需窄化 layer.self_attn / layer.mlp 类型,因为 Module.__getattr__ 返回 Tensor | Module,导致子模块属性检查失败。同时 EXCLUDE 前缀模式 models/[tT] 会误覆盖 models/transformers 包,因此需收窄为 models/transformers 以确保全仓检查通过。

该 PR 值得快速浏览,特别是 telechat2.py 中类型窄化与 register_parameter 的用法,可为类似 mypy 修复提供参考。若关注 mypy 基础设施演进,可关注 #48490 系列拆分。

讨论亮点

reviewer yewentao256 提出两处简洁性建议:在 tools/pre_commit/mypy.py 中建议移除解释注释,直接使用 r"vllm/model_executor/models/transformers";在 telechat2.py 中建议移除 attribute_map 的说明注释,仅保留 # type: ignore[misc]。作者已在 commit 8e3e891 中采纳这些建议,并重新验证 mypy 通过。

实现拆解

  1. telechat2.py 类型窄化与 bias 移除重构:新增导入 LlamaAttention、LlamaMLP;在 __init__ 中,将 if not isinstance(layer, PPMissingLayer) 改为 continue 早退,然后对 self_attn 和 mlp 分支做 assert isinstance,便于 mypy 推断具体类型。bias 移除从 attribute.bias = None 改为 register_parameter("bias", None),与 linear.py 惯例一致。对 attribute_map 赋值添加 # type: ignore[misc] 抑制误报。
  2. terratorch.py 注解补充:仅将 loaded_buffers = [] 改为 loaded_buffers: list[str] = [],明确类型。
  3. tools/pre_commit/mypy.py EXCLUDE 收窄:将 r"vllm/model_executor/models/[tT]" 改为 r"vllm/model_executor/models/transformers",避免误排除 [tT] 下已修复文件,同时继续排除仍有错误的 models/transformers 包。
  4. 测试与验证:未新增测试文件;通过本地运行 pre-commit run mypy-3.10/3.11/3.12/3.13 --all-files 验证 10 个错误全部消失,全仓检查通过。
文件 模块 状态 重要度
vllm/model_executor/models/telechat2.py 模型模块 modified 6.79
vllm/model_executor/models/terratorch.py 模型模块 modified 4.7
tools/pre_commit/mypy.py 类型检查 modified 4.72

关键符号

TeleChat2Model.__init__ terratorch.load_weights

关键源码片段

vllm/model_executor/models/telechat2.py core-logic

核心变更文件,修复 8 个 mypy 错误,涉及类型窄化、bias 移除方式和 attribute_map 的 ignore 注释。

# vllm/model_executor/models/telechat2.py
from .llama import LlamaAttention, LlamaDecoderLayer, LlamaMLP
​
class TeleChat2Model(LlamaModel):
    def __init__(self, *, vllm_config, prefix=""):
        # ... 初始化配置 ...
        for layer in self.layers:
            if isinstance(layer, PPMissingLayer):
                continue
            # 类型窄化:mypy 需要明确具体子类才能检查内部属性
            self_attn = layer.self_attn
            mlp = layer.mlp
            assert isinstance(self_attn, LlamaAttention)
            assert isinstance(mlp, LlamaMLP)
            # 使用 register_parameter 清除 bias,保持与 nn.Module 行为一致
            self_attn.qkv_proj.register_parameter("bias", None)
            self_attn.qkv_proj.skip_bias_add = True
            mlp.gate_up_proj.register_parameter("bias", None)
            mlp.gate_up_proj.skip_bias_add = True
​
        # attribute_map 是 PretrainedConfig 上的 ClassVar,实例级赋值是刻意的
        vllm_config.model_config.hf_config.attribute_map = { # type: ignore[misc]
            "num_hidden_layers": "n_layer",
            "num_attention_heads": "n_head",
            "intermediate_size": "ffn_hidden_size",
            "rms_norm_eps": "layer_norm_epsilon",
        }
vllm/model_executor/models/terratorch.py type-annotation

补充 loaded_buffers 的类型注解,修复 1 个 mypy 错误。

# vllm/model_executor/models/terratorch.py
    def load_weights(self, weights):
        params_list = []
        model_buffers = dict(self.named_buffers())
        # 明确列表元素类型,消除 mypy 对空列表的推断歧义
        loaded_buffers: list[str] = []
        ...
        for key, value in weights:
            ...
                    if name in model_buffers:
                        ...
                        loaded_buffers.append(name)
tools/pre_commit/mypy.py configuration

调整 EXCLUDE 前缀,确保全仓 mypy 检查通过并正确覆盖 [tT] 分组。

# tools/pre_commit/mypy.py
EXCLUDE = [
    ...
    # [tT] 分组已修复,但 transformers 包仍有错误,故单独排除
    r"vllm/model_executor/models/transformers",
    ...
]

评论区精华

mypy.py 注释简化 style

reviewer 建议移除不必要的解释注释,直接使用 `r"vllm/model_executor/models/transformers"`。

结论:作者采纳,移除了注释。 · 已解决

telechat2.py 注释简化 style

reviewer 建议移除 attribute_map 的说明注释,仅保留 type: ignore[misc]。

结论:作者采纳,移除了注释。 · 已解决

风险与影响

  • 类型断言风险:telechat2.py 中新增的 assert isinstance(self_attn, LlamaAttention) 和 assert isinstance(mlp, LlamaMLP) 在运行时若类型不符会抛出 AssertionError。但 PR 已论证 TeleChat2Model 未传 layer_type,默认使用 LlamaDecoderLayer,其 attn_layer_type 默认为 LlamaAttention,mlp 恒为 LlamaMLP,因此风险较低。
  • EXCLUDE 收窄风险:将 [tT] 前缀收窄为 models/transformers 后,teleflm.py 等 [tT] 文件开始被 mypy 完整检查,若这些文件存在潜在未修复错误,可能导致未来 CI 暴露问题。但作者已验证当前通过。
  • 无测试覆盖:此 PR 未修改测试文件,但属于纯类型注解与重构,不改变运行时行为,风险可控。

影响范围限于 [tT] 字母分组的模型文件,主要为类型检查和构建工具配置调整,不改变模型推理行为。对维护者而言,减少 mypy 错误数量是渐进式质量改进;对下游用户无功能影响。

无测试覆盖 类型断言运行时风险 EXCLUDE 收窄影响面

关联 Issue

#48490 [Mypy Fix] Split mypy work

完整报告

参与讨论