CANN Runtime 错误码 EE1002 深度解读:流同步超时(Stream Synchronize Timeout)的成因、定位与处置

发布时间:2026/9/19 21:26:15
CANN Runtime 错误码 EE1002 深度解读:流同步超时(Stream Synchronize Timeout)的成因、定位与处置
CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载导读EE1002Execution_Error_Stream_Synchronize_Timeout是 CANN Runtime 中专门用于表示“流同步超时”的执行类错误码典型报错形态为Stream synchronize timeout. %s。本文以 docs/en/error_code_ref/RTS-Errors/EE1002-Execution_Error_Stream_Synchronize_Timeout.md 为骨架结合仓库中的错误码注册表、日志宏定义与Stream::Synchronize轮询实现帮助读者准确识别该错误码的触发场景并掌握超时参数配置、日志定位与常见处置流程。一、错误码总览EE1002 属于 RTS ErrorsRuntime Software 层错误类别其全称为Execution_Error_Stream_Synchronize_Timeout专用于流同步超时场景。该错误码的官方注册信息可在 src/dfx/error_manager/error_code.json 中查到ErrCodeEE1002ErrClassRTS ErrorsErrTitleExecution_Error_Stream_Synchronize_TimeoutErrMessageStream synchronize timeout. %sArglistextend_info占位符%s处填充的具体报错原因suggestion可能原因是“超时时间间隔设置不合理”解决建议为“检查超时时间设置是否合理、检查网络是否正常”在运行时内部该错误码对应的日志常量定义于 src/runtime/core/inc/spec/base_info.hppstatic constexpr const char_t* RT_STREAM_SYNC_TIMEOUT_INNER_ERROR EE1002;同时在 src/runtime/core/inc/common/rt_log.h 与 src/runtime/core/inc/common/error_code_meta.h 中完成了错误码枚举与日志模板的注册/* EE1002 - Execution_Error_Stream_Synchronize_Timeout */ X(EE1002, EE1002, (extend_info), Stream synchronize timeout. %s. ErrorCodeEE1002.\n, DLOG_ERROR)也就是说EE1002 最终以DLOG_ERROR 级别写入日志落盘格式统一为Stream synchronize timeout. 具体原因. ErrorCodeEE1002.二、报错格式与典型示例2.1 错误信息格式原文档 EE1002-Execution_Error_Stream_Synchronize_Timeout.md 给出的报错格式如下占位符%s表示报错原因Stream synchronize timeout. %s报错示例如下Stream synchronize timeout. rtModelExecute execution failed.结合上文的日志宏定义实际打屏/落盘的完整形态还会带上ErrorCodeEE1002后缀Stream synchronize timeout. rtModelExecute execution failed. ErrorCodeEE1002.2.2extend_info参数与报错原因EE1002 的参数列表为extend_info即该错误码唯一接受一个“扩展信息”字符串参数用于填充%s。在仓库的错误码使用指引中给出了一个典型调用示例stream_c.cc中的DataDumpLoadInfoTask synchronizeCOND_RETURN_AND_MSG_OUTER(error RT_ERROR_STREAM_SYNC_TIMEOUT, error, ErrorCode::EE1002, DataDumpLoadInfoTask synchronize);对应打屏效果Stream synchronize timeout. DataDumpLoadInfoTask synchronize. ErrorCodeEE1002.由此可以归纳%s位置填充的是触发超时的具体同步任务/接口语义描述而不是笼统的“超时”字样。排查时务必以%s处的描述为入口定位是哪个同步动作模型执行、算子任务、Debug 注册任务等发生了超时。三、触发场景从源码看 EE1002 在哪些路径被上报EE1002 的底层触发条件为内部错误码RT_ERROR_STREAM_SYNC_TIMEOUT定义于 src/runtime/core/inc/common/internal_error_define.hpp当流同步Stream Synchronize在指定时间内未完成时Runtime 将内部错误码映射为 EE1002 对外上报。仓库中典型的触发路径包括触发路径源码位置%s处描述示例模型执行/模型相关同步src/runtime/feature/model/model.ccmodel abort stream模型相关流同步src/runtime/feature/model/model_c.ccDebugRegisterTask synchronizeAICPU 模型销毁流同步src/runtime/feature/model/model_c.ccAicpuMdlDestroy streamDataDump 加载任务同步src/runtime/core/src/stream/stream_c.ccDataDumpLoadInfoTask synchronize同步获取 Device 消息src/runtime/core/src/stream/stream_c.ccSyncGetDeviceMsgAICPU 信息加载任务同步src/runtime/core/src/stream/stream_c.ccAicpuInfoLoadTask synchronize更新/设置超时配置同步src/runtime/core/src/stream/stream_c.ccUpdateTimeoutConfig/SetTimeoutConfig主题消息版本同步src/runtime/core/src/stream/stream_c.ccTopicMsgVersion流同步 API 直接上报src/runtime/api/impl/api_impl.ccStream synchronize timeout, the current task is ...XPU 平台流同步src/runtime/feature/xpu/stream_xpu.ccexceeded the specified timeout此外在上下文Context同步路径中src/runtime/core/src/context/context.cc 同样会在流同步超时后返回RT_ERROR_STREAM_SYNC_TIMEOUT并携带当前正在运行任务的类型、设备号、流号与任务号等信息便于精确定位。四、底层原理Stream::Synchronize 的超时轮询实现4.1 超时判定与上报EE1002 的直接来源是流同步等待循环。以 src/runtime/core/src/stream/stream.cc 的Stream::SynchronizeExecutedTask为例其核心循环如下rtError_t Stream::SynchronizeExecutedTask(const uint32_t taskId, const mmTimespec beginTime, int32_t timeout) { ... const int32_t REPORT_TIME_UINT 180 * 1000; // report timeout every 3 min. int32_t reportTime REPORT_TIME_UINT; ... while (true) { COND_PROC_RETURN_ERROR_MSG_INNER( (IsProcessTimeout(beginTime, timeout)), RT_ERROR_STREAM_SYNC_TIMEOUT, this-SetNeedSyncFlag(true); , Stream synchronize timeout, device_id%u, stream_id%d, timeout%dms., device_-Id_(), streamId_, timeout); if (IsProcessTimeout(beginTime, reportTime)) { reportTime REPORT_TIME_UINT; RT_LOG(RT_LOG_EVENT, report three minutes timeout! stream_id%d, sq_id%u, task_id%u, ..., ...); if (Runtime::Instance()-excptCallBack_ ! nullptr) { Runtime::Instance()-excptCallBack_(RT_EXCEPTION_TASK_TIMEOUT); } } ... error CheckContextStatus(false); ... const uint16_t exeEndTaskId GetExecuteEndTaskId(); if (((exeEndTaskId ! MAX_UINT16_NUM) IsTaskExcuted(exeEndTaskId, taskId)) || (sqHead posTail)) { return RT_ERROR_NONE; } ... } }从源码结构可以归纳出同步等待的三个关键机制超时判定每次循环通过IsProcessTimeout(beginTime, timeout)实现在 src/runtime/core/inc/common/thread_local_container.hpp 声明比较当前时间与起始时间的差值。一旦超过timeout阈值即返回RT_ERROR_STREAM_SYNC_TIMEOUT并置位流的needSync标志。周期性汇报以REPORT_TIME_UINT 180000ms3 分钟为周期通过RT_LOG_EVENT输出report three minutes timeout事件日志并回调Runtime::Instance()-excptCallBack_(RT_EXCEPTION_TASK_TIMEOUT)通知上层异常处理框架。这意味着即使未触发最终超时长时间未完成的同步也会留下事件日志与异常回调痕迹。退出条件任务已执行完成IsTaskExcuted或同步队列尾部sqHead posTail时正常返回若流处于 abort 状态、上下文异常或流状态非 NORMAL则分别返回对应错误码而非继续等待。类似地任务回收等待WaitConcernedTaskRecycledsrc/runtime/core/src/stream/stream.cc也会以RT_ERROR_STREAM_SYNC_TIMEOUT上报“任务回收超时”并携带tryCount计数。4.2 同步 API 入口与参数校验用户侧最常见的触发入口是rtStreamSynchronize/rtStreamSynchronizeWithTimeout头文件声明见 pkg_inc/runtime/runtime/stream.h实现见 src/runtime/api/api_c_stream.cc。其中rtStreamSynchronizeWithTimeout(stm, timeout)的timeout参数以毫秒为单位内部会先做参数校验再调用apiInstance-StreamSynchronize(exeStream, timeout)内部同步实现Stream::Synchronizesrc/runtime/core/src/stream/stream.cc将timeout传入上述轮询循环。在流同步返回RT_ERROR_STREAM_SYNC_TIMEOUT后src/runtime/api/impl/api_impl.cc 会额外做一次“快照取证”if (errCode RT_ERROR_STREAM_SYNC_TIMEOUT) { (void)GetStreamTimeoutSnapshotMsg(); uint16_t taskId ...; const char_t* taskTypeName UNKOWN; tsTaskType_t taskType TS_TASK_TYPE_RESERVED; curStm-GetCurrentRunningTaskInfo(taskId, taskType, taskTypeName); RT_LOG_OUTER_MSG(RT_STREAM_SYNC_TIMEOUT_INNER_ERROR, Stream synchronize timeout, the current task is task_type%s(%d), device_id%u, stream_id%d, task_id%u, taskTypeName, taskType, curStm-Device_()-Id_(), curStm-Id_(), taskId); }即发生超时后Runtime 会尝试抓取当前正在流上运行的任务类型task_type、任务号task_id、设备号与流号。这些信息是定位“到底是哪个算子/任务卡住导致超时”的第一手证据排查时应优先从该条日志入手。4.3 超时时间参数的配置途径EE1002 的“超时时间间隔设置不合理”与运行时的超时配置直接相关。Runtime 内部维护RtTimeoutConfig读写入口见 src/runtime/core/inc/runtime.hpp并通过SetTimeoutConfig(RT_TIMEOUT_TYPE_OP_WAIT / RT_TIMEOUT_TYPE_OP_EXECUTE, ...)下发到设备侧设备侧初始化逻辑见 src/runtime/core/src/device/raw_device.cc配置落地见 src/runtime/core/src/runtime.cc。与之对应的对外 API 包括rtSetOpWaitTimeOut(timeout)设置算子等待超时时间单位为秒src/runtime/api/impl/api_impl.ccrtSetOpExecuteTimeOut(timeout, timeUnit)设置算子执行超时时间可指定毫秒/微秒等时间单位src/runtime/api/impl/api_impl.cc。在“阻塞式等待 用户自定义超时”的场景下rtStreamSynchronizeWithTimeout(stm, timeout)的timeout毫秒则是影响是否触发 EE1002 的最直接参数。需要注意的是部分超时配置还受芯片特性开关约束例如RT_FEATURE_TASK_OP_EXE_TIMEOUT_CONFIG、RT_FEATURE_STREAM_DOT_SYNC_TIMEOUT_ABORT等特性按芯片型号在 src/runtime/config/ 目录下各dev_info_reg.cc中按 SoC 分别使能可参考 src/runtime/config/610_lite/dev_info_reg.cc因此在排查超时参数是否生效时也需要确认当前设备型号是否支持对应超时配置能力。五、可能原因原文档归纳的可能原因如下超时时间间隔设置不合理设置的同步超时阈值过小任务本身需要更长执行时间例如大模型推理、大数据搬运、耗时算子导致在正常执行但尚未完成时就被判定为超时网络异常在多机/跨节点场景下如集合通信、跨 Server 数据搬运网络抖动或中断会导致同步迟迟无法完成。此外结合 4.1 的源码分析可以补充两类常见诱因Device 侧任务异常或卡死流上算子/内核任务AICore、AIV、AICPU 任务执行异常、陷入死循环或等待资源如流内依赖、其他流的 Event而长时间不结束同步循环将一直等待直至超时流/上下文处于异常态流处于 abort 状态、上下文被置为异常CheckContextStatus返回非 NONE时同步会提前失败返回也可能在日志中表现为“同步未完成”。六、解决方法按原文档建议并结合源码取证路径推荐如下排查与处置流程检查超时时间设置是否合理若使用rtStreamSynchronizeWithTimeout确认timeout毫秒是否与任务实际执行时长匹配可适当放大后重试若涉及算子执行超时配置核对rtSetOpExecuteTimeOut/rtSetOpWaitTimeOut所设参数与时间单位秒/毫秒/微秒是否正确参考 src/runtime/api/impl/api_impl.cc 中毫秒上限会被截断为RT_MAX_OP_TIMEOUT_FOR_MS的行为确认当前设备型号的dev_info_reg.cc是否使能了相关超时特性见上文 4.3。检查网络是否正常检查节点间通信链路网卡、交换机、驱动状态与集合通信如 HCCL配置排除网络抖动导致的同步挂起跨机场景下可先降级为单机/单 Device 复现验证是否为网络相关。定位卡住的任务源码级取证从日志中Stream synchronize timeout, the current task is task_type... task_id...提取当前运行任务类型与任务号该日志由 src/runtime/api/impl/api_impl.cc 在超时瞬间输出结合report three minutes timeout事件日志src/runtime/core/src/stream/stream.cc判断同步已持续多久并确认是否触发了RT_EXCEPTION_TASK_TIMEOUT异常回调检查日志中的device_id、stream_id、sq_id、task_id、flip_num、pendingNum等字段定位具体流与任务。检查流/上下文状态确认流是否处于 abort 状态对应日志The stream is in abort state...若为 abort需等待 abort 流程完成后重新创建或复用流避免在异常流上继续同步确认 Device 侧是否发生上报错误导致上下文异常必要时结合 docs/zh/error_code_ref/ 下的对应错误码文档与 plog 日志进一步定位。获取超时快照GetStreamTimeoutSnapshotMsg()调用点见 src/runtime/api/impl/api_impl.cc会在超时后尝试抓取流内任务快照若日志中包含该快照内容可直接据此确认流的挂起位置。七、相关文档与测试佐证错误码官方注册表src/dfx/error_manager/error_code.json错误码日志模板宏src/runtime/core/inc/common/error_code_meta.h、内部错误码常量 src/runtime/core/inc/spec/base_info.hpp内部错误码RT_ERROR_STREAM_SYNC_TIMEOUTsrc/runtime/core/inc/common/internal_error_define.hpp流同步轮询实现src/runtime/core/src/stream/stream.cc同步 API 实现与超时取证src/runtime/api/api_c_stream.cc、src/runtime/api/impl/api_impl.cc错误码使用指引含 EE1002 使用示例docs/zh/guidelines/error_message_guide/error-code-guide.md、docs/zh/guidelines/error_message_guide/macro-selection-guide.md错误码单测验证 EE1002 参数名、打屏与上报tests/ut/runtime/runtime/test/rt_error_code_test.cc、tests/ut/runtime/runtime/test/rt_error_code_test.cc中英文错误码索引docs/en/error_code_ref/RTS-Errors/RTS-Errors.md、docs/zh/error_code_ref/RTS-Errors/RTS-Errors.md。八、小结EE1002 是 CANN Runtime 对外暴露的“流同步超时”专用错误码其背后对应一套完整的超时判定、周期汇报、任务快照取证与异常回调机制。收到该错误码时重点遵循“看%s原因描述 → 检查超时参数与网络 → 依据task_type/task_id定位卡住任务 → 核验流与上下文状态”的排查链路。结合本文给出的源码路径可以快速从日志中提取定位信息将超时问题收敛到具体任务或具体环节。赞分享CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载相关推荐CANN Runtime 错误码 EE1024 排查指南Stream 同步超时与 AI CPU 算子执行超时CANN Runtime 错误码 EE1024 排查指南Stream 同步超时与 AI CPU 算子执行超时 本指南面向使用 CANN Runtime 进行算CANNAscend人工智能任务调度CANN Runtime 错误码 EP0008 全解析Invalid Argument API Call Sequence 的成因、定位与处理CANN Runtime 错误码 EP0008 全解析Invalid Argument API Call Sequence 的成因、定位与处理 导读 EP00CANNAscend人工智能任务调度CANN Runtime 错误码 EE1007 深度解析模型与 Stream 绑定冲突Resource_Error_Bind_StreamCANN Runtime 错误码 EE1007 深度解析模型与 Stream 绑定冲突Resource_Error_Bind_Stream 导读 EE10CANNAscend人工智能任务调度创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考