Prhub

#47797 [Bugfix] Allocate HY V3 expert_bias in float32 to prevent silent downcasting

原始 PR 作者 aoright 合并时间 2026-07-08 19:25 文件变更 1 提交数 3 评论 2 代码增减 +3 / -1

执行摘要

修复 HY V3 路由器 expert_bias 精度塌陷

Issue #47777 报告 HY V3 的 expert_biasset_default_torch_dtype 为 bf16/fp16 环境下分配为 16-bit,而 checkpoint 存储的是 float32,load_weights 通过 param.data.copy_ 静默降精度。该偏差作为 e_score_correction_bias 参与 GroupedTopKRouter 的 top-k 选择,边界 token 的专家路由可能因此翻转,属于隐蔽的精度回归。

值得合并的低成本高价值修复。建议在团队内推广此类模式:所有参与权重加载和路由决策的参数应显式指定 fp32,避免默认 dtype 引入精度塌陷。

讨论亮点

reviewer jeejeelee 要求删除随附的单元测试文件 tests/models/test_hy_v3_expert_bias.py,作者在后续 commit 中移除了该文件。未对核心修复逻辑产生争议。

实现拆解

  1. 修改 HYV3MoEFused 构造函数vllm/model_executor/models/hy_v3.py 第 180 行):将 expert_bias 的分配从 torch.empty(config.num_experts) 改为 torch.empty(config.num_experts, dtype=torch.float32)
  2. 移除调试测试文件:在 review 中 reviewer 要求删除 tests/models/test_hy_v3_expert_bias.py(该测试验证分配和 copy_ 行为),已在第二轮 commit 中清理。
  3. 合并 main 分支:第三轮 commit 执行 Merge branch 'main' 以保持基线最新。
文件 模块 状态 重要度
vllm/model_executor/models/hy_v3.py 模型执行 modified 5.28

关键符号

HYV3MoEFused.__init__

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

评论区精华

删除测试文件 测试

reviewer `jeejeelee` 评论 "please remove this test",要求删除 `tests/models/test_hy_v3_expert_bias.py`。

结论:作者接受并在后续 commit 中移除了测试文件。 · 已解决

风险与影响

变更极小(1 行 +3/-1),仅影响参数分配时的 dtype,无性能回归风险。由于显式指定 fp32 而非依赖默认 dtype,参数占用从 2 字节/元素变为 4 字节/元素,但 num_experts 通常为 192 量级,内存增加可忽略(~768 字节)。不涉及运行时逻辑或 load/save 兼容性。

直接修复 HY V3 模型的 MoE 路由精度,避免边界 token 的专家选择错误。影响范围限于 hy_v3hy_v3_mtp 模型,无用户感知 API 变化。

关联 Issue

#47777 [Bug]: HY V3 (hy_v3) allocates router expert_bias in serving dtype, silently downcasting the checkpoint's float32 selection bias (DeepSeek models pin it to fp32)

完整报告

参与讨论