Pull Request has been successfully merged by CANN-robot.
(Thank you for raoliang_sac's contribution.)变更摘要
本 PR 修复 Ascend 950(RegBase)平台上 RmsNormQuant 系列算子空 Tensor 校验缺失的问题:在二维 gamma/beta 预处理、维度关系校验及 tiling 参数计算之前统一校验必选输入、已提供的可选输入与有效输出非空,空 Tensor 统一返回 ACLNN_ERR_PARAM_INVALID,并删除原先较晚、覆盖不完整的检查逻辑;同时更新 V3 rstd 输出的条件约束说明并补充 ACLNN 与 tiling 层 UT。修改仅作用于 Ascend 950/RegBase,A2/A3 等非 RegBase 平台保持原有行为不变。
主要改动
- ACLNN 公共接口空 Tensor 校验:在
aclnn_rms_norm_quant.cpp新增CheckTensorNotEmpty/CheckNotEmpty,aclnnRmsNormQuant在 RegBase 平台、二维 gamma/beta 预处理前统一校验x、gamma、beta、scale、offset、y非空,空 Tensor 返回ACLNN_ERR_PARAM_INVALID。 - V3 接口校验扩展与 rstd 条件校验:
aclnn_rms_norm_quant_v3.cpp中CheckParams增加offset、beta参数并新增CheckNotEmpty,仅在 RegBase 平台校验x、gamma、scale、已提供的offset/beta、y;仅当outputRstd=true时校验rstd,关闭该输出时允许空指针或空 Tensor 占位。 - RegBase tiling 统一空 shape 校验:
rms_norm_quant_v2_tiling_regbase_base.cpp新增CheckInputOutputShapeSize(),在维度关系与参数计算前统一校验必选输入、已提供的可选输入及有效输出的 shape size,并删除原先SetInputParams中较晚且覆盖不完整的 x/gamma 空 shape 检查;GetShapeAttrsInfo中在CheckInputShapeDim/CheckInputShapeValue之前调用该校验。 - V2/V3 属性兼容处理与接口文档更新:读取 V3 的
output_rstd属性前先校验属性数量,兼容只注册 3 个属性的 V2;aclnn_rms_norm_quant_v3.h更新rstd说明:outputRstd为 true 时不允许空 Tensor,为 false 时该输出无效、允许空指针或空 Tensor 占位。 - 补充 UT 覆盖:新增
test_rms_norm_quant_v2_empty_tensor_tiling.cpp验证 tiling 层拒绝空输入/输出 shape、且仅当output_rstd=true时校验空rstd;在 V2/V3 的 ACLNN UT 中新增 950 空 Tensor 返回ACLNN_ERR_PARAM_INVALID及 910B 保持旧行为的用例。


Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| */*/docs/acl*.md | ✅ 陈娇, 钱泽洪, 唐玮玮 (3/2) | ✅ 陈娇 (1/1) |
| */*/op_api/*.h | ✅ 王永光, 钱泽洪, 唐玮玮 (3/2) | ✅ 王永光 (1/1) |
| norm | ✅ 钱泽洪, 唐玮玮 (2/2) | ✅ 钱泽洪 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
raoliang_sac, thanks for your pull request. All authors of the commits have signed the CLA. 👍


compile


| 🚀 CI 流水线已启动 |
|---|
| 📋 执行详情: 点击查看流水线 |


您好,pr合入已准备就绪,请尽快联系committer进行检视,谢谢!


/approve


/lgtm
/approve


/lgtm
/approve


描述
修改前问题
Ascend 950(RegBase)上的 RmsNormQuant 系列缺少完整且统一的空 Tensor 校验:
aclnnRmsNormQuant已检查空指针,但没有检查IsEmpty();空 Tensor 可能先进入二维 gamma/beta 预处理,最终被报告为内部 reshape/contiguous 错误,而不是输入 shape 非法。aclnnRmsNormQuantV3同样只覆盖空指针和基础 shape 关系,未覆盖有效输入、输出的空 Tensor。本 PR 将空 Tensor 统一定义为 Ascend 950 上不支持的有效参数形态,在 ACLNN 和 GEIR tiling 两条入口都提前返回参数/shape 非法;空指针语义和非 RegBase 平台行为保持不变。
逐文件修改说明
norm/rms_norm_quant/op_host/op_api/aclnn_rms_norm_quant.cppCheckParams已统一检查必选 Tensor 是否为空指针,但未检查空 Tensor,且二维 gamma/beta 的PreDealData位于 shape 参数检查之前。CheckTensorNotEmpty/CheckNotEmpty,仅在IsRegbase()为 true 时,于PreDealData前检查 x、gamma、beta、scale、offset、y 是否为空 Tensor。ACLNN_ERR_PARAM_INVALID。原有CheckParams仍是唯一的空指针检查入口,不存在重复CheckNotNull;A2/A3 等非 RegBase 路径不执行新增校验。norm/rms_norm_quant_v2/op_host/rms_norm_quant_v2_tiling.hCheckInputOutputShapeSize()。norm/rms_norm_quant_v2/op_host/rms_norm_quant_v2_tiling_regbase_base.cppSetInputParams()较晚阶段检查 x 的零维和 gamma 元素数为 0;scales1、已提供的 scales2/zero_points1/zero_points2/beta、y1/y2 以及 V3 的有效 rstd 未统一覆盖。CheckInputOutputShapeSize(),在可选输入依赖检查之后、维度与参数计算之前检查所有必选输入、已提供的可选输入和 y1/y2;仅当 V3 的output_rstd=true时检查 rstd。删除原来覆盖不完整且时机较晚的 x/gamma 空 shape 检查。output_rstd=false时未生效的 rstd 空占位保持允许。norm/rms_norm_quant_v2/tests/ut/op_host/test_aclnn_rms_norm_quant_v2.cppaclnnRmsNormQuant没有逐参数空 Tensor 用例,也没有非 RegBase 兼容性回归断言。ACLNN_ERR_PARAM_INVALID;同时增加 Ascend 910B(A2)和 Ascend 910_93(A3)空 x 对照用例。ACLNN_SUCCESS历史行为。该文件沿用既有目录命名,验证的是公开接口aclnnRmsNormQuant在 950 路由到 V2 L0 后的行为。norm/rms_norm_quant_v2/tests/ut/op_host/test_rms_norm_quant_v2_empty_tensor_tiling.cppGetShapeAttrsInfo()的共享 tiling 空 Tensor UT,API 层提前拦截无法覆盖 GEIR 直接调用。TilingContextFaker真入口 UT,逐一覆盖 7 个输入位置、y1/y2 为空及正常 V2 场景;同时覆盖 V3 的空 rstd 在output_rstd=true/false两种状态下的行为。norm/rms_norm_quant_v3/op_api/aclnn_rms_norm_quant_v3.cppCheckParams也未接收 offset/beta,无法覆盖已提供的可选输入。CheckParams;仅在 RegBase 平台检查 x、gamma、scale、已提供的 offset/beta、y,以及outputRstd=true时的 rstd。ACLNN_ERR_PARAM_INVALID;必选空指针仍返回原有ACLNN_ERR_PARAM_NULLPTR,outputRstd=false时 rstd 继续允许为空指针或空 Tensor 占位。norm/rms_norm_quant_v3/op_api/aclnn_rms_norm_quant_v3.houtputRstd。outputRstd=true时 rstd 不支持空 Tensor;outputRstd=false时输出无效,允许空指针或空 Tensor 占位。norm/rms_norm_quant_v3/docs/aclnnRmsNormQuantV3.mdoutputRstd时能否用空 Tensor 占位。outputRstd=true,补充关闭输出时支持空指针或空 Tensor 占位。norm/rms_norm_quant_v3/tests/ut/op_api/test_aclnn_rms_norm_quant_v3.cppoutputRstd=true时返回ACLNN_ERR_PARAM_INVALID;补充outputRstd=false且 rstd 为空占位时成功的用例。兼容性结论
IsRegbase()保护;RmsNormQuantV2/V3 OpDef 的实现仅注册 Ascend 950。nullptr)仍允许;V3 未请求 rstd 时,其空指针/空 Tensor 占位仍允许。关联的Issue
关联 Issue #5772:https://gitcode.com/cann/ops-nn/issues/5772
测试
op_graph变更,无新增相关用例。op_kernel变更,按规则跳过。.run包均构建成功。--pkg --ops=rms_norm_quant,rms_norm_quant_v2,rms_norm_quant_v3 --soc=ascend950 -j8完成 920 个 kernel 对象编译并成功产包;本轮官方compile_ascend950_pkg.sh因变更清单不含 kernel 文件按规则跳过。aclnnRmsNormQuant500/500 PASS;aclnnRmsNormQuantV3原始汇总 499/500,唯一差异为 INT4 打包值一个 nibble 相差 1 LSB,符合量化算子精度允许范围,固定种子单独重跑 1/1 PASS。161002 (ACLNN_ERR_PARAM_INVALID),未进入 kernel。scripts/ci/local_build.sh -j8已执行;前置 JIT/Host 全仓编译被本机 CANN 9.2.0 与最新 master 的无关接口差异阻断:index/embedding、index/gather_v2使用OpImplRegisterV2::SetSupportPcieThrough(),当前包头文件没有该成员。本 PR 的上述定向 CI、单算子打包均通过,未出现 RmsNormQuant 编译或测试失败。文档更新
更新
aclnnRmsNormQuantV3用户文档与接口头文件,明确 rstd 的非空约束仅在outputRstd=true时生效,关闭输出时允许空占位。类型标签
AI/Agent生成声明