Prhub

#28469 fix(moe): MoRI EP init_mori_op missing BF16 dispatch branch

原始 PR 作者 zx3xyy 合并时间 2026-06-17 12:02 文件变更 1 提交数 1 评论 1 代码增减 +4 / -1

执行摘要

修复 MoRI EP 缺少 BF16 分发分支导致模型精度错误

BF16 是默认的分发 dtype,但 init_mori_op 缺少对应分支,导致 BF16 分发 fallthrough 到 FP8 默认配置,算子使用 FP8+scale 语义处理 BF16 数据,结果被静默损坏。该问题由未量化的 BF16 专家层模型暴露。

值得合并,修复了一个关键但隐蔽的精度 bug。建议后续补充针对 BF16 分支的单元测试,确保回归覆盖。

讨论亮点

PR 讨论较少,主要来自 author 在 commit message 和 body 中的问题描述。Reviewer HaiShaw 直接批准,未提出额外意见。

实现拆解

  1. python/sglang/srt/layers/moe/token_dispatcher/moriep.pyinit_mori_op 函数中,于 FP8 分支之前新增 DispatchDtype.bf16 分支。
  2. 在该分支中,将 data_type 设置为 params_dtype(即实际的参数类型,如 torch.bfloat16),并将 scale_dim 设为 0(禁用 scale)。
  3. 后续的 FP8 和 FP4 分支保持不变,形成完整的 if-elif 逻辑结构。
文件 模块 状态 重要度
python/sglang/srt/layers/moe/token_dispatcher/moriep.py MoE modified 5.7

关键符号

init_mori_op

关键源码片段

python/sglang/srt/layers/moe/token_dispatcher/moriep.py core-logic

唯一修改的文件,在 `init_mori_op` 函数中新增 BF16 分发分支,修复静默精度错误。

# 位于 init_mori_op 函数内,在 FP8 分支前插入 BF16 处理
if dispatch_dtype == DispatchDtype.bf16:
    data_type = params_dtype # 使用实际的参数类型(如 bfloat16),而非 FP8
    scale_dim = 0 # 禁用 scale,BF16 不需要量化 scale
elif dispatch_dtype == DispatchDtype.fp8:
    scale_dim = hidden_size // FP8_BLOCK_SIZE
elif dispatch_dtype == DispatchDtype.fp4:
    # FP4 kernel 仍使用原始 hidden_size 进行内部量化
    hidden_dim = hidden_size
    scale_dim = hidden_size // MXFP4_BLOCK_SIZE
    data_type = torch.float4_e2m1fn_x2
    scale_type_size = torch.float8_e8m0fnu.itemsize
    # ... 模式相关的配置

评论区精华

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

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

风险与影响

该修复改动极小(4行新增),且显式处理了 BF16 这一关键默认路径,回归风险极低。但未附带单元测试验证 BF16 分支下的逻辑正确性,存在未来重构时被意外删除的长期风险。

直接影响使用 MoRI EP 且 expert 层为 BF16 量化的模型,修复了静默精度错误。对其他 dtype(FP8、FP4)无影响。由于 BF16 是默认 dtype,受影响的用户范围较广。

缺少测试覆盖

关联 Issue

未识别关联 Issue

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

完整报告

参与讨论