ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CANN/opbase 算子错误码 EZ0001 深度解析:Invalid Input Shape 报错格式、触发机制与排查方法

CANN/opbase 算子错误码 EZ0001 深度解析:Invalid Input Shape 报错格式、触发机制与排查方法 CANN/opbase 算子错误码 EZ0001 深度解析Invalid Input Shape 报错格式、触发机制与排查方法【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase本篇技术指南围绕 CANN/opbase 基础框架库项目位于cann/opbase中算子侧公共错误码EZ0001Invalid Input Shape展开系统讲解该错误码的标准报错格式、四个占位符的语义、典型报错示例以及算子/ACLNN 接口实现中主动上报该错误码的源码级机制与排查思路。读完本文你将能够准确识别该错误码的触发场景、读懂其日志与错误码元信息并在算子开发中正确使用对应日志宏完成 shape 校验与错误上报。错误码全景EZ0001 在算子错误体系中的位置CANN/opbase 将算子运行与校验过程中的公共错误以错误码ErrCode形式统一管理。其中EZ0xxx 系列属于“Public Operator Errors”算子公共错误覆盖输入 shape、属性、dtype、format、文件操作、配置项等算子侧常见校验失败场景EZ1xxx 系列则面向 aclnn 接口参数错误其宏定义位于 src/nnopbase/common/inc/nnopbase_error_msg.h。EZ0001 的官方定义为Invalid_Input_Shape输入形状错误用于表达“算子的某个输入张量tensor的实际 shape 与预期不符”这一最基础的参数校验失败情形。全部算子错误码的完整索引可参见 Operator-Errors 错误码索引中文对照文档见 EZ0001 中文版。在错误码注册表中EZ0001 的错误信息元数据定义如下见 src/op_common/log/log.cpp{ errClass: Operator Errors, errTitle: Invalid_Input_Shape, ErrCode: EZ0001, ErrMessage: The %sth input of %s has incorrect shape [%s]. It should be [%s]., Arglist: index, op_name, incorrect_shape, correct_shape, suggestion: { Possible Cause: N/A, Solution: Check whether the shape of the input tensor is correct. } }报错格式与占位符语义逐字段解析EZ0001 的报错文本格式固定如下该模板与注册表中的ErrMessage完全一致The %sth input of %s has incorrect shape [%s]. It should be [%s].其中依次出现的 4 个%s占位符含义如下占位符含义对应 Arglist 字段典型取值示例%s第一个输入张量序号index0从 0 开始计数%s第二个算子名称或 aclnn 接口名称op_nameMatMulV2、aclnnAdd%s第三个shape 错误值实际传入的 shapeincorrect_shape[2,128,256]%s第四个shape 正确值期望的 shapecorrect_shape[M, K]几点需要特别注意的语义细节index从 0 开始0th表示第 1 个输入1th表示第 2 个输入以此类推与算子原型op proto中输入参数的声明顺序保持一致op_name可能是算子名或 aclnn 接口名该错误既可能由算子如 MatMulV2在 shape 推导/校验阶段产生也可能由 aclnn 接口在入参检查阶段产生correct_shape可以是具体数值也可以是符号化表达式如[M, K]表示期望 shape 为“M 行 K 列”的二维矩阵[256,512]表示精确的期望 shape符号形式常见于矩阵乘、卷积等对维度关系有约束的算子。报错示例解读官方文档给出的典型报错示例如下The 0th input of MatMulV2 has incorrect shape [2,128,256]. It should be [M, K].逐段解读The 0th input of MatMulV2MatMulV2 算子的第 1 个输入index 0即左矩阵 x校验失败has incorrect shape [2,128,256]实际传入的 shape 是三维的[2,128,256]It should be [M, K]MatMulV2 要求该输入为[M, K]形式的二维矩阵。该示例表明调用方传入了一个 3 维张量而算子要求 2 维输入维度数量不满足约束从而触发 EZ0001 错误码上报。触发场景与源码级上报机制EZ0001 并非框架自动抛出而是由算子在 shape 校验逻辑中主动调用日志宏上报的。其底层实现涉及三个关键源码文件1. 日志宏定义include/op_common/log/log.h#define OP_LOGE_WITH_INVALID_INPUT_SHAPE(entityName, index, incorrectShape, correctShape) \ do { \ std::string _safe_entityName_(entityName); \ std::string _safe_incorrectShape_(incorrectShape); \ std::string _safe_correctShape_(correctShape); \ std::string index_str std::to_string(index); \ OP_LOGE_LIBOPAPI_REPORT( \ _safe_entityName_.c_str(), The %sth input of %s has incorrect shape [%s]. It should be [%s]., \ index_str.c_str(), _safe_entityName_.c_str(), _safe_incorrectShape_.c_str(), _safe_correctShape_.c_str()); \ const std::vectorconst char* msgKey {index, op_name, incorrect_shape, correct_shape}; \ const std::vectorconst char* msgvalue {index_str.c_str(), _safe_entityName_.c_str(), \ _safe_incorrectShape_.c_str(), _safe_correctShape_.c_str()}; \ REPORT_PREDEFINED_ERR_MSG(EZ0001, msgKey, msgvalue); \ } while (0)从宏实现可以看出 EZ0001 的上报包含两个动作OP_LOGE_LIBOPAPI_REPORT输出 ERROR 级别日志日志文本即“The %sth input of %s has incorrect shape [%s]. It should be [%s].”并携带文件名、行号、函数名、子模块名OPS_BASE与线程 IDREPORT_PREDEFINED_ERR_MSG(EZ0001, msgKey, msgvalue)以index、op_name、incorrect_shape、correct_shape四个键值对上报结构化错误信息供上层错误处理与用户界面统一格式化展示。此外include/op_common/log/error_code.h 中还定义了配套的内部错误码枚举INVALID_INPUT_SHAPE 35000位于 35000~39999 的 aicpu 算子 infershape 错误区间供算子返回给框架层使用。2. 宏的完整参数说明根据接口文档 OP_LOGE_WITH_INVALID_INPUT_SHAPE该宏参数如下参数名输入/输出说明entityName输入算子名称或 aclnn 接口名称支持const char*或std::string类型index输入输入张量索引从 0 开始int类型incorrectShape输入实际输入形状格式如[1,128,128]支持const char*或std::string类型correctShape输入预期输入形状格式如[1,256,256]支持const char*或std::string类型3. 典型调用示例// 预期输出: The 0th input of MatMul has incorrect shape [128,128]. It should be [256,512]. const gert::Shape expectedShape({256, 512}); if (inputShape ! expectedShape) { std::string incorrectShape Ops::Base::ToString(inputShape); OP_LOGE_WITH_INVALID_INPUT_SHAPE(MatMul, 0, incorrectShape.c_str(), [256,512]); return ge::GRAPH_FAILED; }要点宏调用前应先用Ops::Base::ToString将 shape 对象序列化为[d0,d1,...]字符串shape 不满足校验时先上报错误再返回失败码如ge::GRAPH_FAILED。注意接口演进根据接口文档说明OP_LOGE_WITH_INVALID_INPUT_SHAPE已被标记为废弃建议新开发代码改用更通用的 OP_LOGE_FOR_INVALID_SHAPE上报 EZ0008。二者的差别在于EZ0001 定位“第 index 个输入”的 shape 错误而 EZ0008 使用具名的参数名paramName表达 shape 错误语义更通用同时覆盖输入/输出张量。排查与解决方法官方给出的解决方法是检查输入张量的 shape 是否正确。实际排查时可按下述步骤定位问题确认出错对象从报错文本中提取op_name算子或接口名与index输入序号确定是哪个算子的第几个输入不合法对比 shape 差异将第三个占位符实际 shape与第四个占位符期望 shape逐一对比重点检查维度数量rank如[2,128,256]是 3 维而[M, K]要求 2 维各维度具体数值如[128,128]与期望[256,512]的 K、N 维不匹配符号约束如[M, K]中 M、K 表示与另一输入或属性存在等量关系矩阵乘法中 x 的 K 维必须等于 y 的 K 维回溯调用链检查上层图构建、数据预处理或用户 API 传参逻辑修正传入张量的 shape复测验证修正后重新运行确认不再出现 EZ0001 且算子正常执行。与相邻错误码的辨析EZ0001 是“输入 shape 错误”家族中最基础的一档与其相邻的错误码在语义上容易混淆建议按如下口径区分错误码错误标题语义侧重对应日志宏EZ0001Invalid Input Shape第 index 个输入的 shape整体维度与取值与预期不符OP_LOGE_WITH_INVALID_INPUT_SHAPE已废弃EZ0005Invalid Input ShapeSize第 index 个输入的元素总数shape size与预期不符OP_LOGE_WITH_INVALID_INPUT_SHAPESIZEEZ0008Invalid Argument Tensor Shape任意具名参数输入或输出的 shape 与预期不符OP_LOGE_FOR_INVALID_SHAPEEZ0011Invalid Argument Tensor Shape Dim参数的维度数量dim与预期不符OP_LOGE_FOR_INVALID_SHAPEDIMEZ0014Invalid Argument Tensor Shape Size参数的元素总数与预期不符OP_LOGE_FOR_INVALID_SHAPESIZE一句话总结EZ0001 只管“输入张量的 shape 不对”若要区分错误细粒度shape size、dim 或输出张量应选用上述对应的通用参数校验宏与错误码。延伸阅读Operator-Errors 错误码索引英文 / 错误码索引中文OP_LOGE_WITH_INVALID_INPUT_SHAPE 接口说明含废弃说明OP_LOGE_FOR_INVALID_SHAPE 接口说明EZ0008推荐替代日志宏实现源码错误码注册表实现源码日志模块源码 与 错误码头文件【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表