CANN opbase 错误码 EZ0016 详解:多参数 Tensor 形状大小校验失败的原因分析与排查

CANN opbase 错误码 EZ0016 详解:多参数 Tensor 形状大小校验失败的原因分析与排查 CANN opbase 错误码 EZ0016 详解多参数 Tensor 形状大小校验失败的原因分析与排查【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读EZ0016 是 CANN opbase 算子库中用于标识多个参数形状大小shape size校验失败的预定义错误码。当算子或 aclnn 接口的多个输入/输出 Tensor 形状大小不满足既定约束如不相等、非空、与期望值不符时算子实现会通过日志宏上报该错误。阅读本文后你将掌握 EZ0016 的报错格式与占位符含义、两类典型触发场景、底层日志宏的调用方式以及一套可落地的排查与修复思路。错误码定位EZ0016 在算子错误体系中的位置EZ0016 隶属于 CANN opbase 预定义错误码体系中的Operator Errors算子错误类别错误标题为Invalid_Argument_Tensor_Shape_SizeTensor 形状大小非法。在 错误码总览 中它与 EZ0014、EZ0015 同属形状大小系列三者分工如下错误码触发对象报错信息特征对应日志宏EZ0014单参数形状大小与期望值不符无原因直接给出期望值OP_LOGE_FOR_INVALID_SHAPESIZEEZ0015单参数形状大小不符并附带具体原因OP_LOGE_FOR_INVALID_SHAPESIZE_WITH_REASONEZ0016多参数多个参数形状大小不符并附带具体原因OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASON从源码看EZ0016 的错误码定义位于 src/op_common/log/log.cpp其Arglist结构化参数字段为param_names, op_name, incorrect_sizes, reason即错误信息中会携带参数名列表、算子/接口名、错误的形状大小列表以及原因四类字段便于上层框架进行结构化解析与定位。错误信息格式EZ0016 的完整报错格式如下占位符%s的含义依次为参数名、算子名或接口名、shape 大小错误值、报错原因Parameters %s of %s have incorrect shape sizes %s. Reason: %s.对应到结构化字段即为参数名param_names本次校验失败的多个参数名称算子名或接口名op_name发生错误的算子名称或 aclnn 接口名称shape 大小错误值incorrect_sizes各参数实际检测到的形状大小通常指 Tensor 的总元素数报错原因reason由算子实现者填写的、描述具体违反约束的文本。典型报错示例解读示例一多个参数形状大小必须相等Parameters x and y of SwigluMxQuantWithDualAxis have incorrect shape sizes 1024 and 0. Reason: The shape size of x must be equal to the shape size of y.该报错说明SwigluMxQuantWithDualAxis算子的输入x与y形状大小不相等实际分别为 1024 和 0违反了x 的 shape size 必须等于 y 的 shape size这一约束。此类约束常见于需要逐元素对齐或按轴归约的双输入算子。示例二多个输入必须为非空 TensorParameters query, key, cos and sin of operator ApplyRotaryPosEmb have incorrect shape sizes 0, 0, 0 and 0. Reason: All inputs must be non-empty tensors.该报错说明ApplyRotaryPosEmb算子的query、key、cos、sin四个输入形状大小均为 0空 Tensor违反了所有输入必须为非空 Tensor的约束。此场景通常在算子对空 Tensor 无法进行有效计算、必须显式拒绝时触发。底层实现日志宏 OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASONEZ0016 由 op_common 日志头文件中的宏OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASON上报定义于 include/op_common/log/log.h。该宏仅供算子或 aclnn 实现使用其功能为当算子的多个参数形状大小不正确时输出 ERROR 级别日志含具体原因并上报 EZ0016 错误码。函数原型OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASON(entityName, paramNames, incorrectSizes, reason)参数说明均支持const char*或std::string类型参数名输入/输出说明entityName输入算子名称或 aclnn 接口名称paramNames输入参数名称列表多个参数名以自然语言连接如query, key, cos and sinincorrectSizes输入实际形状大小列表与参数名一一对应reason输入错误原因描述从 include/op_common/log/log.h 的实现可以看出该宏做了三件事将四个入参分别拷贝到局部std::string中避免调用者传入临时对象导致悬垂指针调用OP_LOGE_LIBOPAPI_REPORT输出带完整参数占位符的 ERROR 级日志通过REPORT_PREDEFINED_ERR_MSG(EZ0016, ...)将param_names、op_name、incorrect_sizes、reason作为键值对上报与 src/op_common/log/log.cpp 中的Arglist定义一一对应确保错误可被结构化采集。调用示例源自官方 API 文档OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASON 接口文档 给出了ApplyRotaryPosEmb算子的关键代码示例该示例正是前面示例二报错的产生逻辑// 预期输出: Parameters query, key, cos and sin of ApplyRotaryPosEmb have incorrect shape sizes // 0, 0, 0 and 0. Reason: All inputs must be non-empty tensors. if (qSize 0 || kSize 0 || cSize 0 || sSize 0) { std::string sizeMsg std::to_string(qSize) , std::to_string(kSize) , std::to_string(cSize) and std::to_string(sSize); OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASON(ApplyRotaryPosEmb, query, key, cos and sin, sizeMsg.c_str(), All inputs must be non-empty tensors.); return ge::GRAPH_FAILED; }可见incorrectSizes并非要求机械地以逗号分隔而是允许通过std::to_string拼接、并使用and等自然语言连接词组装成可读性良好的文本日志上报后算子实现随即返回ge::GRAPH_FAILED结束 InferShape 流程。与相邻错误码的对比使用建议在算子开发中形状大小校验应遵循单参数用单参数宏、多参数用多参数宏、需要原因就带 reason的选型原则仅校验单个参数且能直接给出期望值时使用OP_LOGE_FOR_INVALID_SHAPESIZEEZ0014例如 接口文档 中的描述实际形状大小总元素数与预期不符单个参数校验失败但需要解释具体原因如输出 y 的线性维度必须等于输入 size 参数的值 256时使用OP_LOGE_FOR_INVALID_SHAPESIZE_WITH_REASONEZ0015参考 接口文档多个参数同时不满足约束时使用OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASONEZ0016即本文主题。解决方法收到 EZ0016 报错后排查步骤如下按报错原因核对约束根据报错信息末尾的Reason字段确认违反的具体规则——是各参数 shape size 必须相等还是所有输入必须为非空 Tensor抑或其他算子自定义约束检查输入/输出 Tensor 的 shape 大小定位报错中列出的参数名逐一核对各自的实际形状大小总元素数确认是哪个参数或哪些参数不满足条件修正调用侧数据根据算子约束调整输入 Tensor 的 shape如补齐空 Tensor、统一各输入的元素总数或在算子实现侧修正校验逻辑与期望值复现验证修正后重新执行算子/接口调用确认不再出现该错误码。由于 src/op_common/log/log.cpp 中 EZ0016 的官方建议为 Check whether the shape sizes of input/output tensors meet the relationship.即核心始终是核对输入输出 Tensor 形状大小是否满足关系。总结EZ0016 是 CANN opbase 算子错误体系中用于多参数 Tensor 形状大小校验失败的统一错误码它通过OP_LOGE_FOR_INVALID_SHAPESIZES_WITH_REASON宏将参数名、算子名、实际形状大小与失败原因一并结构化上报。算子开发者可依据Reason字段快速定位约束类型再通过核对各参数的 shape size 完成问题修复同时该错误码与 EZ0014/EZ0015 共同构成了形状大小校验的完整宏选型矩阵可在 op_common 接口列表 中查阅全部日志接口。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考