ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

CANN opbase 算子日志宏 OP_LOGE_FOR_INVALID_FORMAT:参数格式校验错误的记录与 EZ0017 错误码上报指南

CANN opbase 算子日志宏 OP_LOGE_FOR_INVALID_FORMAT:参数格式校验错误的记录与 EZ0017 错误码上报指南 CANN opbase 算子日志宏 OP_LOGE_FOR_INVALID_FORMAT参数格式校验错误的记录与 EZ0017 错误码上报指南【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读本文聚焦 CANN opbase 算子库公共日志体系中的OP_LOGE_FOR_INVALID_FORMAT宏讲解其功能定位、函数原型、参数语义与底层实现原理。它是include/op_common/log/log.h提供的预定义错误上报系列宏之一专用于算子在格式format校验失败时输出 ERROR 级别日志并联动上报 EZ0017 错误码。读完本文你将掌握该宏的完整用法、输出日志与错误码的对应关系以及如何在自定义算子 InferShape 等校验逻辑中落地使用。功能定位格式校验错误的标准话术上报入口在算子开发尤其是 shape 推导与参数校验阶段中Tensor 的 format如NCHW、NHWC不匹配是最常见的参数错误之一。如果每个算子各自拼日志文案会导致日志格式五花八门、难以检索错误码也无法统一关联。OP_LOGE_FOR_INVALID_FORMAT正是为解决这一问题而设计的宏当算子的指定参数格式与预期不符时它输出一条 ERROR 级别日志并同步上报 EZ0017Invalid Argument Tensor Format错误码。从源码结构看该宏属于 opbase 日志库中预定义错误消息predefined error message家族与 OP_LOGE_FOR_INVALID_SHAPEEZ0014、OP_LOGE_FOR_INVALID_DTYPEEZ0019等宏并列位于 include/op_common/log/log.h 中并在 日志接口总览 与 op_common 接口清单 中登记在册。函数原型OP_LOGE_FOR_INVALID_FORMAT(entityName, paramName, incorrectFormat, correctFormat)该宏没有返回值也无额外约束可直接在算子 InferShape、参数校验函数中调用。它只负责记录 上报不改变程序控制流——是否返回失败状态由调用方自行决定通常配合return ge::GRAPH_FAILED;使用。参数说明参数名输入/输出说明entityName输入算子名称或 aclnn 接口名称支持 const char* 或 std::string 类型。paramName输入参数名称支持 const char* 或 std::string 类型。incorrectFormat输入实际格式如 NHWC支持 const char* 或 std::string 类型。correctFormat输入预期格式如 NCHW支持 const char* 或 std::string 类型。四个参数均为输入性质宏内部只读取不修改。其类型兼容性来自 log.h 中提供的Ops::Base::GetSafeStr模板重载分别处理const char*、char*与std::string保证任意受支持类型都能安全转换为 C 字符串参与日志格式化。源码级实现原理在 include/op_common/log/log.h 中该宏的实现分为三个关键步骤类型安全归一化宏先将四个入参分别拷贝为局部std::string_safe_entityName_、_safe_paramName_、_safe_incorrectFormat_、_safe_correctFormat_避免入参为临时对象或空指针时在后续处理中产生生命周期/解引用问题。输出 ERROR 日志通过OP_LOGE_LIBOPAPI_REPORT输出日志。日志文案固定为Parameter %s of %s has incorrect format %s. It should be %s.四个占位符依次对应paramName、entityName、incorrectFormat、correctFormat。OP_LOGE_LIBOPAPI_REPORT本身log.h会先调用CheckLogLevel(OP_MODULE_ID, DLOG_ERROR)做日志级别开关判断命中后才调用DlogRecord落盘日志行自动携带源文件、行号、子模块名OPS_BASE、函数名、线程 ID 以及OpName:[...]算子信息便于在海量日志中定位。上报错误码通过REPORT_PREDEFINED_ERR_MSG(EZ0017, msgKey, msgvalue)上报错误码键值对为msgKey {param_name, op_name, incorrect_format, correct_format} msgvalue {paramName, entityName, incorrectFormat, correctFormat}这使得 EZ0017 错误码的上下文信息结构化可供上层错误处理、DFX 模块解析使用。该宏与 EZ0017 错误码的绑定关系也可在错误码手册 EZ0017 Invalid Argument Tensor Format 中交叉验证其报错格式一节给出的模板与宏内文案完全一致。调用示例关键代码示例如下参考 原文档仅供参考不支持直接拷贝运行// 预期输出: Parameter x of ResizeBilinearV2 has incorrect format ND. It should be // NCHW or NHWC. if (format_ ! ge::FORMAT_NCHW format_ ! ge::FORMAT_NHWC) { OP_LOGE_FOR_INVALID_FORMAT(ResizeBilinearV2, x, Ops::Base::ToString(format_).c_str(), NCHW or NHWC); return ge::GRAPH_FAILED; }该示例对应的真实报错文本为与 EZ0017 错误码文档 中的示例一致Parameter x of ResizeBilinearV2 has incorrect format ND. It should be NCHW or NHWC.从 错误码手册 的解决方法章节可知收到该报错后排查方向是检查输入或输出 tensor 的 format 是否设置正确例如算子实现与框架侧 Format 推导结果不一致、或上层构图时 Format 属性传递错误。与姊妹宏的选型对比日志库中还有两个与 format 相关的宏使用时按场景区分宏上报错误码适用场景OP_LOGE_FOR_INVALID_FORMATEZ0017单参数格式错误给出实际值 预期值推荐在能明确列出合法格式时使用OP_LOGE_FOR_INVALID_FORMAT_WITH_REASONEZ0035单参数格式错误但更适合用一句话描述原因如仅支持 NCHW 与 NHWCOP_LOGE_FOR_INVALID_FORMATS_WITH_REASONEZ0018多参数格式同时校验失败可一并列出多个参数名与多个实际格式三者的源码实现log.h结构完全同构均为类型安全拷贝 →OP_LOGE_LIBOPAPI_REPORT输出标准文案 →REPORT_PREDEFINED_ERR_MSG上报对应错误码区别仅在于文案模板与错误码编号。因此本文介绍的调用方式、参数类型约束与输出格式理解可平滑迁移到其他OP_LOGE_FOR_INVALID_*系列宏。使用建议校验失败即调用format 校验是 InferShape 的常见前置检查发现不符时应同时输出日志并返回失败码如ge::GRAPH_FAILED避免错误静默传导到后续 tiling 阶段。预期格式写清楚correctFormat建议直接写合法格式枚举的字符串形式如NCHW or NHWC让报错对开发者和运维都具备直接可读性。善用错误码检索由于该宏统一上报 EZ0017线上日志与错误码平台可按错误码聚合统计快速发现哪些算子、哪些参数频繁出现格式错误。保持与文档一致所有预定义日志宏的文案模板已冻结在 log.h 中不要自行改写文案以免破坏错误码与文本的映射关系如需补充原因改用_WITH_REASON系列宏。总结OP_LOGE_FOR_INVALID_FORMAT是 CANN opbase 日志体系中参数格式校验失败的标准上报入口通过标准文案日志 EZ0017 结构化错误码双通道输出让算子侧校验逻辑与平台侧错误处理无缝衔接。结合 log.h 源码理解其内部三步实现安全拷贝、级别过滤日志、错误码上报即可在自定义算子开发中正确、统一地落地格式校验。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进