
Understanding and Resolving EZ0017 Invalid Argument Tensor Format Errors in CANN opbase【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase当你在基于 CANN opbase 开发的算子或 aclnn 接口中看到形如Parameter x of ResizeBilinearV2 has incorrect format ND. It should be NCHW or NHWC.的报错时说明算子参数校验阶段检测到了 Tensor 的 format数据排布格式与预期不符。本文以 EZ0017 官方错误说明 为主体结合 opbase 仓库中错误码的源码定义、日志上报宏实现与 format 工具实现为你完整拆解该错误码的触发机制、信息结构、排查步骤与在算子代码中的正确使用方式。EZ0017 错误码在 opbase 错误体系中的定位opbase 的错误码体系按错误类别分为 Nnopbase Errors 与 Operator Errors 两大类EZ0017 属于后者其错误类别errClass为Operator Errors错误标题errTitle为Invalid_Argument_Tensor_Format用于表达单个参数的数据排布格式非法且明确给出了期望格式这一场景。完整错误码列表可参见 Operator-Errors 索引。在 log.cpp 中EZ0017 以预定义错误码条目的形式注册其定义如下字段内容errClassOperator ErrorserrTitleInvalid_Argument_Tensor_FormatErrCodeEZ0017ErrMessageParameter %s of %s has incorrect format %s. It should be %s.Arglistparam_name, op_name, incorrect_format, correct_formatSolutionCheck whether the format of input/output tensor is correct.可以看到该错误码携带 4 个参数占位符与文档中给出的报错格式完全对应是算子在 format 校验失败时应当使用的标准错误出口。报错信息结构与占位符语义EZ0017 的标准报错格式如下Parameter %s of %s has incorrect format %s. It should be %s.四个%s占位符按顺序分别代表占位符含义对应 Arglist第 1 个参数名param name如xparam_name第 2 个算子名或 aclnn 接口名如ResizeBilinearV2op_name第 3 个实际传入的错误 format如NDincorrect_format第 4 个期望的正确 format如NCHW or NHWCcorrect_format官方给出的报错示例如下Parameter x of ResizeBilinearV2 has incorrect format ND. It should be NCHW or NHWC.该示例说明算子的输入张量x实际使用的数据排布是ND而该算子只接受NCHW或NHWC两种排布因此在校验阶段直接失败并抛出 EZ0017。源码级实现OP_LOGE_FOR_INVALID_FORMAT 宏EZ0017 对应的日志上报宏为OP_LOGE_FOR_INVALID_FORMAT定义于 log.h。该宏的接口注释明确指出此接口仅供算子或 aclnn 实现使用其函数原型为OP_LOGE_FOR_INVALID_FORMAT(entityName, paramName, incorrectFormat, correctFormat)四个入参的含义与类型如下参数名说明支持类型entityName算子名称或 aclnn 接口名称const char* 或 std::stringparamName参数名称const char* 或 std::stringincorrectFormat实际传入的 format如 NHWCconst char* 或 std::stringcorrectFormat期望的 format如 NCHWconst char* 或 std::string从宏实现可以看出其工作流程分两步调用OP_LOGE_LIBOPAPI_REPORT输出 ERROR 级别日志日志文本即Parameter %s of %s has incorrect format %s. It should be %s.调用REPORT_PREDEFINED_ERR_MSG(EZ0017, ...)携带键值对param_name / op_name / incorrect_format / correct_format上报预定义错误码 EZ0017。宏内部对 4 个入参统一做了std::string安全转换_safe_entityName_等局部变量因此直接传入字符串字面量或 std::string 均可无需手动转义。在算子代码中的实际调用方式以文档示例对应的 ResizeBilinearV2 场景为例OP_LOGE_FOR_INVALID_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; }调用要点前置校验先用if判断当前 format 是否落在合法集合内命中非法分支才调用宏并返回失败状态码如GRAPH_FAILED格式字符串化incorrectFormat参数建议通过Ops::Base::ToString(format_)之类工具将枚举值转换为可读字符串如ND使报错信息对开发者友好期望格式描述correctFormat可以是单个格式如NCHW也可以是合法格式集合的自然语言描述如NCHW or NHWC用于指导调用方修正。深入理解 Tensor Formatopbase 中的格式定义要准确排查 EZ0017需要理解 opbase 中 format 的表示方式。在 format_utils.cpp 中format 同时存在字符串形式与枚举形式两套表示并通过映射表互相转换。ToFormat内部维护了kStringToFormatMap将字符串映射为Format枚举其中常见的格式包括字符串Format 枚举说明NCHWFORMAT_NCHW深度学习中常用的四维排布通道维度排在第 2 位NHWCFORMAT_NHWC通道维度排在最后的四维排布NDFORMAT_ND通用多维排布无固定维度语义NC1HWC0FORMAT_NC1HWC0昇腾场景下按 C0 切分的五维排布FRACTAL_ZFORMAT_FRACTAL_Z卷积场景常用的分形排布FRACTAL_NZFORMAT_FRACTAL_NZ分形排布的变体NCDHW / NDHWC / DHWCN...五维3D 场景排布FRACTAL_Z_C04FORMAT_FRACTAL_Z_C04特定 SoC 版本下的分形排布format_utils.cpp 还实现了诸如 format 是否为 5D/分形类排布的判定逻辑从源码结构看这类工具函数是算子做 format 合法性预检即触发 EZ0017 之前的那一层判断的常用基础设施。从源码可以推断format 字符串与枚举的映射覆盖了昇腾算子开发中绝大多数排布约定报错信息中出现的格式名称均可在该映射表中找到对应枚举。与相邻错误码的辨析opbase 中与 format 相关的错误码不止 EZ0017 一个容易混淆建议按如下维度区分错误码报错格式适用场景EZ0006Input parameter %s of %s has incorrect format %s. It should be %s.输入参数 format 非法明确指出期望格式历史接口风格EZ0017Parameter %s of %s has incorrect format %s. It should be %s.单个参数 format 非法明确指出期望格式EZ0018Parameters %s of %s have incorrect formats %s. Reason: %s.多个参数 format 非法附带原因如所有输入 format 必须一致EZ0035Parameter %s of %s has incorrect format %s. Reason: %s.单个参数 format 非法附带具体原因如受 SoC 版本限制对应关系同样体现在宏层面OP_LOGE_FOR_INVALID_FORMAT上报 EZ0017OP_LOGE_FOR_INVALID_FORMAT_WITH_REASON上报 EZ0035OP_LOGE_FOR_INVALID_FORMATS_WITH_REASON上报 EZ0018三者均定义于 log.h 中。选择依据很简单需要明确告诉调用方应该是什么格式时用 EZ0017需要补充为什么错时用 EZ0035/EZ0018。解决方法与排查步骤遇到 EZ0017 报错时核心解决思路是检查输入或输出 Tensor 的 format 是否正确具体可按下述步骤操作定位报错参数从报错信息中提取第 1 个占位符对应的参数名如x确认是哪个输入/输出张量出了问题对比实际与期望格式报错中的第 3 个占位符是实际 format如ND第 4 个是期望 format如NCHW or NHWC确认二者确实不匹配回溯调用侧检查调用该算子/aclnn 接口的上游代码确认 Tensor 创建或转换时使用的 format必要时使用aclnn侧提供的 format 转换能力将张量转换为算子支持的排布确认算子支持范围对照算子文档确认其合法 format 集合若期望格式中包含NC1HWC0、FRACTAL_Z等昇腾专用排布还需确认数据来源是否经过合适的融合/转换流程检查平台差异个别 format如 EZ0035 示例中的FRACTAL_Z_C04仅在特定 SoC 版本下可用若排布正确却仍报 format 相关错误需核对运行平台的硬件版本约束。小结EZ0017 是 opbase 算子与 aclnn 接口中单个参数 format 非法且指明期望格式的标准错误出口。通过本文可以掌握报错文本中四个占位符的准确语义、OP_LOGE_FOR_INVALID_FORMAT宏的源码实现与调用范式、opbase 中 format 字符串与枚举的映射关系以及与 EZ0006/EZ0018/EZ0035 等相邻错误码的区分方法。在开发算子时遵循先校验 format 合法集合、失败即上报 EZ0017 并返回失败状态的模式能够让你的算子错误信息对下游调用方高度可读、可直接定位问题。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考