Prhub

#38517 [Bugfix][Quantization] Fix PerTensorScale loading with tuple shard_id in MergedColumnParallelLinear

原始 PR 作者 kkyyxhll 合并时间 2026-04-07 23:16 文件变更 1 提交数 1 评论 8 代码增减 +9 / -1

执行摘要

修复 MergedColumnParallelLinear 中 PerTensorScale 参数在 tuple shard_id 时的加载错误,解决 Qwen3.5 模型 FP8 静态逐张量量化输出乱码问题。

该PR旨在解决issue #38197中报告的问题:Qwen3.5模型(包括Dense和MoE变体)在使用FP8静态逐张量量化(compressed-tensors)时输出乱码。根本原因是MergedColumnParallelLinear.weight_loader_v2函数在处理PerTensorScaleParameter时,当loaded_shard_id为tuple类型(如(0,1,2))时,错误地硬编码shard_id=0,导致只有第一个scale槽位被填充,其余槽位保持初始化值torch.finfo(torch.float32).min(约-3.4e38)。这破坏了权重数据,导致输出乱码。

该PR值得精读,因为它揭示了一个在融合线性层中处理量化scale参数的微妙bug。关注点:

  1. 理解MergedColumnParallelLinear如何支持tuple shard_id以处理融合投影(如Qwen3.5的in_proj_qkvz)。
  2. 学习PerTensorScaleParameter在量化权重加载中的角色。
  3. 注意bug的根因:硬编码shard_id=0忽略了tuple的语义,导致scale未正确传播。
讨论亮点

review讨论较少,但包含关键点:

  1. 审阅者yewentao256要求提供e2e lm_eval结果以确保不损害准确性,作者随后提供了Qwen3.5-9B在GSM8K任务上的测试结果(exact_match从0.876提升到0.884),证明修复有效且无回归。
  2. 审阅者最终批准PR(LGTM)。没有出现设计争议或未解决疑虑。

实现拆解

修改仅涉及一个文件vllm/model_executor/layers/linear.py中的weight_loader_v2函数。关键改动是:当loaded_shard_id为tuple时,不再硬编码shard_id=0,而是遍历tuple中的每个索引,为每个索引调用param.load_merged_column_weight。具体来说,在if isinstance(param, PerTensorScaleParameter)分支中,新增了条件判断:如果loaded_shard_id是tuple,则遍历每个idx并加载;否则保持原行为(shard_id=0)。这确保了PerTensorScaleParameter能正确应用于tuple指定的所有分区。

文件 模块 状态 重要度
vllm/model_executor/layers/linear.py model_executor/layers modified 9.0

关键符号

MergedColumnParallelLinear.weight_loader_v2 PerTensorScaleParameter.load_merged_column_weight

分析完成后,这里会展示 LLM 生成的相对完整源码片段和详细注释。

评论区精华

修复正确性验证 正确性

审阅者 yewentao256 要求提供 e2e lm_eval 结果以确保修复不损害准确性。

结论:作者提供了 Qwen3.5-9B 在 GSM8K 任务上的测试结果,显示 exact_match 从 0.876 提升到 0.884,证明修复有效且无回归。 · 已解决

风险与影响

风险较低:

  1. 变更范围极小(仅10行改动),逻辑清晰,直接针对已知bug。
  2. 回归风险低:修复仅影响PerTensorScaleParameter在tuple shard_id场景下的行为,其他场景(如int shard_id或非PerTensorScaleParameter)保持不变。
  3. 作者已通过测试验证修复效果,包括Qwen3.5多个模型变体和量化配置,并提供了lm_eval结果。
  4. 潜在风险:如果其他模型也使用类似tuple shard_id的融合投影但未被测试覆盖,可能存在未发现的影响,但鉴于变更的针对性,这种风险较小。

影响范围:

  1. 用户影响:修复了Qwen3.5模型(Dense和MoE)在使用FP8静态逐张量量化时的输出乱码问题,提升了模型可用性和准确性。
  2. 系统影响:仅影响权重加载逻辑,对推理性能无直接影响。
  3. 团队影响:解决了特定量化配置下的关键bug,减少了用户支持负担。影响程度:中等,因为bug仅影响特定模型(Qwen3.5)和特定量化配置(FP8静态逐张量),但对该配置的用户至关重要。
量化参数处理错误 模型特定配置影响

关联 Issue

#38197 [Bug]: Qwen3.5-dense wfp8afp8 w: per-tensor a: per-tensor Output garbled text, but in sglang is norm

完整报告

参与讨论