CANN Runtime 模型任务回退实战:基于 Model RI 的 Task 级参数切换与禁用
发布时间:2026/9/20 11:49:12来源:尧图网络
CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载本技术指南围绕开源仓库cann/runtime中的示例example/6_scenarios/fault_tolerant_exec/0_model_task_fallback展开讲解如何在 CANN Runtime 中通过模型运行实例Model RI的 Task 级 API 实现输入不适配时切换到备用路径、并禁用可选后处理任务的回退策略。读完本文你将掌握aclmdlRICaptureBegin/End捕获模型、aclmdlRIGetStreams/aclmdlRITaskGetType/aclmdlRITaskGetSeqId遍历与唯一定位 Task、以及aclmdlRITaskSetParams/aclmdlRITaskDisable/aclmdlRIUpdate提交回退更新的完整实战链路。场景背景什么情况下需要模型任务回退在实际推理链路中主计算任务的输入有时会因为数据质量、格式或语义不符而不适合继续走后续的可选后处理post-processing流程。传统做法是在 Host 侧修改输入后重新捕获、重新下发整个模型开销大且流程繁琐。0_model_task_fallback示例给出的方案更加轻量先按完整路径主计算任务 可选后处理任务正常捕获并执行一遍作为基线Baseline随后在不重新捕获模型的前提下直接定位模型内部的 Task把主任务的输入参数切换为备用输入并整体禁用可选后处理任务再次执行验证回退路径Fallback。最终输出证明主任务输出来自备用输入、后处理输出保持了预设的哨兵值-1从而验证了 Task 级动态调整的可行性。该示例位于 example/6_scenarios/fault_tolerant_exec/0_model_task_fallback适用于需要在运行期动态调整模型内部任务、实现故障容错或遇错降级的开发者。产品支持范围ProductSupportedAtlas A2 training series products/Atlas A2 inference series productsYesAtlas A3 training series products/Atlas A3 inference series productsYesAscend 950PR/Ascend 950DTYes说明以上支持矩阵来自示例自带 READMEREADME_en.md实际部署前请以当前安装的 CANN 版本配套产品文档为准。示例的编译与运行示例的编译、运行入口是 run.sh核心步骤与 README 保持一致将示例代码下载到已安装 CANN 的环境并切换到示例目录cd ${git_clone_path}/example/6_scenarios/fault_tolerant_exec/0_model_task_fallback设置环境变量${install_root}替换为 CANN 安装根目录source ${install_root}/set_env.sh source ${git_clone_path}/example/set_sample_env.sh其中 example/set_sample_env.sh 会依次完成调用 example/common/resolve_cann_env.sh 定位 CANN 安装路径编译并运行 example/tools/get_soc_version/get_soc_version.cpp 小工具通过aclrtGetSocName探测当前芯片的SOC_VERSION再自动探测ASCENDC_CMAKE_DIRascendc.cmake 所在目录并导出ASCEND_INSTALL_PATH、ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR四个变量。编译并执行bash run.shrun.sh内部会检查ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR是否已设置随后依次执行cmake -B build -DASCEND_CANN_PACKAGE_PATH${ASCEND_HOME_PATH}、cmake --build build -j、cmake --install build最后运行./build/main | tee output_msg.txt将运行日志同时输出到屏幕与output_msg.txt。构建层面由 CMakeLists.txt 负责通过ascendc_fatbin_library(model_task_fallback_kernel kernel/model_task_fallback_kernel.cpp)调用 ASCENDC 工具链把 kernel/model_task_fallback_kernel.cpp 编译为 fatbinadd_executable(main main.cpp model_task_fallback.cpp)将入口与主逻辑编译成 Host 侧可执行程序链接${ASCEND_CANN_PACKAGE_PATH}/lib64/libacl_rt.so编译选项为-O2 -stdc17 -D_GLIBCXX_USE_CXX11_ABI0 -Wall -Werror。示例输出正常执行时main程序会打印以下日志[INFO] Start to run 0_model_task_fallback sample. [INFO] Baseline path verified: main_first11, optional_first22. [INFO] Selected fallback tasks: main_seq0, optional_seq1. [INFO] Fallback path verified: main_first31, optional_first-1. [INFO] Run the 0_model_task_fallback sample successfully.四行关键日志的语义Baseline path verified: main_first11, optional_first22完整路径基线验证通过。主任务输出首元素 主输入 1 偏置 10 11后处理输出首元素 11 × 缩放 2 22Selected fallback tasks: main_seq0, optional_seq1成功唯一定位到两个 Kernel Task且主任务序号0先于可选任务序号1Fallback path verified: main_first31, optional_first-1回退路径验证通过。主任务输出首元素 备用输入 21 10 31后处理任务已被禁用输出保持预设哨兵值 -1最后打印整体成功信息进程返回 0。涉及的 CANN RUNTIME API 全景README 将示例涉及的接口按功能归类结合源码 model_task_fallback.cpp 可确认全部接口的真实调用点初始化与去初始化aclInit、aclrtSetDevice选择 Device 0、aclrtResetDeviceForce释放 Device 0 资源、aclFinalizeDevice 内存aclrtMalloc分配两个输入、两个输出共 4 块 Device 缓冲、aclrtMemcpy写入输入/输出哨兵值并读回结果、aclrtFreeStreamaclrtCreateStream创建用于捕获与执行模型的 Stream、aclrtSynchronizeStreamWithTimeout带超时地等待模型执行示例超时 5000 ms、aclrtDestroyStreamKernelaclrtBinaryLoadFromFile加载包含主/可选任务的 Kernel 二进制、aclrtBinaryGetFunction获取fallback_main与fallback_postprocess两个函数句柄、aclrtLaunchKernelWithHostArgs以紧凑 Host 参数下发两个被捕获任务、aclrtBinaryUnLoad模型捕获与执行aclmdlRICaptureBegin、aclmdlRICaptureEnd、aclmdlRIExecuteAsync、aclmdlRIDestroyTask 选择与回退更新aclmdlRIGetStreams、aclmdlRIGetTasksByStream、aclmdlRITaskGetType、aclmdlRITaskGetSeqId、aclmdlRITaskGetParams、aclmdlRITaskSetParams、aclmdlRITaskDisable、aclmdlRIUpdate。示例实现拆解从捕获到回退的完整流程示例主流程由 model_task_fallback.cpp 中的ModelFallbackWorkflow::Run()串起Initialize → AllocateAndPrepare → LoadKernels → CaptureModel → ExecuteVerifyPath(Baseline) → ResetOutputs → SelectTasks → ApplyFallback → ExecuteVerifyPath(Fallback)。下面按阶段剖析。1. 初始化、内存准备与 Kernel 加载Initialize()依次执行aclInit(nullptr)、aclrtSetDevice(0)、aclrtCreateStream(stream_)。AllocateAndPrepare()用aclrtMalloc(..., ACL_MEM_MALLOC_HUGE_FIRST)分配 4 块各 32 字节8 个 int32的 Device 缓冲并把两组输入搬到 Device 侧constexpr BufferData kPrimaryInput {1, 2, 3, 4, 5, 6, 7, 8}; // 主输入 constexpr BufferData kBackupInput {21, 22, 23, 24, 25, 26, 27, 28}; // 备用输入ResetOutputs()将两个输出缓冲填充为哨兵值 -1用于区分任务是否真实执行过。LoadKernels()使用realpath解析 Kernel fatbin 路径./out/fatbin/model_task_fallback_kernel/model_task_fallback_kernel.o后通过aclrtBinaryLoadFromFile加载二进制再用aclrtBinaryGetFunction分别取得fallback_main和fallback_postprocess句柄。Kernel 定义位于 kernel/model_task_fallback_kernel.cpp两个算子均为单核8 个元素逐元素计算fallback_main(input, output)output[i] input[i] 10偏置 kMainBiasfallback_postprocess(input, output)output[i] input[i] * 2缩放 kPostScale。其中在__NPU_ARCH__ 3510架构上还会通过dcci对输出做整行缓存刷写CACHELINE_OUT保证结果对 Host 可见属于平台相关的缓存一致性处理。2. 捕获模型把两次 Kernel 下发固化为 Task 序列CaptureModel()演示了 Model RI 的捕获语义initialMainArgs_ {primaryInput_, mainOutput_}; optionalArgs_ {mainOutput_, optionalOutput_}; aclmdlRICaptureBegin(stream_, ACL_MODEL_RI_CAPTURE_MODE_RELAXED); aclrtLaunchKernelWithHostArgs(mainFunction_, 1, stream_, nullptr, initialMainArgs_, sizeof(initialMainArgs_), nullptr, 0); aclrtLaunchKernelWithHostArgs(optionalFunction_, 1, stream_, nullptr, optionalArgs_, sizeof(optionalArgs_), nullptr, 0); aclmdlRICaptureEnd(stream_, model_);要点捕获模式使用ACL_MODEL_RI_CAPTURE_MODE_RELAXED枚举定义见 include/external/acl/acl_rt.h表示流式捕获约束较为宽松适合本示例的单 Stream 场景两次aclrtLaunchKernelWithHostArgs的参数使用KernelArgs{input, output}这一 8 字节紧凑结构isHostArgs语义上等价于 Host 侧参数aclmdlRICaptureEnd返回模型句柄model_此后两次 Kernel 下发被固化为模型内部的两个 Task序号 0、1。需要说明的是捕获期间主任务读取的是主输入缓冲primaryInput_而后处理任务读取的是主输出缓冲mainOutput_从而在数据流上形成主输入 → 主输出 → 后处理输出的链式依赖。3. 基线路径验证Execute()通过aclmdlRIExecuteAsync(model_, stream_)异步执行完整模型用aclrtSynchronizeStreamWithTimeout(stream_, 5000)等待执行完成再把两块输出aclrtMemcpy回 Host。VerifyPath(kPrimaryInput, main, optional, true)逐元素校验主输出 输入 10首元素 1 10 11后处理输出 主输出 × 2首元素 11 × 2 22。校验通过即打印Baseline path verified: main_first11, optional_first22.随后ResetOutputs()把输出缓冲重新填回 -1为回退路径执行做好准备。4. 定位并唯一识别主任务与可选任务这是示例最核心的部分。SelectTasks()先通过两段式调用获得模型 Stream 列表先查数量再取数据aclmdlRIGetStreams声明见 include/external/acl/acl_rt.h再对 Stream 上的 Task 做同样的两段式查询aclmdlRIGetTasksByStream。随后遍历每个 TaskaclmdlRITaskType type ACL_MODEL_RI_TASK_DEFAULT; aclmdlRITaskGetType(task, type); // 过滤出 Kernel 类型任务 if (type ! ACL_MODEL_RI_TASK_KERNEL) { continue; } aclmdlRITaskGetSeqId(task, sequence); // 取任务序号验证先后关系 aclmdlRITaskGetParams(task, params); // 取 Kernel 句柄、参数布局、块数等 if (params.kernelTaskParams.funcHandle mainFunction_) { selected.main task; selected.mainSequence sequence; selected.mainParams params; } else if (params.kernelTaskParams.funcHandle optionalFunction_) { selected.optional task; selected.optionalSequence sequence; }识别依据是类型 函数句柄 序号三重条件只有ACL_MODEL_RI_TASK_KERNEL类型才可能是计算任务通过aclmdlRITaskGetParams返回的kernelTaskParams.funcHandle与两个函数句柄比对即可唯一区分主/可选任务最后用mainSequence optionalSequence校验主任务确实排在可选任务之前。任一条件不满足Kernel 任务数不是 2、句柄未命中、序号乱序都会报错Cannot uniquely identify the ordered main and optional tasks.。Task 类型枚举aclmdlRITaskType定义于 include/external/acl/acl_rt.h除ACL_MODEL_RI_TASK_KERNEL外还包括 EVENT_RECORD / EVENT_WAIT / EVENT_RESET / VALUE_WRITE / VALUE_WAIT 等类型说明 Model RI 的 Task 抽象覆盖了事件与值同步等更丰富的图内原语。5. 应用回退切换主任务参数 禁用可选任务ApplyFallback()先对捕获时的 Kernel 下发参数做一致性校验类型为 KERNEL、句柄命中fallback_main、isHostArgs 0、argsSize sizeof(KernelArgs)、numBlocks 1确认参数布局与捕获时完全一致随后构造回退参数并提交fallbackMainArgs_ {backupInput_, mainOutput_}; // 主任务输入切换为备用输入 aclmdlRITaskParams updated selected.mainParams; updated.kernelTaskParams.args fallbackMainArgs_; // 指向新的 Host 参数 updated.kernelTaskParams.isHostArgs 1; // 标记为 Host 参数 aclmdlRITaskSetParams(selected.main, updated); // 更新主任务参数 aclmdlRITaskDisable(selected.optional); // 禁用可选后处理任务 aclmdlRIUpdate(model_); // 提交全部更新这里需要理解aclmdlRITaskParams的联合体布局该结构体include/external/acl/acl_rt.h公共部分包含type、taskGrp、opInfoPtr/opInfoSize等字段联合体内按任务类型区分kernelTaskParams、eventRecordTaskParams、valueWriteTaskParams等专用参数结构。对 Kernel 任务aclmdlRIKernelTaskParamsinclude/external/acl/acl_rt.h携带funcHandle、cfg、args、isHostArgs、argsSize、numBlocks。示例正是通过整体拷贝原 params 后仅改写args与isHostArgs的方式保证除输入指针外其余任务属性不变。三个关键接口的语义声明分别见 include/external/acl/acl_rt.h、include/external/acl/acl_rt.h、include/external/acl/acl_rt.haclmdlRITaskSetParams在下次aclmdlRIUpdate前缓存该 Task 的参数更新aclmdlRITaskDisable将 Task 标记为禁用执行时跳过aclmdlRIUpdate把此前所有 Task 参数修改与禁用状态一次性提交到模型后续aclmdlRIExecuteAsync按新状态执行。这种先修改、后提交的两阶段设计意味着可以在一次aclmdlRIUpdate中打包多个 Task 的调整减少 Host 与 Device 之间的交互次数。6. 回退路径验证再次aclmdlRIExecuteAsync执行更新后的模型VerifyPath(kBackupInput, main, optional, false)校验主输出 备用输入 10首元素 21 10 31证明主任务确实改读了备用输入后处理输出 哨兵值 -1证明可选任务被禁用后未再执行若仍执行则应为 31 × 2 62。校验通过后打印Fallback path verified: main_first31, optional_first-1.。7. 资源清理Cleanup()在任意阶段失败时都会按逆序释放资源若捕获未结束先补一次aclmdlRICaptureEnd随后aclmdlRIDestroy销毁模型、aclrtBinaryUnLoad卸载 Kernel 二进制、aclrtFree释放 4 块缓冲、aclrtDestroyStream销毁 Stream、aclrtResetDeviceForce复位 Device 0、最后aclFinalize。每个清理动作都会记录错误码避免异常路径下资源泄漏。从源码看 Model RI 的任务抽象设计结合 include/external/acl/acl_rt.h 中 Model RI 相关接口族可以推断模型运行实例Model RI把一次捕获得到的图Graph进一步细化为Stream → Task → TaskParams的三层可查询结构模型级提供aclmdlRIGetStreams、aclmdlRIExecuteAsync、aclmdlRIUpdateStream 级提供aclmdlRIGetTasksByStreamTask 级提供类型、序号、参数查询与参数设置、禁用接口。这套结构使得开发者无需关心模型内部算子调度的具体实现即可按图内任务的粒度做诊断与动态调整。示例正是这一设计的一个典型应用通过函数句柄唯一标识计算语义、序号唯一标识执行顺序在多个 Kernel 任务中稳定定位目标任务从而在不重建模型的前提下完成输入切换与任务禁用。这也意味着 Model RI 任务级 API 天然适用于故障容错如异常输入降级、运行时任务裁剪如关闭非关键后处理以省算力等场景。常见问题与注意事项路径与环境Kernel fatbin 路径./out/fatbin/...依赖run.sh在当前示例目录下执行cmake --install因此必须在示例目录内运行bash run.sh并确保ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR三个变量已正确设置否则脚本会报错退出任务识别唯一性若模型 Stream 上存在多个同类型 Kernel 任务仅靠类型无法区分必须结合funcHandle与aclmdlRITaskGetSeqId双重判定示例通过kernelCount ! 2与序号乱序检查兜底参数一致性aclmdlRITaskSetParams前应对argsSize、numBlocks、isHostArgs等做一致性校验避免新参数与任务原有调度信息不匹配更新生效时机aclmdlRITaskSetParams/aclmdlRITaskDisable需要配合aclmdlRIUpdate才会生效修改后务必提交更新再执行同步等待示例使用aclrtSynchronizeStreamWithTimeout超时 5000 ms而非无界等待回退场景下建议同样采用带超时的同步方式避免任务被禁用或参数异常时无限阻塞产品适配按 README该能力覆盖 Atlas A2/A3 训练与推理系列及 Ascend 950PR/950DT运行前请确认目标硬件型号。相关代码与文档索引示例 READMEREADME_en.md对应中文版 README.md示例主逻辑model_task_fallback.cpp示例入口main.cppKernel 实现kernel/model_task_fallback_kernel.cpp构建与运行CMakeLists.txt、run.shModel RI 任务参数结构体与接口声明include/external/acl/acl_rt.h环境探测脚本example/set_sample_env.sh、example/common/resolve_cann_env.sh、example/tools/get_soc_version/get_soc_version.cpp小结0_model_task_fallback示例完整演示了 CANN Runtime Model RI 的捕获—查询—定位—修改—提交全链路通过aclmdlRICaptureBegin/End把两次 Kernel 下发固化为可查询的 Task 序列通过aclmdlRIGetStreams、aclmdlRITaskGetType、aclmdlRITaskGetSeqId、aclmdlRITaskGetParams唯一定位目标任务再通过aclmdlRITaskSetParams、aclmdlRITaskDisable、aclmdlRIUpdate把切换主任务输入 禁用后处理任务一次性提交并验证执行结果。这一模式为故障容错、动态降级和运行时任务裁剪提供了不重建模型的轻量级实现思路也是理解 CANN Runtime 图内任务抽象Task 类型、TaskParams 联合体、Stream/Task 层级查询的最佳入门样例。赞分享CANNAscend人工智能任务调度【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址https://gitcode.com/cann/runtime点击查看免费下载相关推荐告别网盘限速烦恼这可能是最好用的网盘直链下载助手告别网盘限速烦恼这可能是最好用的网盘直链下载助手 你是否曾被网盘下载速度折磨得焦头烂额面对几十KB/s的龟速下载看着进度条缓慢爬行那种煎熬让人抓狂。更让CANNAscend人工智能任务调度CANN Runtime 容错执行指南基于 ACL-Graph 模型任务回退Model Task Fallback的降级处理实战CANN Runtime 容错执行指南基于 ACL Graph 模型任务回退Model Task Fallback的降级处理实战 导读 在推理或训练流水线CANNAscend人工智能任务调度CANN Runtime 模型运行时实例Model RI任务更新实战基于 aclmdlRICaptureTaskGrp 与 aclmdlRICaptureTaskUpdate 的算子级模型更新CANN Runtime 模型运行时实例Model RI任务更新实战基于 aclmdlRICaptureTaskGrp 与 aclmdlRICaptureCANNAscend人工智能任务调度上一篇Undecimus 项目推荐下一篇NVIDIA CUDA Samples 项目推荐创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网