已关闭
[Bug-Report] swin_transformer_ln_qkv_quant: Tiling无效方案返回SUCCESS + proto.h数据类型不一致 + 属性名拼写错误 + 文档描述错误 #2678
daishuangshuang创建于  5月26日关闭于  6月3日
daishuangshuang
5月26日 创建

一、问题描述(必填)

swin_transformer_ln_qkv_quant 算子存在多个代码和文档缺陷,涵盖 Tiling 逻辑错误、接口声明与实现不一致、文档描述错误、属性名拼写错误等问题。


问题1(P0)— Tiling 未找到合法方案时仍返回 GRAPH_SUCCESS

Tiling 代码第 500 行判断 (solutionFlag == true) && (lnSolutionFlag == true),但当条件不满足时,代码不会返回失败,而是跳出 switch 继续执行 SetWorkSpaceSetBlockDimSetTilingKeySaveTilingData,最终返回 GRAPH_SUCCESS。这意味着无效或未初始化的 tiling 数据被传给 kernel。

  • 文件:ffn/swin_transformer_ln_qkv_quant/op_host/swin_transformer_ln_qkv_quant_tiling.cpp
  • 行号:第 500-518 行
if ((solutionFlag == true) && (lnSolutionFlag ==true)) {
    tilingData.mmInfo.set_mmSizeM(mSizePerLoop);
    // ... 设置 tiling 数据
}
break;
// 跳出 switch 后继续执行,无论 solutionFlag 是否为 true
SwinTransformerLnQkvQuantSetWorkSpace(context);
context->SetBlockDim(static_cast<int64_t>(blockNum));
SwinTransformerLnQkvQuantSetTilingKey(context);
SwinTransformerLnQkvQuantSaveTilingData(context);
return ge::GRAPH_SUCCESS;

问题2(P0)— 不支持的 headNum 静默通过

headNumTEMPLATE_MAP 中找不到匹配时(如 headNum > 32),templateId 被设为 LN_INDEPENDT_MODE,但 switch 语句中没有处理该模式的 case,直接落入 default: break;。tiling 数据未被设置但仍然返回 GRAPH_SUCCESS

  • 文件:同上
  • 行号:第 378-379 行
auto iter = TEMPLATE_MAP.find(headNum);
templateId = (iter != TEMPLATE_MAP.end()) ? iter->second : ProcessMode::LN_INDEPENDT_MODE;
// switch 中无 LN_INDEPENDT_MODE 的 case,落入 default: break;

问题3(P0)— proto.h 数据类型与 def.cpp 严重不一致

proto.h 第 56-57 行 weight 声明为 DT_FLOAT16,bias 声明为 DT_FLOAT16,但 def.cpp 中 weight 实际为 DT_INT8,bias 实际为 DT_INT32。第 31 行注释 bias 描述为 "float16",也与实际不符。

  • 文件:ffn/swin_transformer_ln_qkv_quant/op_graph/swin_transformer_ln_qkv_quant_proto.h
  • 行号:第 31 行(注释)、第 56-57 行(声明)
// proto.h(错误)
.INPUT(weight, TensorType({DT_FLOAT16}))  // 应为 DT_INT8
.INPUT(bias, TensorType({DT_FLOAT16}))    // 应为 DT_INT32

// def.cpp(正确)
.DataType({ge::DT_INT8})    // weight
.DataType({ge::DT_INT32})   // bias

问题4(P1)— README quantOffset 描述错误

README 第 89-93 行 quantOffset 描述为 INT32 类型、维度 [3*H],但 def.cpp 中实际为 FLOAT16 类型、维度 [H]

  • 文件:ffn/swin_transformer_ln_qkv_quant/README.md
  • 行号:第 89-93 行

问题5(P1)— aclnn 文档 epsilon 类型不一致

函数原型中 epsilon 参数类型为 double,但参数说明表格中数据类型列为 float

  • 文件:ffn/swin_transformer_ln_qkv_quant/docs/aclnnSwinTransformerLnQkvQuant.md
  • 行号:第 38 行、第 189 行

问题6(P1)— 属性名 h_win_szie 拼写错误

proto.h 中属性名 h_win_szie 存在拼写错误,应为 h_win_size。该拼写错误同时存在于注释(第 42 行)和 REQUIRED_ATTR 注册(第 69 行)中。

  • 文件:ffn/swin_transformer_ln_qkv_quant/op_graph/swin_transformer_ln_qkv_quant_proto.h
  • 行号:第 42 行(注释)、第 69 行(注册)
* @li h_win_szie: A required attribute, the type is int. Defaults to 7. \n
.REQUIRED_ATTR(h_win_szie, Int)   // 应为 h_win_size

二、修复建议

  1. 问题1-2:在 switch 结束后增加 solutionFlag && lnSolutionFlag 检查,不满足时返回 GRAPH_FAILEDTEMPLATE_MAP.find 未命中时直接返回 GRAPH_FAILED 或增加对应处理分支
  2. 问题3:proto.h 将 weight 改为 TensorType({DT_INT8}),bias 改为 TensorType({DT_INT32}),注释同步修正
  3. 问题4:README 将 quantOffset 类型改为 FLOAT16,维度改为 [H]
  4. 问题5:aclnn 文档统一 epsilon 类型为 double
  5. 问题6:将 h_win_szie 统一改为 h_win_size(注意同步更新 tiling.cpp 等引用处)

三、影响范围

无效 tiling 数据传给 kernel 可能导致计算结果错误或运行时崩溃;proto.h 类型不一致会导致上层框架传参错误;文档错误会误导使用者。

likedislike
huang-chuhong成员
5月26日 评论:

/assign @yolic

likedislike
CANN-robotCANN-robot成员
5月26日 将 yolic 设为负责人
Ddaishuangshuang
5月26日 issue类型由 任务 改变为 缺陷
yuning_chen
yuning_chen成员
5月27日 评论:

您好,感谢您的关注,问题会尽快修改合入

likedislike
CANN-robotCANN-robot成员
6月3日 关闭了 issue
CANN-robotCANN-robot成员
6月3日 添加了label:resolved
Ddaishuangshuang
6月8日 issue状态由 待办的 改变为 已完成
CANN-robotCANN-robot成员
6月8日 添加了label:Accepted