CANN opbase 错误码 EZ0021 深度解析:多参数张量数据类型校验失败(Invalid Argument Tensor Dtype)
CANN opbase 错误码 EZ0021 深度解析多参数张量数据类型校验失败Invalid Argument Tensor Dtype【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase本篇文章面向 CANN 算子库基础框架opbase的算子开发者与 aclnn 接口实现者围绕错误码EZ0021Invalid Argument Tensor Dtype展开。该错误码用于描述一个算子或接口的多个参数同时存在数据类型不匹配的场景是算子入参校验中最常见的失败类型之一。阅读本文后你将掌握 EZ0021 的错误格式与占位符语义、它对应的日志宏OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON的调用方式以及从源码层面定位、复现与修复此类 dtype 校验失败的完整思路。EZ0021 是什么错误码定位与适用场景EZ0021 属于 opbase 错误码体系中的Operator Errors算子错误分类错误码全称为EZ0021 Invalid_Argument_Tensor_Dtype。在 错误码索引 中它与 EZ0001EZ0038 一起构成算子侧参数校验错误的完整集合。它的典型适用场景是算子的多个输入/输出 Tensor 之间的数据类型相互约束被违反。典型情况包括多个输入 Tensor 的数据类型应当保持一致如两个输入必须同为 FLOAT16多个输入 Tensor 的数据类型应当与某个期望类型集合匹配如要么全为 FLOAT32要么全为 FLOAT16成对出现的输入如位置编码算子中的 cos 与 sin 表数据类型不匹配。与单参数 dtype 错误EZ0019、EZ0020不同EZ0021 专门面向多个参数同时出错且需要附带具体失败原因的场景因此它的错误信息中同时携带参数名列表、实际数据类型列表和原因描述三段信息便于开发者一次性定位多个错误输入。错误信息格式与占位符语义EZ0021 的错误信息遵循如下固定模板定义见 log.cpp 错误注册表Parameters %s of %s have incorrect dtypes %s. Reason: %s.四个%s占位符按顺序依次表示占位符含义典型取值示例第 1 个 %s参数名称列表多个参数名用 and 连接cos and dy第 2 个 %s算子名称或 aclnn 接口名称RotaryPositionEmbeddingGrad第 3 个 %s实际传入的错误数据类型列表FLOAT16 and FLOAT32第 4 个 %s错误原因描述The dtypes of input cos and input dy should be the same.模板中的单数/复数使用是精确的因为本错误码面向多参数场景所以主语是复数Parameters、谓语是have数据类型同样以复数形式dtypes呈现。这条规则与同族错误码 EZ0019单参数、期望类型明确、EZ0020单参数、附带原因形成严格区分。官方错误示例EZ0021 文档 给出的真实示例来自旋转位置编码反向算子RotaryPositionEmbeddingGradParameters cos and dy of RotaryPositionEmbeddingGrad have incorrect dtypes FLOAT16 and FLOAT32. Reason: The dtypes of input cos and input dy should be the same.这条信息可以拆解为出错实体RotaryPositionEmbeddingGrad算子出错参数cos和dy两个输入 Tensor实际数据类型FLOAT16cos与FLOAT32dy不一致失败原因算子要求输入 cos 与输入 dy 的数据类型必须相同。值得注意的是RotaryPositionEmbeddingGrad在 opbase 错误码文档中是一个高频示例算子兄弟错误码 EZ0013 也以该算子的dy、cos、sin三个参数为例说明维度数必须同为 3D 或 4D。这从侧面印证了该算子存在一套完整的参数约束校验链先校验形状再校验数据类型任一环节失败都会抛出对应的 EZ 错误码。底层实现OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON 日志宏EZ0021 错误码在源码中的生成入口是日志宏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)该宏接收四个参数宏参数类型支持说明entityNameconst char* / std::string算子名称或 aclnn 接口名称paramNamesconst char* / std::string参数名称列表字符串形式如cos and dyincorrectDtypesconst char* / std::string实际数据类型列表字符串形式如FLOAT16 and FLOAT32reasonconst char* / std::string错误原因描述从实现可以看出该宏的两个关键设计双重上报机制宏内部先用OP_LOGE_LIBOPAPI_REPORT输出一条带日志上下文的 ERROR 级别日志再用REPORT_PREDEFINED_ERR_MSG以结构化字段param_names、op_name、incorrect_dtypes、reason上报预定义错误码EZ0021。前者面向日志文件排查后者面向错误码框架与上层接口报错链路二者通过同一组_safe_*局部变量保持信息一致。空指针安全宏先把入参拷贝为std::string_safe_*前缀即暗示这一点避免调用方传入临时对象或空指针导致格式化崩溃同时保证msgKey/msgvalue中使用的c_str()指针在整个宏作用域内有效。日志上报链路从宏到日志系统OP_LOGE_LIBOPAPI_REPORT本身也是一个宏定义在 log.h其核心逻辑是#define OP_LOGE_LIBOPAPI_REPORT(opName, fmt, ...) \ do { \ 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__); \ } \ } while (0)该链路中值得关注的工程细节日志模块 IDOP_MODULE_ID固定为 63算子侧日志均挂载在该模块下级别控制EZ0021 以DLOG_ERROR数值 3级别上报且上报前先调用CheckLogLevel做级别开关判断——当模块日志级别被调高关闭 ERROR时该条日志会被静默丢弃避免无谓开销上下文信息日志自动携带__FILE__、__LINE__、OP_SUBMOD_NAME默认OPS_BASE、函数名与线程 ID通过syscall(__NR_gettid)获取方便在多线程算子执行场景中定位问题线程空指针防护GetSafeStr与GetOpInfo会把nullptr归一化为nil保证无论传入算子名还是算子上下文对象GetNodeType/GetNodeName都能安全打印。错误码注册表EZ0021 的定义位置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. } }这份注册表把错误码 → 消息模板 → 结构化参数列表 → 解决建议四者绑定在一起Arglist中给出的四个字段正是上述宏中REPORT_PREDEFINED_ERR_MSG的msgKey。也就是说只要算子代码调用一次OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON框架即可据此把日志消息与结构化字段自动关联成完整的 EZ0021 错误记录。同族错误码辨析EZ0019 / EZ0020 / EZ0021dtype 校验错误在 opbase 中共有三个相邻错误码选用哪个取决于参数数量与是否需要附加原因。三者定义与宏映射如下错误码适用场景消息模板对应日志宏EZ0019单参数 dtype 错误且能给出期望类型Parameter %s of %s has incorrect dtype %s. It should be %s.OP_LOGE_FOR_INVALID_DTYPE见 log.hEZ0020单参数 dtype 错误需要附加原因Parameter %s of %s has incorrect dtype %s. Reason: %s.OP_LOGE_FOR_INVALID_DTYPE_WITH_REASON见 log.hEZ0021多参数 dtype 错误需要附加原因Parameters %s of %s have incorrect dtypes %s. Reason: %s.OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON选择建议只有一个参数类型错误、且约束是必须是某类型时优先用 EZ0019错误信息更直观单参数错误但失败原因需要解释如需与另一参数保持一致但另一参数本身合法时用 EZ0020多个参数同时不满足类型约束时必须使用 EZ0021——它把参数名与错误类型以列表形式一并呈现一条日志即可覆盖全部问题参数。错误信息中的单复数措辞Parameters/have/dtypes与上述宏一一对应这也是排查时判断错误码归属的一个快速线索。实战在算子实现中使用 EZ0021EZ0021 的实际调用方式可以参考 中文接口文档 中的调用示例。以下代码展示在RotaryPositionEmbeddingGrad反向实现中如何校验 cos 与 dy 的数据类型一致性并上报 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. 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; }调用要点拼接数据类型列表第三个参数incorrectDtypes是字符串需要用Ops::Base::ToString(dtype)把枚举类型的 dtype 转成FLOAT16这类可读名称后拼接多参数用 and 连接返回值约定上报错误后通常立即返回ge::GRAPH_FAILED结束算子校验阶段阻断后续计算日志宏的位置OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON仅供算子实现或 aclnn 接口实现内部使用log.h 中明确注明以下接口仅供算子或 aclnn 实现使用普通用户代码不应直接调用头文件依赖使用该宏需包含 include/op_common/log/log.h并依赖其中#include base/err_msg.h提供的REPORT_PREDEFINED_ERR_MSG上报能力。排查与解决方案收到 EZ0021 后怎么办按照 EZ0021 文档 与错误注册表给出的建议收到该错误码后的排查步骤为定位出错实体与参数从错误信息的第 2、3 个字段确认是哪个算子/接口、哪些参数出错核对实际与期望类型比较第 3 个字段给出的实际 dtype 列表与算子约束如两输入须同 dtype之间的差异检查调用侧张量创建代码确认输入 Tensor 的创建/转换环节是否设置了正确的 dtype例如误将 CPU 侧默认的 FLOAT32 数据喂给了要求 FLOAT16 的输入必要时做显式转换若业务上允许可通过aclTensor的 dtype 转换或框架的 cast 能力将输入统一到期望类型结合日志上下文深挖在日志中搜索OpName:[RotaryPositionEmbeddingGrad]定位具体代码行日志带__FILE__:__LINE__确认校验分支是否命中了正确的错误上报路径。需要说明的是EZ0021 描述的是参数校验失败而不是计算执行失败因此它的出现几乎总是意味着调用方传入的 Tensor 数据类型与算子定义不符。修复应优先发生在调用侧或算子侧的前置转换逻辑而非执行侧。延伸阅读错误码官方英文说明EZ0021-Invalid_Argument_Tensor_Dtype中文版见 docs/zh/error_code/Operator-Errors/EZ0021-Invalid_Argument_Tensor_Dtype.mdOperator Errors 全量索引Operator-Errors.md日志宏接口文档OP_LOGE_FOR_INVALID_DTYPES_WITH_REASON、日志接口总览、op_common API 介绍宏定义与日志上报实现include/op_common/log/log.h、src/op_common/log/log.cpp同族错误码对比EZ0019/EZ0020 单参数 dtype 错误EZ0013 多参数 shape 维度错误同为多参数 reason 模式可参考其排查思路【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

