ARTICLE DETAIL

资讯详情

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

CANN opbase 错误码 EZ1007(Invalid_Argument_Tensor_Input_Shape):Tensor 输入 Shape 维度错误定位与解决指南

CANN opbase 错误码 EZ1007(Invalid_Argument_Tensor_Input_Shape):Tensor 输入 Shape 维度错误定位与解决指南 CANN opbase 错误码 EZ1007Invalid_Argument_Tensor_Input_ShapeTensor 输入 Shape 维度错误定位与解决指南【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读EZ1007 是 CANN opbase算子库基础框架库中用于标识「Tensor 输入 Shape 维度错误」的标准错误码归属于 Nnopbase Errors 错误类别。当算子入参 Tensor 的 Shape 不满足广播Broadcast等形状约束条件时框架会在 infershape 阶段抛出该错误并携带输入 Shape、算子名、出错维度及具体原因。读完本文你将掌握 EZ1007 的报错格式与占位符语义、源码层的触发链路错误宏 → 广播检查实现 → 错误信息注册表以及从 Reason 反推并修正输入 Shape 的实操方法。错误码概览属性取值错误码EZ1007错误标题errTitleInvalid_Argument_Tensor_Input_Shape错误类别errClassNnopbase Errors错误场景算子输入 Tensor 的 Shape 维度不满足形状约束典型为广播条件所属模块opbase 框架的 infershape / 形状校验该错误码由 opbase 统一注册在 src/nnopbase/composite_op/log/op_error_manager.cpp 的g_errorInfoJson中其ErrMessage、Arglist与错误码一一对应同时可在 docs/zh/error_code/Nnopbase-Errors/Nnopbase-Errors.md 中查看到 EZ1001~EZ1014 完整的错误码索引。错误信息格式与占位符语义EZ1007 的报错格式固定如下共包含 4 个%s占位符Shape %s of the tensor of operator %s has incorrect dimension %s. Reason: %s.各占位符的取值含义依次为占位符含义来源参数第 1 个%s输入参数的 Shape 值如[4, 2]paraName第 2 个%s算子名如aclnnAdd_0opName第 3 个%s出错的维度值dim即校验失败处两个 Shape 在该维上不兼容的维度数值dim第 4 个%s报错原因Reason说明形状约束为何不满足reason该格式串在 src/nnopbase/composite_op/log/op_error_manager.cpp 的g_errorInfoJson中定义Arglist声明为paraName, opName, dim, reason即四个占位符的填充顺序与上表一致。报错示例逐段解读框架给出的典型报错示例如下Shape [4, 2] of the tensor of operator aclnnAdd_0 has incorrect dimension 2. Reason: The tensor whose shape is [4, 2] and the tensor whose shape is [4, 3] do not meet the broadcast condition.逐段拆解Shape [4, 2]触发错误时被用于广播校验、且维数较多的那个 Shape源码中称为 largerDimShapeof the tensor of operator aclnnAdd_0错误发生在aclnnAdd_0算子aclnnAdd 的实例名的 Tensor 入参校验中has incorrect dimension 2在维度数值为2的位置上校验失败对应[4, 2]与[4, 3]的最后一个维度Reason两个 Shape[4, 2]与[4, 3]不满足广播条件——即2与3既不相等、也不存在任一维度为1。源码级触发链路EZ1007 从哪里来EZ1007 并非孤立的报错文案而是由「错误信息注册表 错误宏 广播校验实现」三层协作产生。1. 错误宏定义nnopbase_error_msg.h 定义了专门用于输出 EZ1007 的宏OP_LOGE_FOR_INVALID_ARGUMENT_TENSOR_INPUT_SHAPE(paraName, dim, reason)#define OP_LOGE_FOR_INVALID_ARGUMENT_TENSOR_INPUT_SHAPE(paraName, dim, reason) \ do { \ std::string opName op::internal::GetLogApiInfo(); \ std::string msg std::string(Shape ) paraName of the tensor of operator opName \ has incorrect dimension dim . Reason: reason .; \ const std::vectorconst char* msgKey {paraName, opName, dim, reason}; \ const std::vectorconst char* msgValue {paraName, opName.c_str(), dim, reason}; \ OP_LOGE_WITHOUT_REPORT(EZ1007, %s, msg.c_str()); \ REPORT_PREDEFINED_ERR_MSG(EZ1007, msgKey, msgValue); \ } while (false)可以看到算子名通过op::internal::GetLogApiInfo()自动获取因此报错中的算子名是框架自动填充的宏内部同时完成两件事——用OP_LOGE_WITHOUT_REPORT输出带错误码EZ1007的日志用REPORT_PREDEFINED_ERR_MSG上报结构化错误信息msgKey/msgValue 与注册表中的Arglist对应。2. 广播校验实现与唯一触发点EZ1007 在当前仓库中的实际触发点位于 src/nnopbase/common/utils/shape_utils.cpp 的op::BroadcastInferShape()。该校验函数逐维比较两个 Shape先取维数较多者为largerDimShape另一个为smallerDimShapeshape_utils.cpp从最后一个维度向前对齐比较调用BroadcastDim(dim1, dim2)判断该维度是否可广播shape_utils.cpp一旦某一维校验失败就拼接出 Reason 文案并调用宏上报 EZ1007shape_utils.cpp。其核心判断逻辑BroadcastDimshape_utils.cpp遵循标准的 NumPy 风格广播规则static bool BroadcastDim(int64_t dim1, const int64_t dim2) { if (dim1 dim2) { return true; } if ((dim1 ! 1) (dim2 ! 1)) { return false; } dim1 (dim1 1) ? dim2 : dim1; return true; }即两个维度满足「相等」或「其中一个为 1」时即可广播否则返回 false进而触发 EZ1007。3. 接口声明与调用范围CheckBroadcastShape与BroadcastInferShape两个接口在 include/nnopbase/opdev/shape_utils.h 对外声明供 opbase 各算子的 infershape 逻辑复用。EZ1007 正是这类公共形状校验在失败时面向用户的统一出口。广播规则速查如何判断 Shape 是否合法结合源码中的BroadcastDim实现两个 Shape 可广播需满足按末尾对齐逐维比较每一维要么相等、要么其中一个为 1。仓库单测 tests/nnopbase/ut/composite_op/test_shape_utils.cpp 给出了可运行的正反例输入 Shape 组合判定说明[2, 2]与[2]可广播低维 Shape 自动向高位对齐[2]与[2, 1]可广播维度 1 可扩展[2, 2]与[2, 5]不可广播维度2与5既不等、也非 1[2, 2, 5]与[2, 1, 5]可广播中间维2与1满足广播条件[2, 2]与[2, 2, 5]不可广播对齐后首维2与2相等但次维2与5冲突同时 tests/nnopbase/st/composite_op/test_shape_utils.cpp 的TestBroadcastInferShape还验证了广播成功时输出 Shape 的推导结果如[2]与[2, 2, 3, 2]广播结果为[2, 2, 3, 2]失败时BroadcastInferShape返回false。定位与解决方法EZ1007 的处理步骤如下读取 Reason 定位冲突维度Reason 中会明确指出「形状为 A 的 Tensor 与形状为 B 的 Tensor 不满足广播条件do not meet the broadcast condition」据此可立即判断是哪两个 Shape 在哪个维度上冲突。按广播规则修正输入将冲突维修改为相等或其中一方为 1。例如[4, 2]与[4, 3]不兼容可改为[4, 2]与[4, 1]维度 1 可扩展或[4, 2]与[4, 2]完全相等亦可调整维度顺序使 Shape 对齐后满足条件。核对调用代码与算子语义确认传入 aclnn 接口如aclnnAdd的 Tensor Shape 是否符合算子对输入形状含 batch 维度、约减维度等的要求对逐元素类算子重点检查广播约束。结合日志进一步排查若 Reason 无法完全定位可开启算子日志opbase 的OP_LOGD级日志见 shape_utils.cpp 中Check broadcast ...的调试输出查看参与广播比较的原始 Shape再依据 docs/zh/error_code/Nnopbase-Errors/Nnopbase-Errors.md 中 EZ1007 的索引条目对照排查。修复后重新执行EZ1007 属于参数类错误修正输入 Shape 并重新调用即可它不代表算子或框架运行故障无需重装算子包。相关资源导航错误码文档docs/zh/error_code/Nnopbase-Errors/EZ1007-Invalid_Argument_Tensor_Input_Shape.md错误码总索引docs/zh/error_code/Nnopbase-Errors/Nnopbase-Errors.md错误宏定义src/nnopbase/common/inc/nnopbase_error_msg.h错误信息注册表src/nnopbase/composite_op/log/op_error_manager.cpp广播校验实现src/nnopbase/common/utils/shape_utils.cpp对外接口声明include/nnopbase/opdev/shape_utils.h单元测试tests/nnopbase/ut/composite_op/test_shape_utils.cpp、tests/nnopbase/st/composite_op/test_shape_utils.cpp【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表