CANN/runtime Model模块架构

发布时间:2026/7/11 13:24:20
CANN/runtime Model模块架构 Model 模块架构【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime1. 模块概述功能介绍Model 模块负责管理计算图的执行模型包括模型创建、Stream 绑定、任务加载、模型执行和销毁等全生命周期管理。支持普通模型Normal Model和捕获模型Capture Model两种类型通过 SQ/CQ 机制实现任务调度和执行。设计目标提供统一的模型管理接口支持多 Stream 绑定和调度实现 Task 的批量提交和执行支持 Label 分配和跳转控制提供模型执行同步/异步模式2. 使用场景与对外接口2.1 使用场景场景一创建并执行计算模型使用 ACL 接口aclmdlRI modelRI; aclmdlRIBuildBegin(modelRI, 0); // 开始构建模型 aclmdlRIBindStream(modelRI, stream, ACL_MODEL_STREAM_FLAG_HEAD); // 绑定 Stream // 添加任务到 stream aclmdlRIEndTask(modelRI, stream); // 标记任务结束 aclmdlRIBuildEnd(modelRI, nullptr); // 结束构建 aclmdlRIExecute(modelRI, -1); // 同步执行 aclmdlRIDestroy(modelRI); // 销毁模型场景二异步模型执行使用 ACL 接口aclmdlRIExecuteAsync(modelRI, execStream); // 通过 Stream 同步等待执行完成 aclrtSynchronizeStream(execStream);2.2 对外接口ACL 接口文件位置说明aclmdlRIBuildBegin()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp创建模型开始构建aclmdlRIDestroy()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp销毁模型aclmdlRIBindStream()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp绑定 Stream 到模型aclmdlRIUnbindStream()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp解绑 StreamaclmdlRIExecute()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp同步执行模型aclmdlRIExecuteAsync()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp异步执行模型aclmdlRIBuildEnd()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp完成模型构建LoadCompleteaclmdlRIEndTask()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp标记任务结束aclmdlRISetName()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp设置模型名称aclmdlRIAbort()include/external/acl/acl_rt.hsrc/acl/aclrt_impl/model_ri.cpp终止模型执行3. 架构总览3.1 整体设计思路Model 采用两层继承结构基类 Model 提供普通模型的完整功能。每个 Model 绑定多个 Stream通过 ModelExecuteTask 提交执行任务使用 Notify 实现执行完成通知。设计点说明Model 作为任务容器绑定多个 Stream统一管理 SQE 下发和执行Stream 作为任务队列每个 Stream 维护 SQ 任务序列支持任务回收Label 实现控制流Model 分配 Label IDStream 记录跳转点headStreams 机制标记入口 StreamExecute 时从这里激活执行执行流机制下发模型执行任务激活模型流执行3.2 架构分层图3.3 Model-Stream-Label 三层架构关系3.4 核心模块交互图含硬件交互本节通过时序图展示 AutoSplit与非 AutoSplit 两种场景的关键差异。3.4.1 Stream 绑定阶段差异说明 | 对比项 | AutoSplit 模式 | 非 AutoSplit 模式 | |--------|----------------|-------------------| | 绑定时机 | 仅 Runtime 侧软件绑定 | 立即提交硬件绑定任务 | | 硬件交互 | LoadComplete 时才建立硬件关系 | 绑定时立即写入 SQ | | 任务队列 | Host SQE buffer可扩展 | 固定硬件 SQ |3.4.2 任务提交阶段差异说明 | 对比项 | AutoSplit 模式 | 非 AutoSplit 模式 | |--------|----------------|-------------------| | SQE存储位置 | Host sqeBuffer_ | 设备 SQ | | 容量限制 | 无限制Slave Stream 扩展 | 固定深度 | | 提交时机 | LoadComplete 时批量下发 | 实时提交 | | Slave Stream | 任务接近32K时自动创建 | 不支持 |3.4.3 EndGraph 标记阶段3.4.4 LoadComplete 阶段差异说明 | 对比项 | AutoSplit 模式 | 非 AutoSplit 模式 | |--------|----------------|-------------------| | SQ/CQ 分配 | LoadComplete 时动态分配 | Stream 创建时已分配 | | Stream 切换 | SqSwitchStreamBatch 批量切换 | 不需要切换 | | 硬件绑定 | LoadComplete 时才建立硬件关系 | 绑定时已建立 | | Slave Stream | 需处理所有 Master Slave | 仅处理绑定的 Stream |3.4.5 模型执行阶段说明模型执行阶段AutoSplit 与非 AutoSplit 流程统一。差异在于 SQE 来源AutoSplitSQE 已在 LoadComplete 时从 Host Buffer 批量下发到设备 SQ非 AutoSplitSQE 在任务提交时已直接写入设备 SQ3.4.6 模型销毁阶段4. 详细设计4.1 核心流程模型创建与初始化流程流程说明用户通过 ACL 接口发起模型创建请求Runtime 创建 Model 对象分配唯一的 modelId初始化 Label 分配器支持后续的分支跳转控制创建 Notifier 对象用于模型执行完成后的通知机制申请设备侧内存用于存储模型元数据准备参数句柄记录表管理任务的参数内存Stream 绑定流程流程说明步骤AutoSplit 模式非 AutoSplit 模式1用户请求将 Stream 绑定到 Model用户请求将 Stream 绑定到 Model2检查 Stream 状态防止重复绑定检查 Stream 状态防止重复绑定3仅在 Runtime侧添加到 streams_列表添加到 streams_列表4判断是否为 head Stream判断是否为 head Stream5建立双向引用关系建立双向引用关系6不立即提交硬件任务创建维护任务通知硬件7等待 LoadComplete提交任务到设备硬件返回 CQE8绑定完成软件侧绑定完成可开始提交任务关键差异AutoSplit模式下Stream 绑定仅完成软件侧的记录硬件绑定延迟到 LoadComplete 阶段执行这样可以实现更灵活的任务队列管理。任务提交流程流程说明对比项AutoSplit 模式非 AutoSplit 模式容量检查检查 curStreamSqeCount 是否接近32K无容量限制检查Slave创建自动创建 Slave Stream 扩展容量不支持SQE存储写入 Host sqeBuffer_直接写入设备 SQ提交时机LoadComplete 时批量下发实时提交关键机制HOST_SQ_MAX_COUNT 32KHost SQE buffer 最大容量AutoSplitSqContext维护 curStreamSqeCount 和 slaveStreams 列表Slave Stream当任务数量接近32K时自动创建实现无限队列深度EndGraph 标记流程流程说明步骤AutoSplit 模式非 AutoSplit 模式1用户标记任务下发结束用户标记任务下发结束2创建 EndGraph 任务创建 EndGraph 任务3创建 Notify 对象申请 NotifyId创建 Notify 对象申请 NotifyId4SQE 写入 Host BufferEndGraph 任务写入 SQ5等待 LoadComplete 批量下发立即下发成功6硬件执行时触发 Notify Signal硬件执行时触发 Notify SignalModel LoadComplete 流程流程说明步骤AutoSplit 模式非 AutoSplit 模式1BuildSqCqForAutoSplit()直接遍历 StreamList_2为所有 Stream含 Slave分配 SQ/CQSQ/CQ 已在创建时分配3构建 modelSwitchInfo_不需要4SqSwitchStreamBatch 批量切换不需要5SendSqe 批量下发 SQE下发 SQE6EnterBindStream 建立硬件绑定已建立硬件绑定7SQ Tail配置 SQ Tail8SetIsTsBind(true)不需要9isModelComplete_trueisModelComplete_true关键差异AutoSplit 模式在 LoadComplete 时需要动态分配 SQ/CQ 资源批量切换 Stream 到 SQ建立硬件绑定关系EnterBindStream标记 Stream 已绑定到 TSSetIsTsBind模型执行流程流程说明步骤说明AutoSplit 与非 AutoSplit 差异1用户调用 Execute触发模型执行无差异2准备执行环境获取执行 Stream无差异3检查模型状态确保 LoadComplete 已完成无差异4创建 ExecuteTask设置执行参数无差异5提交 ExecuteTask 到设备写入 SQ无差异6硬件 TS 接收执行指令激活 headStreams_无差异7TS 从 SQ 读取 SQESQE来源差异8AICore/AIVector 执行计算任务无差异9执行到 EndGraph 任务触发 Notify Signal无差异10Host 端等待完成NtyWait无差异11收到完成信号后轮询 CQ 状态无差异12确认所有任务完成返回成功无差异SQE来源差异说明AutoSplit 模式SQE 已在 LoadComplete 阶段从 Host sqeBuffer_ 批量下发到设备 SQ任务提交时写入 Host Buffer延迟提交LoadComplete 时一次性批量下发所有 SQE支持无限队列深度Slave Stream 扩展非 AutoSplit 模式SQE 在任务提交时已直接写入设备 SQ任务提交时直接写入设备 SQ实时提交EndGraph 标记时立即下发固定队列深度执行阶段统一无论哪种模式执行时 SQE 已全部驻留在设备 SQ硬件 TS 直接从 SQ 读取并执行流程完全一致。Label 控制流设置流程流程说明用户创建 Label向 Model 申请唯一的 LabelIdModel 通过 LabelAllocator 分配 ID记录映射关系Label 绑定到 Model 和 Stream用户调用 Label::Set在 Stream 上设置跳转目标点记录当前位置到设备侧地址devDstAddr_生成 SetLabel SQE写入 Stream 缓存跳转点设置完成等待后续跳转Label 控制流跳转流程流程说明用户调用 LabelSwitch接口发起跳转指令获取目标 Label 的设备侧地址devDstAddr_生成 LabelSwitch SQE包含目标跳转地址写入当前 Stream 的 SQ硬件 TS 执行到 Switch操作 跳转到目标位置模型销毁流程流程说明用户调用 Destroy触发模型销毁释放 Notify 资源删除 endGraphNotify_释放设备内存清理参数句柄记录释放 DMA 地址记录解绑所有 Label解除与 Model 的关系释放 LabelAllocator 资源创建销毁任务通知硬件销毁模型硬件确认销毁返回 CQE清理 Model 对象从 Context 移除模型销毁完成释放所有资源4.2 核心机制详解Model 容器管理机制设计思想Model 作为计算图的容器统一管理所有绑定的 Stream 和 Label实现任务批量下发和执行入口控制。机制说明Stream 绑定管理维护所有 Stream 列表headStreams_ 作为执行起点Label 控制流管理分配 Label ID管理跳转关系参数内存管理记录任务参数句柄避免重复分配执行控制Notify 机制实现异步等待状态标记确保执行顺序Stream 任务队列机制设计思想Stream 作为任务队列缓存 SQE支持任务回收和自动 SQ 切分。机制说明任务缓存delayRecycleTaskid_ 记录任务 ID等待批量下发SQE 缓冲sqeBuffer_ 存储任务描述符准备写入硬件 SQ位置映射posToTaskIdMap_ 记录 SQE 位置与任务的对应关系自动切分超过 32K 任务时自动创建 Slave Stream 扩展容量Label 控制流跳转机制设计思想Label 实现跨 Stream 跳转和循环控制通过设备侧地址实现硬件级跳转。机制说明Label 分配Model 通过 LabelAllocator 分配唯一 IDLabel 设置在目标 Stream 上记录跳转位置设置设备侧地址Label 跳转读取设备地址生成跳转 SQE硬件执行跳转控制流实现支持循环同 Stream和跨 Stream 任务切换Notify 完成通知机制设计思想Notify 实现硬件完成通知Host 通过等待 Notify 获取执行结果。机制说明Notify 创建EndGraph 任务申请 NotifyId绑定到 ModelNotify 等待Host 通过 NtyWait 轮询 Notify ValueNotify 触发硬件执行到 EndGraphSignal Notify更新 Value完成确认Host 检测到 Value 匹配确认执行完成4.3 模块职责划分Model 模块按照功能划分为核心容器、任务管理、接口层、辅助工具等子模块各模块职责清晰协同完成模型全生命周期管理。核心容器模块模块名称核心职责代码位置主要功能Model 核心类计算图容器统一管理 Stream/Label/Notifysrc/runtime/core/inc/model/model.hppsrc/runtime/feature/model/model.cc• 绑定/解绑 Stream• 分配/释放 Label• 执行同步/异步模型• 批量下发 SQE• 管理 argLoaderRecordModel C 接口对外 C 风格 API 封装src/runtime/api/api_c_model.cc• rtModelCreate• rtModelDestroy• rtModelBindStream• rtModelExecute• rtEndGraph• rtModelLoadComplete任务管理模块任务类型任务职责代码位置触发时机ModelExecuteTask触发模型执行激活 headStreamssrc/runtime/core/src/task/task_info/model/model_execute_task.ccsrc/runtime/core/src/task/task_info/model/model_execute_task_v100.ccsrc/runtime/core/src/task/task_info/model/model_execute_task_v200_base.ccExecute/ExecuteAsync 调用时ModelMaintainceTask维护 Stream 与 Model 关系src/runtime/core/src/task/task_info/model/model_maintaince_task.ccsrc/runtime/core/src/task/task_info/model/model_maintaince_task_v100.ccsrc/runtime/core/src/task/task_info/model/model_maintaince_task_v200_base.ccBindStream/UnbindStreamLoadComplete 时ModelGraphTaskEndGraph 标记创建 Notifysrc/runtime/core/src/task/task_info/model/model_graph_task.ccsrc/runtime/core/src/task/task_info/model/model_graph_task_v100.ccsrc/runtime/core/src/task/task_info/model/model_graph_task_v200_base.ccrtEndGraph 调用时辅助工具模块工具模块辅助职责代码位置服务对象LabelAllocatorLabel ID 分配器src/runtime/core/inc/launch/label.hppModel Label 管理Notify硬件完成通知对象src/runtime/core/inc/notify/notify.hppsrc/runtime/core/src/notify/notify.ccEndGraph Notify接口适配层适配层适配职责代码位置服务对象ACL 接口封装ACL → RT 接口映射src/acl/aclrt_impl/model_ri.cpp用户调用 aclmdlRI 接口API 装饰器API 错误处理装饰src/runtime/core/src/api_impl/api_decorator.ccApiImpl 调用链5 关键文件路径索引模块类别文件路径核心内容Model 头文件src/runtime/core/inc/model/model.hppModel 类定义、数据结构Model 实现src/runtime/feature/model/model.ccModel 核心实现Model C 接口src/runtime/feature/model/model_c.ccC 风格接口实现Model Execute Tasksrc/runtime/core/src/task/task_info/model/model_execute_task.cc执行任务实现Model Execute Task V100src/runtime/core/src/task/task_info/model/model_execute_task_v100.ccV100 版本适配Model Execute Task V200src/runtime/core/src/task/task_info/model/model_execute_task_v200_base.ccV200 版本适配Model Maintaince Tasksrc/runtime/core/src/task/task_info/model/model_maintaince_task.cc维护任务实现ACL 接口头文件include/external/acl/acl_rt.hACL 外部接口定义ACL 接口实现src/acl/aclrt_impl/model_ri.cppACL 接口实现aclmdlRI 系列【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考