:基于 Model RI 的 Task 級參數(shù)切換與禁用)
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 實現(xiàn)輸入不適配時切換到備用路徑、并禁用可選后處理任務的回退策略。讀完本文你將掌握aclmdlRICaptureBegin/End捕獲模型、aclmdlRIGetStreams/aclmdlRITaskGetType/aclmdlRITaskGetSeqId遍歷與唯一定位 Task、以及aclmdlRITaskSetParams/aclmdlRITaskDisable/aclmdlRIUpdate提交回退更新的完整實戰(zhàn)鏈路。場景背景什么情況下需要模型任務回退在實際推理鏈路中主計算任務的輸入有時會因為數(shù)據(jù)質量、格式或語義不符而不適合繼續(xù)走后續(xù)的可選后處理post-processing流程。傳統(tǒng)做法是在 Host 側修改輸入后重新捕獲、重新下發(fā)整個模型開銷大且流程繁瑣。0_model_task_fallback示例給出的方案更加輕量先按完整路徑主計算任務 可選后處理任務正常捕獲并執(zhí)行一遍作為基線Baseline隨后在不重新捕獲模型的前提下直接定位模型內部的 Task把主任務的輸入?yún)?shù)切換為備用輸入并整體禁用可選后處理任務再次執(zhí)行驗證回退路徑Fallback。最終輸出證明主任務輸出來自備用輸入、后處理輸出保持了預設的哨兵值-1從而驗證了 Task 級動態(tài)調整的可行性。該示例位于 example/6_scenarios/fault_tolerant_exec/0_model_task_fallback適用于需要在運行期動態(tài)調整模型內部任務、實現(xiàn)故障容錯或遇錯降級的開發(fā)者。產(chǎn)品支持范圍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 版本配套產(chǎn)品文檔為準。示例的編譯與運行示例的編譯、運行入口是 run.sh核心步驟與 README 保持一致將示例代碼下載到已安裝 CANN 的環(huán)境并切換到示例目錄cd ${git_clone_path}/example/6_scenarios/fault_tolerant_exec/0_model_task_fallback設置環(huán)境變量${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四個變量。編譯并執(zhí)行bash run.shrun.sh內部會檢查ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR是否已設置隨后依次執(zhí)行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 側可執(zhí)行程序鏈接${ASCEND_CANN_PACKAGE_PATH}/lib64/libacl_rt.so編譯選項為-O2 -stdc17 -D_GLIBCXX_USE_CXX11_ABI0 -Wall -Werror。示例輸出正常執(zhí)行時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創(chuàng)建用于捕獲與執(zhí)行模型的 Stream、aclrtSynchronizeStreamWithTimeout帶超時地等待模型執(zhí)行示例超時 5000 ms、aclrtDestroyStreamKernelaclrtBinaryLoadFromFile加載包含主/可選任務的 Kernel 二進制、aclrtBinaryGetFunction獲取fallback_main與fallback_postprocess兩個函數(shù)句柄、aclrtLaunchKernelWithHostArgs以緊湊 Host 參數(shù)下發(fā)兩個被捕獲任務、aclrtBinaryUnLoad模型捕獲與執(zhí)行aclmdlRICaptureBegin、aclmdlRICaptureEnd、aclmdlRIExecuteAsync、aclmdlRIDestroyTask 選擇與回退更新aclmdlRIGetStreams、aclmdlRIGetTasksByStream、aclmdlRITaskGetType、aclmdlRITaskGetSeqId、aclmdlRITaskGetParams、aclmdlRITaskSetParams、aclmdlRITaskDisable、aclmdlRIUpdate。示例實現(xiàn)拆解從捕獲到回退的完整流程示例主流程由 model_task_fallback.cpp 中的ModelFallbackWorkflow::Run()串起Initialize → AllocateAndPrepare → LoadKernels → CaptureModel → ExecuteVerifyPath(Baseline) → ResetOutputs → SelectTasks → ApplyFallback → ExecuteVerifyPath(Fallback)。下面按階段剖析。1. 初始化、內存準備與 Kernel 加載Initialize()依次執(zhí)行aclInit(nullptr)、aclrtSetDevice(0)、aclrtCreateStream(stream_)。AllocateAndPrepare()用aclrtMalloc(..., ACL_MEM_MALLOC_HUGE_FIRST)分配 4 塊各 32 字節(jié)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用于區(qū)分任務是否真實執(zhí)行過。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 下發(fā)固化為 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的參數(shù)使用KernelArgs{input, output}這一 8 字節(jié)緊湊結構isHostArgs語義上等價于 Host 側參數(shù)aclmdlRICaptureEnd返回模型句柄model_此后兩次 Kernel 下發(fā)被固化為模型內部的兩個 Task序號 0、1。需要說明的是捕獲期間主任務讀取的是主輸入緩沖primaryInput_而后處理任務讀取的是主輸出緩沖mainOutput_從而在數(shù)據(jù)流上形成主輸入 → 主輸出 → 后處理輸出的鏈式依賴。3. 基線路徑驗證Execute()通過aclmdlRIExecuteAsync(model_, stream_)異步執(zhí)行完整模型用aclrtSynchronizeStreamWithTimeout(stream_, 5000)等待執(zhí)行完成再把兩塊輸出aclrtMemcpy回 Host。VerifyPath(kPrimaryInput, main, optional, true)逐元素校驗主輸出 輸入 10首元素 1 10 11后處理輸出 主輸出 × 2首元素 11 × 2 22。校驗通過即打印Baseline path verified: main_first11, optional_first22.隨后ResetOutputs()把輸出緩沖重新填回 -1為回退路徑執(zhí)行做好準備。4. 定位并唯一識別主任務與可選任務這是示例最核心的部分。SelectTasks()先通過兩段式調用獲得模型 Stream 列表先查數(shù)量再取數(shù)據(jù)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 句柄、參數(shù)布局、塊數(shù)等 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; }識別依據(jù)是類型 函數(shù)句柄 序號三重條件只有ACL_MODEL_RI_TASK_KERNEL類型才可能是計算任務通過aclmdlRITaskGetParams返回的kernelTaskParams.funcHandle與兩個函數(shù)句柄比對即可唯一區(qū)分主/可選任務最后用mainSequence optionalSequence校驗主任務確實排在可選任務之前。任一條件不滿足Kernel 任務數(shù)不是 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. 應用回退切換主任務參數(shù) 禁用可選任務ApplyFallback()先對捕獲時的 Kernel 下發(fā)參數(shù)做一致性校驗類型為 KERNEL、句柄命中fallback_main、isHostArgs 0、argsSize sizeof(KernelArgs)、numBlocks 1確認參數(shù)布局與捕獲時完全一致隨后構造回退參數(shù)并提交fallbackMainArgs_ {backupInput_, mainOutput_}; // 主任務輸入切換為備用輸入 aclmdlRITaskParams updated selected.mainParams; updated.kernelTaskParams.args fallbackMainArgs_; // 指向新的 Host 參數(shù) updated.kernelTaskParams.isHostArgs 1; // 標記為 Host 參數(shù) aclmdlRITaskSetParams(selected.main, updated); // 更新主任務參數(shù) aclmdlRITaskDisable(selected.optional); // 禁用可選后處理任務 aclmdlRIUpdate(model_); // 提交全部更新這里需要理解aclmdlRITaskParams的聯(lián)合體布局該結構體include/external/acl/acl_rt.h公共部分包含type、taskGrp、opInfoPtr/opInfoSize等字段聯(lián)合體內按任務類型區(qū)分kernelTaskParams、eventRecordTaskParams、valueWriteTaskParams等專用參數(shù)結構。對 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 的參數(shù)更新aclmdlRITaskDisable將 Task 標記為禁用執(zhí)行時跳過aclmdlRIUpdate把此前所有 Task 參數(shù)修改與禁用狀態(tài)一次性提交到模型后續(xù)aclmdlRIExecuteAsync按新狀態(tài)執(zhí)行。這種先修改、后提交的兩階段設計意味著可以在一次aclmdlRIUpdate中打包多個 Task 的調整減少 Host 與 Device 之間的交互次數(shù)。6. 回退路徑驗證再次aclmdlRIExecuteAsync執(zhí)行更新后的模型VerifyPath(kBackupInput, main, optional, false)校驗主輸出 備用輸入 10首元素 21 10 31證明主任務確實改讀了備用輸入后處理輸出 哨兵值 -1證明可選任務被禁用后未再執(zhí)行若仍執(zhí)行則應為 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 級提供類型、序號、參數(shù)查詢與參數(shù)設置、禁用接口。這套結構使得開發(fā)者無需關心模型內部算子調度的具體實現(xiàn)即可按圖內任務的粒度做診斷與動態(tài)調整。示例正是這一設計的一個典型應用通過函數(shù)句柄唯一標識計算語義、序號唯一標識執(zhí)行順序在多個 Kernel 任務中穩(wěn)定定位目標任務從而在不重建模型的前提下完成輸入切換與任務禁用。這也意味著 Model RI 任務級 API 天然適用于故障容錯如異常輸入降級、運行時任務裁剪如關閉非關鍵后處理以省算力等場景。常見問題與注意事項路徑與環(huán)境Kernel fatbin 路徑./out/fatbin/...依賴run.sh在當前示例目錄下執(zhí)行cmake --install因此必須在示例目錄內運行bash run.sh并確保ASCEND_HOME_PATH、SOC_VERSION、ASCENDC_CMAKE_DIR三個變量已正確設置否則腳本會報錯退出任務識別唯一性若模型 Stream 上存在多個同類型 Kernel 任務僅靠類型無法區(qū)分必須結合funcHandle與aclmdlRITaskGetSeqId雙重判定示例通過kernelCount ! 2與序號亂序檢查兜底參數(shù)一致性aclmdlRITaskSetParams前應對argsSize、numBlocks、isHostArgs等做一致性校驗避免新參數(shù)與任務原有調度信息不匹配更新生效時機aclmdlRITaskSetParams/aclmdlRITaskDisable需要配合aclmdlRIUpdate才會生效修改后務必提交更新再執(zhí)行同步等待示例使用aclrtSynchronizeStreamWithTimeout超時 5000 ms而非無界等待回退場景下建議同樣采用帶超時的同步方式避免任務被禁用或參數(shù)異常時無限阻塞產(chǎn)品適配按 README該能力覆蓋 Atlas A2/A3 訓練與推理系列及 Ascend 950PR/950DT運行前請確認目標硬件型號。相關代碼與文檔索引示例 READMEREADME_en.md對應中文版 README.md示例主邏輯model_task_fallback.cpp示例入口main.cppKernel 實現(xiàn)kernel/model_task_fallback_kernel.cpp構建與運行CMakeLists.txt、run.shModel RI 任務參數(shù)結構體與接口聲明include/external/acl/acl_rt.h環(huán)境探測腳本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 下發(fā)固化為可查詢的 Task 序列通過aclmdlRIGetStreams、aclmdlRITaskGetType、aclmdlRITaskGetSeqId、aclmdlRITaskGetParams唯一定位目標任務再通過aclmdlRITaskSetParams、aclmdlRITaskDisable、aclmdlRIUpdate把切換主任務輸入 禁用后處理任務一次性提交并驗證執(zhí)行結果。這一模式為故障容錯、動態(tài)降級和運行時任務裁剪提供了不重建模型的輕量級實現(xiàn)思路也是理解 CANN Runtime 圖內任務抽象Task 類型、TaskParams 聯(lián)合體、Stream/Task 層級查詢的最佳入門樣例。贊分享CANNAscend人工智能任務調度【免費下載鏈接】runtime本項目提供CANN運行時組件和維測功能組件。項目地址https://gitcode.com/cann/runtime點擊查看免費下載相關推薦告別網(wǎng)盤限速煩惱這可能是最好用的網(wǎng)盤直鏈下載助手告別網(wǎng)盤限速煩惱這可能是最好用的網(wǎng)盤直鏈下載助手 你是否曾被網(wǎng)盤下載速度折磨得焦頭爛額面對幾十KB/s的龜速下載看著進度條緩慢爬行那種煎熬讓人抓狂。更讓CANNAscend人工智能任務調度CANN Runtime 容錯執(zhí)行指南基于 ACL-Graph 模型任務回退Model Task Fallback的降級處理實戰(zhàn)CANN Runtime 容錯執(zhí)行指南基于 ACL Graph 模型任務回退Model Task Fallback的降級處理實戰(zhàn) 導讀 在推理或訓練流水線CANNAscend人工智能任務調度CANN Runtime 模型運行時實例Model RI任務更新實戰(zhàn)基于 aclmdlRICaptureTaskGrp 與 aclmdlRICaptureTaskUpdate 的算子級模型更新CANN Runtime 模型運行時實例Model RI任務更新實戰(zhàn)基于 aclmdlRICaptureTaskGrp 與 aclmdlRICaptureCANNAscend人工智能任務調度上一篇Undecimus 項目推薦下一篇NVIDIA CUDA Samples 項目推薦創(chuàng)作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考