CANN opbase 错误码 EZ0002 解析Invalid_Attr 属性值非法错误的上报、定位与排查【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读本文围绕 CANN/opbase 开源仓库中算子错误码体系中的EZ0002Invalid_Attr展开说明该错误码所对应的报错格式、占位符语义与典型报错样例并结合仓库源码深入讲解其底层上报机制OP_LOGE_WITH_INVALID_ATTR宏与REPORT_PREDEFINED_ERR_MSG错误码注册机制给出算子在实现与调测阶段触发 EZ0002 的完整排查思路帮助算子开发者快速定位属性值非法问题并与 EZ0001、EZ0003、EZ0024 等相邻错误码正确区分使用。EZ0002 是什么EZ0002 是 CANN/opbase 错误码体系中归属于Operator Errors算子错误类别的预定义错误码错误标题为Invalid_Attr用于表达算子的属性Attribute值非法这一错误场景。在 CANN 算子开发流程中算子通常通过 aclnn 接口或算子实现对外暴露其行为由若干属性Attribute控制例如dim、axis、update_type等。当调用方传入的属性值不在算子定义所允许的取值范围内时算子实现会通过日志与错误码上报机制抛出 EZ0002提示使用者属性取值有误。该错误码在仓库的错误码注册表中定义于 src/op_common/log/log.cpp其注册元数据如下字段取值errClassOperator ErrorserrTitleInvalid_AttrErrCodeEZ0002ErrMessageAttribute %s of %s has incorrect value %s. It should be %s.Arglistattr_name, op_name, incorrect_val, correct_valSolutionCheck whether the operator attribute is correct.在枚举层面错误码还与内部视图错误码INVALID_ATTR_VALUE数值 35001对应见 include/op_common/log/error_code.h该枚举属于Ops::Base::ViewErrorCode是错误码在上报链路中与日志/DFX 视图关联的内部编码。错误信息格式与占位符语义EZ0002 的报错格式如下Attribute %s of %s has incorrect value %s. It should be %s.其中四个占位符%s依次填充占位符含义对应 Arglist第 1 个 %s属性名Attribute 名称如dim、axisattr_name第 2 个 %s算子名或 aclnn 接口名op_name第 3 个 %s属性错误值实际传入的非法取值incorrect_val第 4 个 %s属性正确值算子允许的取值/取值范围描述correct_val报错示例仓库给出的标准报错示例如下Attribute dim of KthValue has incorrect value 5. It should be [-3, 2].该示例的语义是KthValue算子的dim属性被传入了非法值5而算子允许的取值范围是[-3, 2]。读者可以据此快速定位是哪条语句、哪个算子、哪个属性出了问题并依据正确值提示直接修正调用侧传入的属性值。EZ0002 的源码级上报机制1. 错误码注册表EZ0002 的完整错误描述错误类、标题、消息模板、参数列表、官方建议统一注册在错误码元数据表中见 src/op_common/log/log.cpp。该注册表同时定义了 EZ0001Invalid_Input_Shape、EZ0003Invalid_Attr_Size等相邻错误码上报时按错误码 ID 查询并填充Arglist中声明的字段从而生成结构化的错误信息。从源码结构看该注册表是算子错误码统一出口其他 EZ 系列错误码均以同样的 JSON 元数据结构注册于此。2. 上报宏 OP_LOGE_WITH_INVALID_ATTR在算子或 aclnn 实现中EZ0002 由宏OP_LOGE_WITH_INVALID_ATTR触发其定义位于 include/op_common/log/log.h。该宏的调用方式为OP_LOGE_WITH_INVALID_ATTR(entityName, attrName, incorrectVal, correctVal)宏体内部做了两件事通过OP_LOGE_LIBOPAPI_REPORT输出 ERROR 级别日志日志模板即 EZ0002 的消息格式Attribute %s of %s has incorrect value %s. It should be %s.并携带文件、行号、子模块名OPS_BASE、函数名、线程号等上下文信息见 include/op_common/log/log.h通过REPORT_PREDEFINED_ERR_MSG(EZ0002, msgKey, msgvalue)上报预定义错误码其中 msgKey 依次为attr_name、op_name、incorrect_val、correct_val与错误码注册表中的Arglist严格对应。REPORT_PREDEFINED_ERR_MSG的上报动作使错误信息能够在 DFX故障诊断体系中登记便于上层工具与调用方按错误码检索、归类问题。3. 接口文档与调用示例仓库为该宏提供了独立接口文档 docs/zh/api/op_common/log/OP_LOGE_WITH_INVALID_ATTR.md其参数说明如下参数名输入/输出说明entityName输入算子名称或 aclnn 接口名称支持 const char* 或 std::string 类型attrName输入属性名称支持 const char* 或 std::string 类型incorrectVal输入实际属性值支持 const char* 或 std::string 类型correctVal输入预期属性值支持 const char* 或 std::string 类型文档给出的调用示例预期输出Attribute axis of MyOp has incorrect value 3. It should be 0 or 1.if (axis_ ! 0 axis_ ! 1) { OP_LOGE_WITH_INVALID_ATTR(MyOp, axis, std::to_string(axis_), 0 or 1); return false; }值得注意的是接口文档标注该宏已废弃建议使用 OP_LOGE_FOR_INVALID_VALUE对应 EZ0024 错误码替代。因此在新建代码中属性/参数值校验类错误应优先选用OP_LOGE_FOR_INVALID_VALUE但对于存量算子仍会通过 EZ0002 报错理解其语义对排查历史日志仍然必要。触发 EZ0002 后的排查方法根据错误码注册表中给出的官方建议Solution: Check whether the operator attribute is correct排查步骤归纳如下定位报错主体从报错文本的第 2 个占位符确认是哪个算子或 aclnn 接口报错例如示例中的KthValue确认非法属性从第 1 个占位符确认属性名如dim第 3 个占位符给出的是实际传入的错误值如5对照正确取值范围第 4 个占位符直接给出了算子允许的正确值或取值范围如[-3, 2]将其与实际值对比即可判断非法原因——通常为调用侧传参越界、类型转换丢失精度或使用了算子不支持的特殊值修正调用参数检查生成算子的上层代码构图/建图侧确保属性值落在允许范围内后重新执行。当报错同时伴随日志出现时日志会携带出错的文件、行号与线程号可结合 include/op_common/log/log.h 中OP_LOGE_LIBOPAPI_REPORT的输出格式在源码中进一步回溯到校验逻辑所在位置。与相邻错误码的区分EZ0002 属于算子错误族中的属性校验分支与几个相邻错误码在语义上易混淆仓库错误码注册表src/op_common/log/log.cpp与总览文档 docs/zh/error_code/Operator-Errors/Operator-Errors.md 给出了完整清单常见区分如下错误码标题报错格式适用场景EZ0001Invalid_Input_ShapeThe %sth input of %s has incorrect shape [%s]. It should be [%s].输入 Tensor 的 shape 非法EZ0002Invalid_AttrAttribute %s of %s has incorrect value %s. It should be %s.算子属性Attribute值非法EZ0003Invalid_Attr_SizeAttribute %s of %s has incorrect size %s. It should be %s.属性的大小/长度如列表长度非法EZ0004Invalid_InputParameter %s of %s is required, but it is empty.必需参数缺失或为空EZ0024Invalid_ArgumentParameter %s of %s has incorrect value %s. It should be %s.参数Parameter值非法OP_LOGE_FOR_INVALID_VALUE的默认错误码判别要点EZ0002 特指属性值Attribute Value错误EZ0003 特指属性大小/长度Attribute Size错误EZ0024 则泛指算子或接口的参数值错误。报错文本中出现Attribute ... has incorrect value即为 EZ0002出现Parameter ... has incorrect value则为 EZ0024。英文版同主题文档见 docs/en/error_code/Operator-Errors/EZ0002-Invalid_Attr.md。小结EZ0002Invalid_Attr是 CANN/opbase 错误码体系中面向算子属性值非法场景的标准错误码其消息模板Attribute %s of %s has incorrect value %s. It should be %s.通过四个占位符完整承载了属性名、算子名、错误值与正确值四类信息配合错误码注册表与OP_LOGE_WITH_INVALID_ATTR宏的底层实现形成日志 错误码上报双通道的 DFX 能力。开发者在调测中只需依据报错文本中的正确值提示即可快速修正属性传参在算子实现中则应遵循仓库接口文档的建议优先使用 OP_LOGE_FOR_INVALID_VALUEEZ0024进行新的参数校验上报。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考