论文降AI率工具测评与实操指南

论文降AI率工具测评与实操指南

1. 论文降AI率工具测评背景与核心痛点最近两年,学术圈对AI生成内容的检测越来越严格。去年我带的几个研究生就遇到了这样的问题:明明是自己熬夜写的论文,查重率明明只有10%,但AI检测率却高达40%,直接被导师打回来要求重…

2026/9/19 9:38:17 阅读更多 →
PHP+ThinkPHP构建冷水壶商城系统实战

PHP+ThinkPHP构建冷水壶商城系统实战

1. 项目概述:基于PHPThinkPHP的冷水壶商城系统设计与实现去年接手了一个校园创业团队的项目需求,要开发一款专营冷水壶的微信小程序商城。作为技术负责人,我选择了PHPThinkPHP的技术栈进行后端开发,配合MySQL数据库和微信小程序前…

2026/9/19 9:38:17 阅读更多 →
大型零件三维扫描检测实战:摄影测量与精度控制全流程解析

大型零件三维扫描检测实战:摄影测量与精度控制全流程解析

做大型零件三维扫描检测这行久了,见过不少客户拿着图纸急吼吼找上门,开口就问“能不能扫,精度多少,几天能出报告”。说实话,小型零件你闭着眼睛都能扫,但一旦遇上两三米以上的铸件、焊接结构件、风电叶片或…

