的成因与排查实践)
CANN opbase 错误码 EZ1004/EZ1005 全解文件解析失败File Operation Error Parse的成因与排查实践【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读EZ1004 与 EZ1005 是 CANN 算子库基础框架 opbase 中Nnopbase Errors错误类下的File_Operation_Error_Parse文件解析失败错误码二者共用同一错误格式Failed to parse file %s. Reason: %s.分别面向解析器抛出的语法/运行时异常与文件内容不符合标准结构两类场景。本文以 EZ1004 官方错误说明 为骨架结合仓库中错误码的注册与触发源码讲清该错误码的产生链路、典型报错含义与完整排查思路帮助开发者在算子二进制、kernel 库 JSON 等配置文件解析失败时快速定位并恢复。一、错误码定位它在错误体系中的位置在 opbase 仓库中NNopbaseAclNN 算子执行框架层的错误码集中定义于 Nnopbase-Errors 索引页涵盖 EZ1001参数错误到 EZ1014执行错误共 14 个错误码。其中EZ1003文件打开失败File_Operation_Error_OpenEZ1004文件解析失败File_Operation_Error_ParseEZ1005文件解析失败内容非法File_Operation_Error_Parse与 EZ1004 同 errTitle但语义指向内容非标准结构在错误码注册表 src/nnopbase/composite_op/log/op_error_manager.cpp 中EZ1004 与 EZ1005 的元信息如下字段EZ1004EZ1005errClassNnopbase ErrorsNnopbase ErrorserrTitleFile_Operation_Error_ParseFile_Operation_Error_ParseErrCodeEZ1004EZ1005ErrMessageFailed to parse file %s. Reason: %s.Failed to parse file %s. Reason: %s.Arglistfile, reasonfile, reasonsuggestion.Possible CauseN/A1. 自定义算子 JSON 文件损坏 2. 内置算子 JSON 文件损坏suggestion.SolutionN/A1. 重装自定义算子包 2. 重装内置算子包同一份错误码定义errTitle、ErrMessage在算子侧Operator Errors类EZ0031也存在对应文档见 EZ0031-File_Operation_Error_Parse。EZ0031 面向算子开发阶段的自定义配置文件解析而 EZ1004/EZ1005 面向运行时框架对算子 JSON 元数据与二进制的解析两者适用阶段不同排查时需区分。二、错误格式解析%s 占位符的语义官方文档明确规定EZ1004 与 EZ1005 的错误信息格式为Failed to parse file %s. Reason: %s.两个%s占位符按顺序分别表示文件名file解析失败的目标文件完整路径例如算子 kernel 的 JSON 描述文件、ops-info 配置或二进制文件路径错误原因reason导致解析失败的具体原因通常来自 JSON 解析器抛出的异常信息或框架内部校验失败的自定义原因文本。该格式与源码中的宏定义完全一致。在 src/nnopbase/common/inc/nnopbase_error_msg.h 中EZ1004 与 EZ1005 分别由两个宏生成#define OP_LOGE_FOR_FILE_OPERATION_ERROR_PARSE(file, reason) \ do { \ std::string msg std::string(Failed to parse file ) file \ . Reason: reason .; \ const std::vectorconst char* msgKey {file, reason}; \ const std::vectorconst char* msgValue {file, reason}; \ OP_LOGE_WITHOUT_REPORT(EZ1004, %s, msg.c_str()); \ REPORT_PREDEFINED_ERR_MSG(EZ1004, msgKey, msgValue); \ } while (false) #define OP_LOGE_FOR_FILE_OPERATION_ERROR_PARSE_WITH_INVALID_CONTENT(file, reason) \ do { \ std::string msg std::string(Failed to parse file ) file \ . Reason: reason .; \ const std::vectorconst char* msgKey {file, reason}; \ const std::vectorconst char* msgValue {file, reason}; \ OP_LOGE_WITHOUT_REPORT(EZ1005, %s, msg.c_str()); \ REPORT_PREDEFINED_ERR_MSG(EZ1005, msgKey, msgValue); \ } while (false)可以看到框架在抛出错误时不仅通过OP_LOGE_WITHOUT_REPORT写入错误日志还通过REPORT_PREDEFINED_ERR_MSG将file与reason作为键值对上报便于上层错误管理系统如 plog / 错误码采集将日志与结构化错误码关联。三、典型报错实例逐字解读官方文档给出了一个 EZ1004 的完整报错示例Failed to parse file /home/developer/Ascend/cann-9.0.0/opp/built-in/op_impl/ai_core/tbe//kernel/ascendxxxx/ops_legacy/add/Add_41dadce325b0f810d03359af2a38990b_high_performance.json. Reason: [json.exception.parse_error.101] parse error at line 4, column 14: syntax error while parsing object - unexpected string literal; expected }.对这条报错可以拆解为三层信息信息片段含义/home/developer/Ascend/cann-9.0.0/opp/built-in/op_impl/ai_core/tbe//kernel/ascendxxxx/ops_legacy/add/Add_..._high_performance.json出错的内置算子 kernel 描述文件位于 CANN 安装目录 opp 包中是 Add 算子的_high_performance变体 JSON[json.exception.parse_error.101]nlohmann/json 库的解析异常编号 101属于语法错误类别parse error at line 4, column 14: syntax error while parsing object - unexpected string literal; expected }具体位置与原因文件第 4 行第 14 列在解析对象时遇到了意外的字符串字面量期望的是}。典型场景是键值对之间缺少逗号、结尾多写了逗号、引号未闭合或括号不匹配parse_error.101是 nlohmann/json 的标准错误类型几乎可以断定问题出在 JSON 文件本身的语法层面而非框架逻辑。此类错误常见诱因包括文件在传输/拷贝过程中被截断、被文本编辑器或脚本意外改写了格式、多字节字符编码损坏、以及人为手工编辑后未做格式校验。EZ1005 的官方示例则展示了另一类问题Failed to parse file /home/developer/Ascend/cann-9.0.0/opp/built-in/op_impl/ai_core/tbe/config/ascendxxx/aic-ascendxxxx-ops-info-oam.json. Reason: The operator JSON file is not in the standard key-value structure.这里的Reason不再是解析器异常而是框架自定义的校验提示算子 JSON 文件不是标准的键值结构。也就是说文件本身是合法 JSON但顶层结构不符合框架约定的对象key-value形态导致merge_patch或后续字段访问失败。四、源码级成因EZ1004/EZ1005 究竟在哪些环节触发通过检索仓库中所有调用宏的位置可以勾勒出该错误码的完整触发链路。框架对算子 kernel 相关 JSON 的解析主要集中在复合算子引擎composite_op与单算子执行器individual_op两条路径。4.1 kernel 库 JSON 合并解析最典型场景与官方示例完全对应src/nnopbase/composite_op/aclnn_engine/op_kernel_lib.cpp 中的OpKernelLib::Initialize()是官方示例中该类报错的核心出处for (const auto filePath : opKernelLibFilePaths) { OP_LOGI(OpKernelLib start parse json file: %s., filePath.c_str()); try { std::ifstream f(filePath); allKernelsJson_.merge_patch(Json::parse(f)); OP_CHECK(allKernelsJson_.is_object(), OP_LOGE_FOR_FILE_OPERATION_ERROR_PARSE_WITH_INVALID_CONTENT( filePath.c_str(), The operator JSON file is not in the standard key-value structure), return ACLNN_ERR_INNER_LOAD_JSON_FAILED); } catch (std::exception e) { OP_LOGE_FOR_FILE_OPERATION_ERROR_PARSE(filePath.c_str(), e.what()); return ACLNN_ERR_INNER_LOAD_JSON_FAILED; } }这段代码揭示了两层触发逻辑Json::parse(f)抛出异常如json.exception.parse_error.101时异常信息e.what()被原样作为Reason走EZ1004上报文件解析成功但顶层不是 JSON 对象时抛出框架自定义原因The operator JSON file is not in the standard key-value structure走EZ1005上报。加载顺序为自定义算子包custom opp vendors 算子包 内置算子包built-in并且框架会对所有同名 JSON 做merge_patch合并这意味着任意一个包的 JSON 语法损坏都可能中断整个 kernel 库的初始化返回ACLNN_ERR_INNER_LOAD_JSON_FAILED。4.2 单个 kernel 二进制的 JSON 校验在 src/nnopbase/composite_op/aclnn_engine/op_kernel.cpp 中还有两处典型触发点二进制数据读取失败时将errno与系统错误文本拼成 Reason 走 EZ1004op_kernel.cpp非 fat-bin 场景下JSON 中缺少必需的kernelName字段时抛出自定义原因The operator JSON file does not contain the kernel name走 EZ1005op_kernel.cpp。由此可以推断EZ1005 不仅用于非标准结构也用于缺少必需字段的内容校验。4.3 单算子individual op执行路径单算子执行框架同样复用了这两个宏src/nnopbase/individual_op/executor/indv_executor.cpp单算子二进制信息解析失败src/nnopbase/individual_op/executor/indv_bininfo.cppbininfo 解析失败src/nnopbase/individual_op/executor/indv_collector.cpp解析binary_info_config.json失败并携带 OPP 包相关的原因常量。另外复合算子引擎中 src/nnopbase/composite_op/aclnn_engine/kernel_mgr.cpp 在解析 kernel 管理 JSON 时同样会走 EZ1004。这说明EZ1004 覆盖了框架内所有读取并解析算子相关 JSON/二进制的公共入口而 EZ1005 则专门用于内容/结构/字段级的语义校验失败。五、排查与恢复实践结合官方文档给出的 Solution按 Reason 中的提示定位问题提供正确的文件与 EZ1005 的恢复建议重装自定义/内置算子包完整的排查流程建议如下读透 Reason二分定位Reason 以[json.exception.*]开头 → JSON 语法层错误EZ1004Reason 为not in the standard key-value structure、does not contain the kernel name等 → 内容/结构层错误EZ1005Reason 包含[Errno N]→ 文件读取层错误EZ1004常见于权限、文件缺失。按报错中的文件路径检查文件是否存在对照报错中的完整路径确认文件确实存在于该位置并检查读写权限与文件大小是否异常0 字节或明显被截断多半是安装/拷贝失败。校验 JSON 语法将报错中给出的文件拷贝出来用任意 JSON 校验工具或脚本检查。若报错给出行列号如line 4, column 14直接定位到对应行重点检查括号匹配、逗号缺失、引号与转义字符。修复后应恢复原始文件内容而不是依赖框架的merge_patch容错。区分自定义包与内置包选择性重装EZ1005 的官方建议是分别重装自定义算子包或内置算子包。仓库在加载时对 custom opp、vendors、built-in 三部分做优先级合并因此可先通过报错路径判断归属路径含custom或自定义安装目录 → 重装自定义算子包scripts/package/opbase/scripts/opp_custom_install.sh 等安装脚本可参考路径含opp/built-in如官方示例→ 重装内置算子包opp 包。回归验证修复或重装后重新执行算子编译/运行流程确认不再出现Failed to parse file ...且算子 kernel 库成功初始化正常时日志会出现Successfully initialized op kernel library见 op_kernel_lib.cpp。收集现场证据如果问题持续保留完整报错文本、出错 JSON 文件、以及出错时刻的 plog 日志供 CANN 技术支持定位。六、如何从源头规避这类错误仓库测试目录中存放了大量算子 kernel 的 JSON 样例如 tests/nnopbase/mock/built-in/op_impl 下的 mock 数据以及 tests/nnopbase/mock/static_kernel/ai_core 下的静态 kernel 测试 JSON可供核对标准结构。在开发与交付阶段建议开发期引入格式校验门禁算子 JSON 生成后先做语法与 schema 校验再打包交付期避免手工编辑内置包交付前走完整构建流程自定义包交付前用官方提供的校验工具核对运行期关注环境完整性安装、升级、覆盖安装后核对 opp 目录文件数量与校验和避免出现半截文件或旧版本残留文件被错误解析。七、与相邻错误码的区分错误码errTitle典型 Reason 形态适用阶段EZ1003File_Operation_Error_Open打开文件失败路径/权限文件访问层EZ1004File_Operation_Error_Parse解析器异常JSON 语法错误等文件解析层EZ1005File_Operation_Error_Parse内容非标准键值结构、缺少必需字段文件内容校验层EZ0031File_Operation_Error_ParseAIPP 等算子配置项缺失算子开发/配置阶段一句话总结EZ1004 是文件读得进但解析器报错EZ1005 是文件能解析但内容不合规。排查时先读Reason关键字再对照报错文件路径决定是修复文件内容、重新生成配置还是重装对应算子包即可快速收敛问题。参考文档EZ1004 官方错误说明EZ1005 官方错误说明Nnopbase-Errors 错误码索引EZ0031 算子侧文件解析错误【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考