ARTICLE DETAIL

资讯详情

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

CANN Runtime 错误码 EE1018 深度解析:Invalid Argument API Call Sequence(API 调用序列非法)

CANN Runtime 错误码 EE1018 深度解析:Invalid Argument API Call Sequence(API 调用序列非法) CANN Runtime 错误码 EE1018 深度解析Invalid Argument API Call SequenceAPI 调用序列非法【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtimeEE1018 是 CANN Runtime 运行时RTS错误码系列中用于标识API 调用序列非法的通用错误。当某个 Runtime API 被重复调用、调用顺序不符合前置条件或在未完成必要初始化步骤前就被调用时Runtime 会以统一格式%s failed. Reason: %s.上报该错误。本文基于 EE1018 官方错误参考 与仓库源码完整讲解错误格式、典型触发场景、源码级原理与定位方法帮助开发者在遇到该错误时快速判断问题根因。EE1018 错误码是什么EE1018 属于 RTSRuntime System错误码大类错误标题为Invalid_Argument_API_Call_Sequence即参数合法但调用序列非法。在错误码注册中心 error_code.json 中它的定义如下字段值errClassRTS ErrorserrTitleInvalid_Argument_API_Call_SequenceErrCodeEE1018ErrMessage%s failed. Reason: %s.Arglistfunc, reason从中可以看出该错误的核心特征是传入参数本身通常是合法的问题出在 API 的调用时机或调用顺序上——例如重复执行了本应只执行一次的设置操作或者在某个前置资源创建完成之前就使用了该资源。因此错误信息中只携带两个占位符func报错阶段或 API 名和reason报错原因这也是本文关联文档中错误格式%s failed. Reason: %s.的来源。错误信息格式与占位符含义按照文档定义EE1018 的报错格式为%s failed. Reason: %s.两个占位符%s的含义依次为第一个%s报错阶段error stage或 API 名称API name如rtsLabelSet、aclrtSetLabel、aclrtProfilingInit等第二个%s报错原因error cause描述具体的非法调用情形。文档给出的标准报错示例如下rtsLabelSet failed. Reason: The label cannot be set repeatedly.该示例中rtsLabelSet是报错的 APIlabel 设置The label cannot be set repeatedly说明根因是 label 被重复设置。典型触发场景与源码级原理EE1018 在 Runtime 源码中被大量用于表达状态不满足预期的检查常配合COND_RETURN_AND_MSG_OUTER等条件宏以下按功能模块梳理最常见、也最具代表性的触发场景。场景一Label 被重复设置文档示例的出处rtsLabelSet failed. Reason: The label cannot be set repeatedly.对应的实现位于 label.cc 的Label::Set方法。该方法在提交 label 设置任务前依次做了一系列前置检查其中与 EE1018 直接相关的是COND_RETURN_AND_MSG_OUTER( setFlag_, RT_ERROR_LABEL_SET, ErrorCode::EE1018, rtLabelSet, The label cannot be set repeatedly);即当Label对象的setFlag_已经被置为true说明该 label 此前已经成功设置到某个 stream 上时再次调用设置接口就会触发 EE1018。从源码流程看setFlag_只有在任务成功提交后才被置位error dev-SubmitTask(labelTask); ... setFlag_ true; stream_ stm;也就是说同一个 Label 句柄只能被设置到 stream 上一次。若业务逻辑需要切换 label 绑定的 stream应重新创建 label 或先执行释放操作而不是复用同一个已设置的 label 再次调用设置接口。此外同一个 label 若被设置到另一个不同的 stream虽然返回的是另一错误码RT_ERROR_LABEL_STREAM对应EE1017但从调用序列角度看同样属于状态不一致问题。这两处检查共同保证了 label 与 stream 的绑定关系是稳定、可预期的。场景二设置 Label 前未创建 Label 列表在Label::Set中还有另一处 EE1018 检查针对较新版本的 TSTS_VERSION_MORE_LABELCOND_RETURN_AND_MSG_OUTER( ((devDstAddr_ nullptr) (dev-GetTschVersion() static_castuint32_t(TS_VERSION_MORE_LABEL))), RT_ERROR_LABEL_PHY_ADDR_NULL, ErrorCode::EE1018, aclrtSetLabel, Before setting the label using aclrtSetLabel, you need to call aclrtCreateLabelList to create a label list);它约束了 API 的调用顺序在使用aclrtSetLabel设置 label 之前必须先调用aclrtCreateLabelList创建 label 列表对应Label::SetLabelDevAddr写入devDstAddr_。若跳过该前置步骤直接设置 label将触发 EE1018错误信息会明确提示先调用 aclrtCreateLabelList 创建 label 列表。场景三算子内核函数重复注册在 api_error.cc 中注册算子内核函数时同样使用 EE1018 表示重复注册error RT_ERROR_KERNEL_DUPLICATE, error, ErrorCode::EE1018, Registering an operator kernel function,即相同的内核函数被注册了两次属于典型的重复执行单次操作类非法调用序列。场景四Host 内存重复注册与解注册在 api_error.cc 中有两处error RT_ERROR_HOST_MEMORY_ALREADY_REGISTERED, error, ErrorCode::EE1018, Host memory address registration, error RT_ERROR_HOST_MEMORY_NOT_REGISTERED, error, ErrorCode::EE1018, Unregistering host memory,对已注册的 Host 内存地址再次执行注册操作 → 触发 EE1018对未注册过的 Host 内存地址执行解注册操作 → 触发 EE1018。这要求注册/解注册接口严格配对使用且同一地址不可重复注册。场景五Profiling 分析重复使能或停止在 runtime.cc 中启动 profiling 分析时检查了使能状态若 profiler 已经被使能则报ErrorCode::EE1018, Starting profiling analysis, profiler is already enabled, cannot set repeatedly而 runtime.cc 中停止 profiling 分析也使用 EE1018 标识状态异常。这意味着 profiling 的启动/停止必须遵循未使能时启动、已使能时停止的调用节奏不可嵌套或重复。场景六模型运行实例Model RI构建与执行在 model.cc 中aclmdlRIBuildEnd、模型执行等多个环节均以 EE1018 表达调用序列错误例如endGraphNum_ ! 1U→ Ending model running instance build结束模型构建的次数异常streams_.empty()→ 模型构建结束前未绑定任何 streamaclmdlRIBuildEnd在未处于构建中状态时被调用RT_ERROR_MODEL_NOT_END模型执行时模型尚未结束构建RT_ERROR_MODEL_NOT_END, ErrorCode::EE1018, Model execution。这些场景的共同规律是模型运行实例的生命周期状态机创建 → 构建 → 执行 → 销毁中的每一步都必须严格按序推进跳步或重复推进都会落入 EE1018。场景七Stream 捕获ACL Graph 捕获状态异常在 ACL Graph 捕获相关代码中EE1018 被用于表达捕获状态的非法流转例如 capture_session.ccstatus RT_STREAM_CAPTURE_STATUS_NONE, RT_ERROR_STREAM_NOT_CAPTURED, ErrorCode::EE1018, Stream end capture,以及 v100/api_impl_aclgraph.cc 中的rtStreamAddCondTask检查。当对未处于捕获状态的 stream 执行结束捕获或在捕获状态下执行不支持的追加任务时会触发 EE1018。场景八设备重置、上下文校验与事件等待等其他场景设备重置api_error.cc 中RT_ERROR_CONTEXT_DEL对应 Resetting the device设备重置操作与上下文生命周期存在顺序约束上下文校验context_manage.cc 中 Context validation事件等待event.cc 中 Waiting for an event 的两次状态检查设备保留计数api_impl.cc 中设备 retain 次数异常回调注册api_impl.cc 中未注册回调时执行相关操作RT_ERROR_STREAM_NO_CB_REG流停止stream.cc 中 rtsStreamStop。从这些分散在 api_error.cc、api_impl.cc、stream.cc、event.cc、runtime.cc 等文件中的触发点可以看出EE1018 是 Runtime 中最通用的状态机校验错误码任何重复设置、未初始化即使用、生命周期顺序错乱类问题都可能映射到该错误码。如何定位与解决 EE1018根据文档的解决方法指引按照报错提示定位问题Please locate the issue based on the prompts in the error message建议按以下步骤排查第一步解析报错中的两个占位符EE1018 的报错信息%s failed. Reason: %s.已经精确指出了问题位置和原因第一个%s指出哪个 API 或哪个阶段出错例如rtsLabelSet、aclrtSetLabel、aclrtProfilingInit、aclmdlRIBuildEnd等第二个%s指出具体的非法调用情形例如The label cannot be set repeatedly、profiler is already enabled, cannot set repeatedly、Before setting the label using aclrtSetLabel, you need to call aclrtCreateLabelList to create a label list。第二步对照 API 生命周期检查调用序列根据报错中的 API 名检查业务代码中的调用顺序是否满足该 API 的前置条件是否重复调用单次性操作注册、使能、设置是否被重复执行例如 label 重复设置、内核函数重复注册、Host 内存重复注册、profiler 重复使能是否遗漏前置步骤使用某个资源前是否完成了必要的初始化例如aclrtSetLabel前是否调用了aclrtCreateLabelList是否跳步/乱序状态机类流程模型构建、stream 捕获、profiling 启停、内存注册/解注册配对是否严格按序执行是否配对使用注册与解注册、使能与停止、创建与销毁是否成对出现第三步结合日志与源码定位在启用 plog 日志后参考 日志相关环境变量可以在 Runtime 日志中搜索报错 API 名或错误码 EE1018查看其前的调用上下文结合本文列出的源码触发点如 label.cc、api_error.cc确认代码路径中具体是哪一条状态检查条件未满足。与相邻错误码的区分EE1018 与 RTS 错误码系列中的其他参数类错误容易混淆定位时应先区分EE1017同样以%s failed.开头但格式为%s failed. Parameter %s is invalid. Reason: %s.多了一个param占位符表示参数本身非法如 label 与 stream 所属模型不一致、stream 与 label 已关联 stream 不一致定义见 error_code.jsonEE1018格式为%s failed. Reason: %s.表示参数合法但调用序列非法重复调用、顺序错乱、前置缺失。二者的本质区别在于参数值有没有问题。若报错聚焦在某个具体参数的值上大概率是 EE1017若报错描述的是不能重复/需要先调用/状态不匹配等时序问题则是 EE1018。小结EE1018Invalid_Argument_API_Call_Sequence是 CANN Runtime 用于标识API 调用序列非法的通用错误码信息格式为%s failed. Reason: %s.依次填充报错阶段/API 名与报错原因典型触发场景包括 label 重复设置、设置 label 前未创建 label 列表、内核函数重复注册、Host 内存重复注册/解注册、profiler 重复使能、模型运行实例构建/执行乱序、stream 捕获状态异常等均可从 label.cc、api_error.cc、model.cc 等源码中逐一印证排查时应优先解析报错中的 API 名与原因描述对照重复调用、前置缺失、跳步乱序、配对缺失四类模式检查调用序列必要时结合 Runtime 日志确认触发路径。更多 RTS 错误码请参考 RTS-Errors 错误码索引完整错误码注册信息见 error_code.json。若需要在代码中复现 label 相关调用序列可参考仓库示例 0_simple_label含 main.cpp 与运行脚本其配套文档见 示例 README。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表