Prhub

#43100 [BugFix] Fix Humming MoE deploy error

原始 PR 作者 adotdad 合并时间 2026-06-03 00:32 文件变更 1 提交数 11 评论 6 代码增减 +3 / -2

执行摘要

修复 Humming MoE 部署时 quant config 与 schema 初始化遗漏

部署 ISTA-DASLab/Qwen3.6-35B-A3B-2Bit-GSQ 时遭遇断言错误 assert self.moe_quant_config is not None,以及 layer.input_schemas 为空。分析发现 moe_quant_config 从未被初始化,而 input_schemasweight_schemas 仅在非 Humming 格式的检查点分支中被赋值,导致 Humming 格式检查点下 schema 未初始化。

建议合并。该 PR 修复了明确的部署阻塞 bug,改动量小且经过本地验证。建议后续为该路径补充测试,防止回归。

讨论亮点
  • gemini-code-assist 指出初始修改中 self.get_fused_moe_quant_config(layer) 的返回值未被赋值,导致 self.moe_quant_config 仍为 None,并建议直接赋值。
  • jinzhen-lin 建议调用 layer.ensure_moe_quant_config_init() 方法,这是一个更简洁的封装。PR 作者接受了该建议并修改了代码。
  • jinzhen-lin 最终批准了 PR。

实现拆解

实现拆解:

  1. Schema 初始化修复:在 humming.pyprocess_weights_after_loading 方法中,将 layer.weight_schemas[sublayer_name]layer.input_schemas[sublayer_name] 的赋值语句从 if force_requant 条件块内移出(减少缩进一级),确保无论是否进行强制重量化,schema 都会被正确设置。
  2. quant config 初始化修复:在 MoE 专家创建之前,添加 layer.ensure_moe_quant_config_init() 调用,该方法会调用 get_fused_moe_quant_config 并将结果赋值给 self.moe_quant_config,从而消除后续的断言错误。
  3. 测试:未添加自动化测试,但通过手动运行指定模型验证了修复的正确性。
文件 模块 状态 重要度
vllm/model_executor/layers/quantization/humming.py 量化模块 modified 5.17

关键符号

process_weights_after_loading

关键源码片段

vllm/model_executor/layers/quantization/humming.py data-contract

修复了导致 Humming MoE 部署失败的两个关键 bug:`moe_quant_config` 未初始化导致断言失败,以及 schema 分配未覆盖所有分支导致 `input_schemas` 为空。

# -*- 文件 : vllm/model_executor/layers/quantization/humming.py -*-
​
        # 旧版: schema 赋值缩进在 force_requant 块内,导致 Humming 格式 checkpoint 下不会被赋值
        # 新版: 始终赋值 schema
        layer.weight_schemas[sublayer_name] = weight_schema
        layer.input_schemas[sublayer_name] = input_schema
​
        # force requant (origin quant setting -> fp16/bf16 -> new_quant setting)
        assert isinstance(weight_schema, HummingWeightSchema)
        force_requant = self.force_weight_schema is not None
        if force_requant and weight_schema != self.force_weight_schema:
            # ... 重量化逻辑(不变)...
​
        # prepare layer config from humming kernel
        HummingMethod.prepare_layer_meta(
            layer=layer,
            shape_n=configs["shape_n"],
            shape_k=configs["shape_k"],
            pad_n_to_multiple=256,
            pad_k_to_multiple=128,
            input_schema=input_schema,
            weight_schema=weight_schema,
            has_bias=self.moe.has_bias,
            num_experts=layer.num_experts,
            torch_dtype=layer.param_dtype,
            sublayer_name=sublayer_name,
        )
​
        # preprocess weight for inference
        HummingMethod.transform_humming_layer(layer, sublayer_name=sublayer_name)
​
    # use moe modular
    experts: HummingIndexedExperts | HummingGroupedExperts
    # 新增: 确保 moe_quant_config 已初始化
    layer.ensure_moe_quant_config_init()
    assert self.moe_quant_config is not None
    if get_humming_moe_gemm_type() == "indexed":
        experts = HummingIndexedExperts(layer, self.moe, self.moe_quant_config)
    else:
        experts = HummingGroupedExperts(layer, self.moe, self.moe_quant_config)
    self.experts = experts

评论区精华

`get_fused_moe_quant_config` 返回值未赋值 正确性

gemini-code-assist 指出自修改中调用 `self.get_fused_moe_quant_config(layer)` 但未赋值给 `self.moe_quant_config`,导致后续 `assert self.moe_quant_config is not None` 仍会失败。建议直接赋值。

结论:PR 作者随后采纳了 jinzhen-lin 的建议,改用 `layer.ensure_moe_quant_config_init()`,内部包含了赋值。 · 已解决

建议使用 `layer.ensure_moe_quant_config_init()` 正确性

jinzhen-lin 评论建议使用 `layer.ensure_moe_quant_config_init()` 替换 `self.moe_quant_config = self.get_fused_moe_quant_config(layer)`,因为这是更推荐的方法。

结论:PR 作者提交了包含该改动的版本。 · 已解决

风险与影响

风险较低。修改范围仅限于 Humming 量化层中 MoE 权重加载流程,且改动逻辑清晰(减少缩进、调用已有方法)。但缺少自动化测试覆盖,如果未来代码重构或 ensure_moe_quant_config_init 实现发生变化,可能再次引入类似问题。

修复后,使用 Humming packed quantization 的 MoE 模型(如 Qwen3.6-35B-A3B-2Bit-GSQ)可以正常部署和推理。该修复不影响其他量化方案或非 MoE 模型。

缺少测试覆盖

关联 Issue

未识别关联 Issue

当前没有检测到明确关联的 Issue 链接,后续同步到相关引用后会出现在这里。

完整报告

参与讨论