2026/9/20 12:02:46 阅读更多 →

最新新闻

OAI数据集申请与下载全流程:从账号注册到DICOM处理

OAI数据集申请与下载全流程:从账号注册到DICOM处理

1. 为什么OAI数据集值得折腾这一整套流程如果你正在做医学影像相关的算法研究,尤其是骨关节、肌肉骨骼方向的深度学习项目,大概率绕不开OAI数据集。OAI全称Osteoarthritis Initiative,是一个长期跟踪膝关节骨关节炎的大规模公开研究队列&…

2026/9/20 12:02:23 阅读更多 →
ESP32音频abort残留问题与四层协同解决方案

ESP32音频abort残留问题与四层协同解决方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 12:02:23 阅读更多 →
GD32 MCU选型与开发实战:从内核架构到工程落地

GD32 MCU选型与开发实战:从内核架构到工程落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/20 12:02:23 阅读更多 →
深入 Compiler Explorer 构建系统架构:从 CMake 专用实现到可插拔的 BuildSystemDriver

深入 Compiler Explorer 构建系统架构:从 CMake 专用实现到可插拔的 BuildSystemDriver

深入 Compiler Explorer 构建系统架构:从 CMake 专用实现到可插拔的 BuildSystemDriver 【免费下载链接】compiler-explorer Run compilers interactively from your web browser and interact with the assembly 项目地址: https://gitcode.com/gh_mirrors/co/co…

2026/9/20 12:02:23 阅读更多 →
Pandoc 的 RST `class` 指令与标题属性合并:从 Issue 6699 到源码实现

Pandoc 的 RST `class` 指令与标题属性合并:从 Issue 6699 到源码实现

Pandoc 的 RST class 指令与标题属性合并:从 Issue #6699 到源码实现 【免费下载链接】pandoc Universal markup converter 项目地址: https://gitcode.com/gh_mirrors/pa/pandoc reStructuredText(RST)的 .. class:: 指令在 Pandoc 中…

2026/9/20 12:02:23 阅读更多 →
CANN ops-transformer GroupedMatMulAlltoAllv 算子实战:路由专家计算与 AlltoAllv 通信的融合方案

CANN ops-transformer GroupedMatMulAlltoAllv 算子实战:路由专家计算与 AlltoAllv 通信的融合方案

算子库人工智能深度学习Ascend 【免费下载链接】ops-transformer 本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.com/cann/ops-transformer 点击查看 免费下载 导读 GroupedMatMulAlltoAllv 是 C…

2026/9/20 12:01:22 阅读更多 →

日新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/20 0:00:46 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/20 0:00:46 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/20 0:00:46 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/19 23:01:36 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/19 23:35:34 阅读更多 →