尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

CANN opbase 算子日志宏 OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON 使用指南:多参数数据类型校验错误的记录与 EZ0021 错误码上报

CANN opbase 算子日志宏 OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON 使用指南:多参数数据类型校验错误的记录与 EZ0021 错误码上报 CANN opbase 算子日志宏 OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON 使用指南多参数数据类型校验错误的记录与 EZ0021 错误码上报【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON是 CANN opbase 算子基础框架库cann/opbase为算子与 aclnn 接口实现提供的数据类型校验日志宏用于在多个参数的数据类型同时不满足校验条件时输出带具体原因的 ERROR 级别日志并上报EZ0021错误码。本文基于官方接口文档并结合仓库源码完整讲解该宏的函数原型、参数语义、底层实现链路、日志与错误码格式以及与单参数变体宏的差异帮助算子开发者在 InferShape / Tiling 校验阶段写出规范、可定位、可排查的报错代码。功能说明多参数数据类型校验错误的统一出口在算子开发无论是内置算子还是自定义算子过程中InferShape 等 Host 侧校验逻辑经常需要判断多个输入/输出参数的数据类型dtype是否满足算子约束。当校验失败时直接使用裸的printf或OP_LOGE无法将错误信息上报到统一的错误码体系给用户排查带来困难。OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON正是针对这一场景设计当算子的多个参数数据类型不正确时该宏会输出一条ERROR 级别的算子日志日志中附带具体原因reason同时向框架上报EZ0021Invalid_Argument_Tensor_Dtype错误码使报错信息进入 CANN 标准错误码体系便于上层框架与工具链识别。从接口定位上看该宏属于 op_common 接口列表 中log 分类下的正式接口定义在头文件op_common/log/log.h中详见宏定义源码与其它OP_LOGE_FOR_*系列宏一起构成了 opbase 面向算子/接口参数校验的统一日志与错误上报能力。函数原型OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON(entityName, paramNames, incorrectDtypes, reason)该宏仅输出日志与上报错误码不改变程序控制流。调用方需要在校验失败分支中自行决定后续行为如返回ge::GRAPH_FAILED这与OP_CHECK_IF等带返回语义的宏有所区别。参数说明参数名输入/输出说明entityName输入算子名称或 aclnn 接口名称支持const char*或std::string类型。paramNames输入参数名称列表多个参数名如cos and dy支持const char*或std::string类型。incorrectDtypes输入实际数据类型列表如FLOAT16 and FLOAT32支持const char*或std::string类型。reason输入错误原因描述支持const char*或std::string类型。宏内部通过GetSafeStr对const char*/char*/std::string三种入参类型做了统一适配std::string会通过c_str()取出裸指针因此调用处无需为类型做额外转换。返回值说明无返回值。宏仅负责日志记录与错误码上报。约束说明无额外约束。使用时注意在包含op_common/log/log.h头文件的环境下调用即可该头文件位于 CANN 安装目录${INSTALL_DIR}/include下以 root 安装为例安装路径为/usr/local/Ascend/cann。调用示例官方文档给出的关键代码示例如下仅供参考不支持直接拷贝运行。该示例来自 RotaryPositionEmbeddingGrad 算子的 dtype 一致性校验当输入cos与dy的数据类型不一致时拼接两个实际 dtype 字符串作为incorrectDtypes并说明失败原因// 预期输出: Parameters cos and dy of RotaryPositionEmbeddingGrad have incorrect dtypes // FLOAT16 and FLOAT32. Reason: The dtypes of input cos and input dy should be the same. if (cosDtype ! dyDtype) { std::string dtypeMsg Ops::Base::ToString(cosDtype) and Ops::Base::ToString(dyDtype); OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON(RotaryPositionEmbeddingGrad, cos and dy, dtypeMsg.c_str(), The dtypes of input cos and input dy should be the same.); return ge::GRAPH_FAILED; }示例中有三个值得关注的实践点使用Ops::Base::ToString格式化 dtypeOps::Base::ToString(ge::DataType)在 src/op_common/log/log.cpp 中实现内部通过ge::TypeUtils::DataTypeToSerialString将ge::DataType枚举转换为可读字符串如FLOAT16、FLOAT32。多参数场景下将多个 dtype 字符串拼接如FLOAT16 and FLOAT32后传入宏日志可读性最佳。.c_str()传参宏内部虽然兼容std::string但示例中显式使用dtypeMsg.c_str()传入风格上更贴近日志接口的 C 字符串语义。显式控制返回宏调用后调用方返回ge::GRAPH_FAILED保证校验失败路径立即中止错误语义明确。源码实现解析从宏展开到日志落盘与错误码上报宏定义本体OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON在 include/op_common/log/log.h 中定义核心结构如下保留关键逻辑#define OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON(entityName, paramNames, incorrectDtypes, reason) \ do { \ std::string _safe_entityName_(entityName); \ std::string _safe_paramNames_(paramNames); \ std::string _safe_incorrectDtypes_(incorrectDtypes); \ std::string _safe_reason_(reason); \ OP_LOGE_LIBOPAPI_REPORT(_safe_entityName_.c_str(), \ Parameters %s of %s have incorrect dtypes %s. Reason: %s., \ _safe_paramNames_.c_str(), _safe_entityName_.c_str(), _safe_incorrectDtypes_.c_str(), \ _safe_reason_.c_str()); \ const std::vectorconst char* msgKey {param_names, op_name, incorrect_dtypes, reason}; \ const std::vectorconst char* msgvalue {_safe_paramNames_.c_str(), _safe_entityName_.c_str(), \ _safe_incorrectDtypes_.c_str(), _safe_reason_.c_str()}; \ REPORT_PREDEFINED_ERR_MSG(EZ0021, msgKey, msgvalue); \ } while (0)可以观察到该宏采用双通道上报设计日志通道OP_LOGE_LIBOPAPI_REPORT负责打印 ERROR 级别算子日志错误码通道REPORT_PREDEFINED_ERR_MSG(EZ0021, msgKey, msgvalue)将错误码与结构化键值对param_names、op_name、incorrect_dtypes、reason上报到框架。REPORT_PREDEFINED_ERR_MSG及相关错误码定义来自 log.h 引入的base/err_msg.h而 EZ0021 的注册信息在 src/op_common/log/log.cpp 中通过REG_FORMAT_ERROR_MSG完成。日志打印底层链路OP_LOGE_LIBOPAPI_REPORTinclude/op_common/log/log.h的打印逻辑为if (CheckLogLevel(static_castint(OP_MODULE_ID), DLOG_ERROR) 1) { DlogRecord(static_castint(OP_MODULE_ID), DLOG_ERROR, [%s:%d][%s][%s][% PRIu64 ] OpName:[%s] fmt, __FILE__, __LINE__, OP_SUBMOD_NAME, __FUNCTION__, Ops::Base::GetTid(), Ops::Base::GetSafeStr(Ops::Base::GetOpInfo(opName)), ##__VA_ARGS__); }关键点日志级别门控先通过CheckLogLevel判断当前模块OP_MODULE_ID 63的 ERROR 级别日志是否开启避免无效格式化开销统一日志前缀实际落盘日志包含源文件、行号、子模块名OP_SUBMOD_NAME默认OPS_BASE、函数名、线程 ID通过syscall(__NR_gettid)获取以及OpName:[...]方便在海量日志中定位到具体算子GetOpInfo容错当entityName为空指针时返回nilconst char*重载当传入 context 对象时则提取NodeType:NodeName组合信息include/op_common/log/log.h保证日志在异常场景下也不会崩溃。错误码 EZ0021 的格式化语义REPORT_PREDEFINED_ERR_MSG(EZ0021, ...)对应的错误码模板注册在 src/op_common/log/log.cpp{ errClass: Operator Errors, errTitle: Invalid_Argument_Tensor_Dtype, ErrCode: EZ0021, ErrMessage: Parameters %s of %s have incorrect dtypes %s. Reason: %s., Arglist: param_names, op_name, incorrect_dtypes, reason, suggestion: { Possible Cause: N/A, Solution: Check whether the dtypes of input/output tensors meet the condition. } }四个占位符%s依次对应param_names参数名列表、op_name算子名或接口名、incorrect_dtypes实际数据类型错误值、reason报错原因与宏参数一一对应。完整错误信息可查阅EZ0021 错误码说明文档其中给出的报错示例为Parameters cos and dy of RotaryPositionEmbeddingGrad have incorrect dtypes FLOAT16 and FLOAT32. Reason: The dtypes of input cos and input dy should be the same.与单参数变体的选型对比opbase 的 dtype 校验日志宏在 EZ0019 / EZ0020 / EZ0021 三个错误码上形成了完整梯度选型时应按“参数个数 是否需要原因”确定宏参数个数是否带原因错误码说明OP_LOGE_FOR_INVALID_DTYPE单个参数否带预期值 correctDtypeEZ0019消息格式Parameter %s of %s has incorrect dtype %s. It should be %s.OP_LOGE_FOR_INVALID_DTYPE_WITH_REASON单个参数是EZ0020消息格式Parameter %s of %s has incorrect dtype %s. Reason: %s.OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON多个参数是EZ0021消息格式Parameters %s of %s have incorrect dtypes %s. Reason: %s.本宏三者对应的宏定义在 include/op_common/log/log.h 中相邻排列EZ0019 位于 L605-L619、EZ0020 位于 L630-L643、EZ0021 位于 L655-L669实现模式完全一致均采用“安全副本 日志上报 错误码上报”三段式结构。选型建议仅单个参数 dtype 不合法且能给出明确预期值 → 使用OP_LOGE_FOR_INVALID_DTYPE单个参数 dtype 不合法、原因无法用“预期值”概括 → 使用OP_LOGE_FOR_INVALID_DTYPE_WITH_REASON多个参数如一对输入必须同 dtype同时不满足条件 → 使用本宏OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON例如示例中的“cos 与 dy 必须同 dtype”场景。使用建议与最佳实践在 InferShape / 参数校验函数入口尽早校验将 dtype 校验放在算子 InferShape 或 aclnn 接口参数校验的最前端一旦失败立即记录并返回ge::GRAPH_FAILED避免后续逻辑基于错误 dtype 继续执行。reason 要写出“为什么错”reason 是开发者排查的第一线索应写明约束关系例如The dtypes of input cos and input dy should be the same.而不仅仅是“dtype is wrong”这类无信息量描述。统一使用Ops::Base::ToString格式化 dtype/format不要手工拼写FLOAT16之类的字符串避免枚举扩展后日志失真ToString的多参数场景可先拼接再传入如示例中的dtypeMsg。注意日志性能宏通过CheckLogLevel做日志级别门控但incorrectDtypes等字符串拼接在调用方完成建议仅在校验失败分支低频路径中构造消息。保持返回语义一致宏本身不改变控制流调用后务必按校验逻辑显式return ge::GRAPH_FAILED或执行其它错误处理。相关资源OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON 接口文档宏定义源码 include/op_common/log/log.h错误码注册与 ToString 实现 src/op_common/log/log.cppEZ0021 错误码说明op_common 接口总览log 分类接口列表【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表