Prhub

#45544 [Bugfix] Default tie_weights to sharing the weight (fix tied quantized embeddings, e.g. ModelOpt Gemma4)

原始 PR 作者 mikekg 合并时间 2026-06-26 08:46 文件变更 1 提交数 2 评论 1 代码增减 +10 / -3

执行摘要

修复量化模型 tied embeddings 加载崩溃

修复 #45543:ModelOpt 量化模型(NVFP4/FP8 如 Gemma4)在 tie_word_embeddings: true 时加载崩溃,EngineCore 启动时报 NotImplementedError。这是由于 #39612 重构后,ParallelLMHead.tie_weights 委托给 quant_method.tie_weights,但基类抛出异常,且量化线性方法均未实现该函数。

建议优先合并此修复,并确认 Cherry-pick 到 v0.24.0 稳定版(Issue 评论指出该修复未进入 v0.24.0,导致稳定版用户无法使用 ModelOpt 量化模型)。

讨论亮点

讨论较少,两位 reviewer(benchislett、mgoin)均直接批准,无额外评论。Issue 中确认了问题复现路径和修复思路。

实现拆解

  1. 定位问题:在 vllm/model_executor/layers/quantization/base_config.py 中,QuantizeMethodBase.tie_weights 抛出 NotImplementedError;而 ParallelLMHead.tie_weightsvllm/model_executor/layers/vocab_parallel_embedding.py 中委托给该方法。所有量化线性方法(ModelOptNvFp4LinearMethodModelOptFp8LinearMethodUnquantizedLinearMethod)均未重写 tie_weights,导致量化模型加载失败。
  2. 修改基类默认行为:将 QuantizeMethodBase.tie_weightsraise NotImplementedError 改为默认实现:layer.weight = embed_tokens.weight; return layer,即直接共享权重张量。这与 #39612 前 ParallelLMHead.tie_weights 直接赋值的行为一致,也是 UnquantizedEmbeddingMethod 当前的做法。
  3. 保留覆盖能力:量化方法若需要特殊处理(如 GGUF 的 repacked weights),仍可重写 tie_weights 方法。
文件 模块 状态 重要度
vllm/model_executor/layers/quantization/base_config.py 量化 modified 7.18

关键符号

QuantizeMethodBase.tie_weights

关键源码片段

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

核心修复文件,修改 QuantizeMethodBase.tie_weights 的默认行为从抛出 NotImplementedError 改为共享权重张量。

# vllm/model_executor/layers/quantization/base_config.pyclass QuantizeMethodBase(ABC):
    """Base class for different quantized methods."""
​
    # ... 其他方法 ...
​
    # 修复前:抛出 NotImplementedError,导致量化模型带 tied embeddings 时崩溃
    # 修复后:默认直接共享权重,恢复 #39612 前的行为
    def tie_weights(self, layer: torch.nn.Module, embed_tokens: torch.nn.Module):
        """Tie ``layer``'s weight to ``embed_tokens``' weight.        The default shares the weight tensor, which is the standard behavior for
        tied word embeddings and matches what ``ParallelLMHead.tie_weights`` did
        directly before quantization methods became responsible for it.
        Quantization methods that need special weight handling (e.g. repacked
        weights) override this.        Expects create_weights to have been called before on the layer."""
        layer.weight = embed_tokens.weight
        return layer
​
    # ...

评论区精华

没有提炼出高价值讨论线程

当前评论区没有形成足够清晰的争议点或结论,后续有更多讨论时会体现在这里。

风险与影响

风险较低。修改仅改变基类默认行为(从抛出异常变为共享权重),倒退到 #39612 前的行为。对于已正确重写 tie_weights 的方法(如 UnquantizedEmbeddingMethod 和可选的 GGUF 方法)无影响;未重写的方法现在获得一个合理的默认行为。唯一风险是某些量化方法之前依赖基类抛出异常以避免误调用,但 tie_weights 设计意图就是作为默认实现,该风险极低。

影响范围明确:所有 tie_word_embeddings: true 的量化模型(特别是 ModelOpt NVFP4/FP8 的 Gemma 系列)将能正常加载,不再崩溃。非量化模型和已正确实现 tie_weights 的量化方法无影响。用户无需更改配置或代码。

核心路径变更 回归隐患

关联 Issue

#45543 [Bug]: Tied word embeddings (tie_word_embeddings) crash with NotImplementedError for ModelOpt-quantized models after #39612

完整报告

参与讨论