已关闭
[Bug-Report] ffn_antiquant_msd.h: CopyOutFinalResult 冗余 Cast 覆盖 bf16 舍入语义 #2637
daishuangshuang创建于  5月25日关闭于  6月29日
daishuangshuang
5月25日 创建

一、问题描述(必填)

ffn/ffn/op_kernel/ffn_antiquant_msd.hCopyOutFinalResult 函数中,行 975-980 存在冗余 Cast 调用,覆盖了 if-else 条件分支的舍入模式选择,导致 bf16 场景精度异常。

代码片段(行 975-980):

if constexpr (IsSameType<xT, half>::value) {
    Cast(outputInUb, middleResult3, RoundMode::CAST_NONE, curV2BaseM * curBaseNAligned);   // half 场景
} else {
    Cast(outputInUb, middleResult3, RoundMode::CAST_RINT, curV2BaseM * curBaseNAligned);   // bf16 场景
}
Cast(outputInUb, middleResult3, RoundMode::CAST_NONE, curV2BaseM * curBaseNAligned);       // 无条件覆盖!

问题分析

行 980 无条件执行 Cast(..., CAST_NONE, ...),将 if-else 分支中 bf16 场景选择的 CAST_RINT 舍入语义覆盖为 CAST_NONECAST_RINT 采用四舍五入,而 CAST_NONE 直接截断,两者精度行为不同,影响 bf16 输出的数值正确性。

该问题同时被代码检视中的 API-9(API 使用规范)和 GEN-1.3(通用编码规范)两个维度独立发现。

二、环境信息(必填)

  • 算子仓:ops-transformer
  • 算子名:FFN
  • 涉及文件:ffn/ffn/op_kernel/ffn_antiquant_msd.h
  • 涉及行号:975-980

三、复现步骤(必填)

FFN 算子 MSD 伪量化路径,xT 为 bfloat16 时触发 CopyOutFinalResult,观察输出数值与预期精度的偏差。

四、修复建议

删除行 980 的冗余 Cast 调用:

// 修复后
if constexpr (IsSameType<xT, half>::value) {
    Cast(outputInUb, middleResult3, RoundMode::CAST_NONE, curV2BaseM * curBaseNAligned);
} else {
    Cast(outputInUb, middleResult3, RoundMode::CAST_RINT, curV2BaseM * curBaseNAligned);
}
// 删除此处冗余 Cast
outQueueY_.EnQue(outputInUb);
likedislike
leiqingji成员
5月25日 评论:

/assign @yu-xinjie62

likedislike
CANN-robotCANN-robot成员
5月25日 将 yu-xinjie62 设为负责人
Yyuhao_成员
5月26日 将 huang-wei-chen 设为负责人
Yyuhao_成员
5月26日 移除了负责人 yu-xinjie62
Ddaishuangshuang
5月26日 issue类型由 任务 改变为 缺陷
huang-wei-chen成员
6月4日 评论:

您好,非常感谢您的反馈,该问题我们将在近期修复,感谢您的耐心等待。

likedislike
Hhuang-wei-chen成员
6月17日 关联了pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
Hhuang-wei-chen成员
6月17日 删除了关联的pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
Hhuang-wei-chen成员
6月17日 关联了pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
Hhuang-wei-chen成员
6月17日 删除了关联的pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
Hhuang-wei-chen成员
6月17日 关联了pull request:移除冗余的Cast调用并将CheckLogLevel改为OP_LOGD调用
Hhuang-wei-chen成员
6月17日 关联了pull request:FFN算子移除冗余的Cast操作
Hhuang-wei-chen成员
6月17日 关联了pull request:商分FFN算子移除冗余的Cast操作
CANN-robotCANN-robot成员
6月29日 关闭了 issue
CANN-robotCANN-robot成员
6月29日 添加了label:resolved
Ddaishuangshuang
6月30日 issue状态由 待办的 改变为 已完成
CANN-robotCANN-robot成员
6月30日 添加了label:Accepted