ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CANN opbase EZ0023 Invalid_Argument 错误码排查与上报机制深度解析

CANN opbase EZ0023 Invalid_Argument 错误码排查与上报机制深度解析 CANN opbase EZ0023 Invalid_Argument 错误码排查与上报机制深度解析【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase本篇技术指南围绕 CANN opbaseCANN 算子库基础框架库错误码体系中的EZ0023 Invalid_Argument展开该错误码用于标识「多个参数张量数量tensor nums校验失败」的场景。读者在阅读后将掌握EZ0023 的报错格式与各字段含义、真实错误示例的解读方法、底层日志上报接口OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON的源码实现原理以及在自研算子或 ACLNN 接口中正确触发、排查与解决该错误的完整实战路径。一、错误码定位EZ0023 在 Operator Errors 体系中的角色CANN opbase 在 include/op_common/log/log.h 中为算子和 ACLNN 接口实现预定义了一套标准化的错误码与日志上报宏。其中EZ0023属于Operator Errors算子错误大类错误标题为Invalid_Argument语义为「参数非法」。在错误码序列中EZ0023 与张量参数校验相关的一系列错误码相邻共同构成完整的参数校验矩阵错误码校验维度报错场景EZ0006 / EZ0035输入格式format张量 format 不匹配EZ0007 / EZ0019 / EZ0020 / EZ0021输入数据类型dtype张量 dtype 不正确EZ0008 ~ EZ0016输入形状shape张量 shape 不符合约束EZ0022单参数张量数量单个参数的 tensor 数量错误且能给出期望值EZ0023多参数张量数量带原因多个参数的 tensor 数量同时错误附详细原因从错误码定义表src/op_common/log/log.cpp可以看到 EZ0023 的注册信息{ errClass: Operator Errors, errTitle: Invalid_Argument, ErrCode: EZ0023, ErrMessage: Parameters %s of %s have invalid tensor nums %s. Reason: %s., Arglist: param_names, op_name, incorrect_nums, reason, suggestion: { Possible Cause: N/A, Solution: Check whether the number of tensors in the input tensor lists meets the conditions. } }该错误码的完整错误码清单可参阅 docs/en/error_code/Operator-Errors/Operator-Errors.md中文版见 docs/zh/error_code/Operator-Errors/Operator-Errors.md。二、错误信息格式详解占位符逐个拆解EZ0023 的报错信息采用固定模板英文原文见 docs/en/error_code/Operator-Errors/EZ0023-Invalid_Argument.mdParameters %s of %s have invalid tensor nums %s. Reason: %s.模板中 4 个%s占位符按顺序依次表示占位符字段名对应 Arglist含义第 1 个%sparam_names参数名称列表多个参数之间用 and 连接如lse and go第 2 个%sop_name算子名称或 ACLNN 接口名称如AttentionUpdate第 3 个%sincorrect_nums各参数实际传入的张量数量错误值列表如4 and 4第 4 个%sreason错误原因描述说明数量应为多少、依据是什么将该模板与字段映射关系对照后一条完整的 EZ0023 报错可被拆解为问题主体哪个算子的哪些参数第 1、2 个字段错误事实实际张量数量是多少第 3 个字段错误依据期望数量及判定规则第 4 个字段。三、真实错误示例解读AttentionUpdate 场景剖析官方文档给出的典型报错示例如下Parameters lse and go of AttentionUpdate have invalid tensor nums 4 and 4. Reason: The number of tensors in input lse and go should be twice the attr sp, where sp is 2.逐段解读Parameters lse and goAttentionUpdate 算子的lse与go两个输入参数均未通过张量数量校验invalid tensor nums 4 and 4两个参数实际传入的张量数量都是 4Reason: The number of tensors in input lse and go should be twice the attr sp, where sp is 2根据算子属性sp值为 2的约束lse与go的张量数量应为sp × 2 4的两倍关系不成立——即期望值与实际值之间出现了倍数关系上的不匹配。需要说明的是示例中 4 与 4 的呈现方式是为了演示「多参数批量上报」的错误格式当多个参数同时出错时实际数量会被拼接成一个可读的字符串如4 and 4随错误一并打印便于开发者一眼定位到所有出错的参数而不是逐参数分别抛错。四、底层实现上报宏源码级剖析4.1 上报入口宏EZ0023 由宏OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON触发定义于 include/op_common/log/log.h注释明确指出该接口「仅供算子或 aclnn 实现使用」#define OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON(entityName, paramNames, incorrectNums, reason) \ do { \ std::string _safe_entityName_(entityName); \ std::string _safe_paramNames_(paramNames); \ std::string _safe_incorrectNums_(incorrectNums); \ std::string _safe_reason_(reason); \ OP_LOGE_LIBOPAPI_REPORT(_safe_entityName_.c_str(), \ Parameters %s of %s have invalid tensor nums %s. Reason: %s., \ _safe_paramNames_.c_str(), _safe_entityName_.c_str(), _safe_incorrectNums_.c_str(), \ _safe_reason_.c_str()); \ const std::vectorconst char* msgKey {param_names, op_name, incorrect_nums, reason}; \ const std::vectorconst char* msgvalue {_safe_paramNames_.c_str(), _safe_entityName_.c_str(), \ _safe_incorrectNums_.c_str(), _safe_reason_.c_str()}; \ REPORT_PREDEFINED_ERR_MSG(EZ0023, msgKey, msgvalue); \ } while (0)该宏的内部执行链路分两步本地 ERROR 日志输出通过OP_LOGE_LIBOPAPI_REPORT打印可读的 ERROR 级别日志。该底层日志宏include/op_common/log/log.h会先通过CheckLogLevel判断当前日志级别是否允许输出再调用DlogRecord记录日志日志前缀携带__FILE__、__LINE__、子模块名、函数名、线程 ID 以及算子/节点信息便于追溯出错位置。结构化错误上报构造键值对数组msgKey/msgvalue键依次为param_names、op_name、incorrect_nums、reason调用REPORT_PREDEFINED_ERR_MSG(EZ0023, ...)完成错误码的标准化上报使上层框架能够识别并统一处理。宏体用do { ... } while(0)包裹保证在if/else等控制流中安全展开所有入参均先拷贝为std::string再取c_str()避免传入临时对象导致悬垂指针。4.2 函数原型与参数约定对应接口的完整参数约定见 docs/zh/api/op_common/log/OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON.mdOP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON(entityName, paramNames, incorrectNums, reason)参数名输入/输出类型支持说明entityName输入const char*/std::string算子名称或 ACLNN 接口名称paramNames输入const char*/std::string出错的参数名称列表如lse and goincorrectNums输入const char*/std::string各参数实际张量数量如4 and 4reason输入const char*/std::string错误原因描述返回值无。该宏只负责记录日志并上报错误码不改变函数返回语义调用方仍需自行return失败状态如ge::GRAPH_FAILED。五、实战如何在算子/ACLNN 实现中正确使用5.1 标准调用模式参考 docs/zh/api/op_common/log/OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON.md 中的调用示例示例仅供理解模式不可直接拷贝运行// 预期输出: Parameters lse and go of AttentionUpdate have invalid tensor nums 4 and 4. // Reason: The number of tensors in input lse and go should be twice the attr sp, where sp is 2. if (lseCount ! sp * 2 || goCount ! sp * 2) { std::string numMsg std::to_string(lseCount) and std::to_string(goCount); OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON(AttentionUpdate, lse and go, numMsg.c_str(), The number of tensors in input lse and go should be twice the attr sp, where sp is 2.); return ge::GRAPH_FAILED; }使用要点归纳先校验、后上报在算子/接口入口完成张量数量条件判断条件不满足时再调用上报宏数量拼接成字符串由于incorrectNums是字符串类型多参数时需用std::to_string将各计数值拼接示例中拼成4 and 4与paramNames的lse and go一一对应原因要可操作reason应说明期望数量及其判定依据如twice the attr sp帮助调用方直接理解如何修正上报后必须返回失败宏不改变控制流需显式返回错误状态避免带病继续执行。5.2 单参数场景的姊妹接口 EZ0022若仅单个参数的张量数量出错且能明确给出期望数量应使用单参数版本OP_LOGE_FOR_INVALID_TENSORNUM上报EZ0022其定义同样位于 include/op_common/log/log.h报错格式为Parameter %s of %s has invalid tensor num %ld. It should be %s.区别在于EZ0022 用%ld直接承载实际数量int64_t类型并携带期望值字段correct_numEZ0023 则用字符串承载多参数数量列表并追加reason原因字段。调用示例摘自 docs/zh/api/op_common/log/OP_LOGE_FOR_INVALID_TENSORNUM.md// 预期输出: Parameter instance of Foreach has invalid tensor num 1000. // It should be within the range [1, 950]. if (tensorCount MAX_COUNT || tensorCount 0) { OP_LOGE_FOR_INVALID_TENSORNUM(Foreach, instance, static_castint64_t(tensorCount), (within the range [1, std::to_string(MAX_COUNT) ]).c_str()); return ge::GRAPH_FAILED; }六、排查与解决步骤当运行中捕获到 EZ0023 报错时按以下路径定位与修复定位算子与参数从Parameters %s of %s中提取算子名或 ACLNN 接口名与出错参数列表回到算子定义或接口文档核对输入参数语义核对实际数量将invalid tensor nums %s中的数值与调用侧实际构造的 Tensor 列表长度逐一比对确认是「传少了」还是「传多了」理解期望约束重点阅读Reason:后的描述——期望数量通常与算子属性如示例中的attr sp、输入输出配对关系或规格约束相关对照算子规格文档确认正确的张量数量修正调用侧调整传入的张量列表使其数量满足约束例如示例中要求张量数量为sp的两倍复核日志链路若为自研算子确认代码中的校验分支使用了OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON多参数或OP_LOGE_FOR_INVALID_TENSORNUM单参数等标准化宏保证日志与错误码上报格式与框架约定一致。七、扩展阅读本错误码英文原始说明docs/en/error_code/Operator-Errors/EZ0023-Invalid_Argument.md中文版docs/zh/error_code/Operator-Errors/EZ0023-Invalid_Argument.md上报接口完整文档docs/zh/api/op_common/log/OP_LOGE_FOR_INVALID_TENSORNUMS_WITH_REASON.md日志接口全家桶索引docs/zh/api/op_common/log/log.md 与 docs/zh/api/op_common/0_op_common_list.md全部算子错误码清单docs/en/error_code/Operator-Errors/Operator-Errors.md错误码注册表与上报宏定义源码src/op_common/log/log.cpp、include/op_common/log/log.h。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表