庫名稱)
人工智能深度學習算子庫CANNAscend【免費下載鏈接】asc-devkit本項目是CANN 推出的昇騰AI處理器專用的算子程序開發(fā)語言原生支持C和C標準規(guī)范主要由類庫和語言擴展層構(gòu)成提供多層級API滿足多維場景算子開發(fā)訴求。項目地址https://gitcode.com/cann/asc-devkit點擊查看免費下載本文是 CANN asc-devkit 算子原型注冊與管理prototype register management系列中的一篇 API 實戰(zhàn)指南核心講解 OpAICPUDef 的KernelSo配置接口它用于指定 AI CPUAICPU算子實現(xiàn)文件編譯生成的動態(tài)庫.so文件名稱是自定義 AICPU 算子原型定義中把核函數(shù)實現(xiàn)產(chǎn)物與算子注冊信息關(guān)聯(lián)起來的關(guān)鍵一環(huán)。讀完本文你將掌握KernelSo的簽名、參數(shù)語義與鏈式調(diào)用方式并理解它和 AI CPU 算子編譯、OP_ADD原型注冊流程之間的完整關(guān)系。KernelSo 是什么一句話定位在 asc-devkit 的算子原型注冊體系中算子原型通過一個繼承自OpDef的 C 類承載詳見算子原型定義而 AI CPU 算子的實現(xiàn)信息由OpAICPUDef描述。OpDef::AICPU() 返回OpAICPUDef引用開發(fā)者在該引用上鏈式調(diào)用Engine、OpkernelLib、KernelSo、FunctionName等接口完成 AICPU 算子配置。KernelSo的職責非常單一明確配置 AICPU 算子實現(xiàn)文件編譯生成的動態(tài)庫文件的名稱。也就是說開發(fā)者編寫的 AICPU 算子核函數(shù)實現(xiàn).aicpu文件或-x aicpu方式編譯的.cpp文件最終會被編譯成動態(tài)庫.soKernelSo(...)中的字符串值即用于向框架聲明這個動態(tài)庫的名字供算子調(diào)度與加載時定位使用。它屬于部署前注冊信息與OpkernelLib固定為CUSTAICPUKernel、FunctionName固定為RunCpuKernel等配置共同構(gòu)成 AICPU 自定義算子被框架識別、編譯和執(zhí)行所需的完整描述。函數(shù)原型與參數(shù)語義KernelSo的函數(shù)原型如下OpAICPUDef KernelSo(const char *value)參數(shù)說明參數(shù)輸入/輸出說明value輸入AI CPU 算子實現(xiàn)文件編譯生成的動態(tài)庫文件的名稱其中value是const char *類型的字符串應當與編譯 AICPU 算子實現(xiàn)文件后產(chǎn)出的動態(tài)庫文件名保持一致。例如使用bisheng -shared -x aicpu編譯出的libxxx.so其庫名通常即對應此處的value。建議在原型定義中顯式、準確填寫避免算子注冊信息與實際產(chǎn)物名稱不一致導致運行時無法定位實現(xiàn)庫。返回值說明返回類型為OpAICPUDef 即返回算子定義對象自身的引用支持繼續(xù)鏈式調(diào)用其他配置接口例如this-AICPU() .Engine(DNN_VM_AICPU) .OpkernelLib(CUSTAICPUKernel) .KernelSo(libxxx.so) .FunctionName(RunCpuKernel);關(guān)于OpAICPUDef的完整說明請參考 OpAICPUDef。約束說明無。KernelSo沒有額外使用約束但需注意其語義強依賴編譯產(chǎn)物命名實際開發(fā)中應保證配置值與構(gòu)建產(chǎn)物一致。使用場景AICPU 算子原型注冊流程KernelSo出現(xiàn)在 AICPU 自定義算子原型定義階段。整體流程如下編寫 AICPU 算子實現(xiàn)以.aicpu為后綴或.cpp-x aicpu編譯選項定義__global__ __aicpu__修飾的核函數(shù)例如倉庫示例 aicpu_tiling.aicpu 中的MyAicpuKernel。AI CPU 編程規(guī)范詳見 AI CPU編程。編譯生成動態(tài)庫使用bisheng或 CMake 將實現(xiàn)文件編譯為.so。在 Host 側(cè)原型文件中通過繼承OpDef的算子類構(gòu)造函數(shù)調(diào)用this-AICPU()獲取OpAICPUDef鏈式配置Engine、OpkernelLib、KernelSo、FunctionName等。在文件末尾通過OP_ADD(opType)注冊算子類型見 OP_ADD編譯工具據(jù)此識別算子原型并生成 aclnn 接口、圖模式原型等相關(guān)代碼。一個典型的 AICPU 原型定義骨架如下namespace ops { class AddCustom : public OpDef { public: explicit AddCustom(const char* name) : OpDef(name) { // 輸入輸出、屬性定義Input/Output/Attr this-Input(x) .ParamType(REQUIRED) .DataType({ge::DT_FLOAT16}) .Format({ge::FORMAT_ND}); this-Output(z) .ParamType(REQUIRED) .DataType({ge::DT_FLOAT16}) .Format({ge::FORMAT_ND}); // AICPU 實現(xiàn)信息引擎、kernelLib、動態(tài)庫名稱、核函數(shù)接口名 this-AICPU() .Engine(DNN_VM_AICPU) .OpkernelLib(CUSTAICPUKernel) .KernelSo(libadd_custom_aicpu.so) .FunctionName(RunCpuKernel); } }; OP_ADD(AddCustom); } // namespace ops與 KernelSo 配套的 OpAICPUDef 配置項速查KernelSo是OpAICPUDef提供的眾多鏈式配置接口之一。為了正確填寫原型定義下表匯總了同系列接口的固定取值要求均可在原型注冊與管理目錄下找到對應 API 文檔接口功能取值要求Engine配置算子調(diào)用的引擎固定為DNN_VM_AICPUOpkernelLib配置算子調(diào)用的 kernelLib固定為CUSTAICPUKernelKernelSo配置實現(xiàn)文件編譯生成的動態(tài)庫名稱與編譯產(chǎn)物.so名稱一致FunctionName配置核函數(shù)Kernel接口名稱固定為RunCpuKernelUserDefined配置是否為用戶自定義算子僅支持True缺省默認為TrueComputeCost預留參數(shù)固定為100FlagPartial預留參數(shù)固定為FalseFlagAsync預留參數(shù)固定為FalseExtendCfgInfo額外添加鍵值對形式的擴展配置keyvalue自定義從這張表可以推斷KernelSo是整個 AICPU 注冊信息中唯一需要開發(fā)者根據(jù)自己工程實際填寫產(chǎn)物名稱的字段其余多數(shù)字段都是框架約定的固定值因此它也是最容易因拼寫或命名不一致而引發(fā)問題的配置項。深度原理KernelSo 對應的動態(tài)庫從何而來KernelSo的取值不是憑空約定而是與 AI CPU 算子的編譯產(chǎn)物一一對應。倉庫中的 AI CPU算子編譯 文檔說明了動態(tài)庫的生成方式與 AI Core 算子只需一個.asc文件即可編譯不同AI CPU 算子需要同時包含.aicpu文件核函數(shù)定義和.asc文件通過內(nèi)核調(diào)用符調(diào)用核函數(shù)才能編譯生成可執(zhí)行文件。當需要把 AI CPU 算子實現(xiàn)打包為動態(tài)庫時使用 bisheng 命令行# 編譯 test_aicpu.cpp 生成算子動態(tài)庫 # -lxxx 表示默認鏈接庫 bisheng -shared -x aicpu test_aicpu.cpp -o libtest_aicpu.so -lxxx ...其中-shared/--shared編譯生成動態(tài)鏈接庫-x aicpu指定編譯語言為 AICPU表明編譯的是 AI CPU 算子編程語言代碼-o libtest_aicpu.so指定輸出動態(tài)庫文件名該名稱正是KernelSo(...)中應填寫的值。若單獨編譯 AI CPU 算子代碼生成動態(tài)庫、靜態(tài)庫需要手動鏈接內(nèi)置鏈接庫如ascendc_runtime、ascendcl、runtime等。使用 CMake 時同樣可以將.aicpu文件直接打入動態(tài)庫例如# 將 .cpp 文件置為 AICPU 屬性支持 AI CPU 算子編譯 set_source_files_properties( aicpu_kernel.cpp PROPERTIES LANGUAGE AICPU ) add_library(kernel_lib SHARED add_custom_base.cpp aicpu_kernel.cpp # 支持 AI CPU 算子與 AI Core 算子一起打包為動態(tài)庫 )從上述編譯鏈路可以推斷KernelSo本質(zhì)上是在算子原型注冊信息中登記運行時按名加載的庫文件標識——框架拿到算子注冊信息后需要根據(jù)這個名稱在部署目錄中找到對應的.so再結(jié)合FunctionNameRunCpuKernel定位庫內(nèi)核函數(shù)入口。因此動態(tài)庫名稱的拼寫、大小寫與編譯輸出必須嚴格一致這是KernelSo配置正確的核心要求。實際工程中的注意事項結(jié)合倉庫文檔與示例使用KernelSo時有幾點值得留意產(chǎn)物命名一致性KernelSo的值應與bisheng -shared -x aicpu ... -o name或 CMakeadd_library(... SHARED)產(chǎn)出的庫文件名一致。若使用默認庫前綴lib請確認注冊時填寫的字符串與最終文件名匹配。與固定字段協(xié)同AICPU 自定義算子的Engine固定為DNN_VM_AICPU、OpkernelLib固定為CUSTAICPUKernel、FunctionName固定為RunCpuKernel不要擅自改動這些約定值見各字段文檔的取值要求。原型注冊位置KernelSo的調(diào)用位于 Host 側(cè)算子原型文件如op_host/add_custom.cpp中自定義算子類的構(gòu)造函數(shù)內(nèi)通過this-AICPU()進入OpAICPUDef配置鏈最終由文件末尾的OP_ADD(AddCustom)完成注冊詳見算子原型定義??蓞⒖紓}庫樣例04_aicpu 樣例 展示了 AICPU 算子含 Tiling 下沉從核函數(shù)實現(xiàn)到工程組織的完整形態(tài)其中 aicpu_tiling.aicpu 演示了__global__ __aicpu__核函數(shù)的標準寫法可作為編寫實現(xiàn)文件、進而配置KernelSo的參照。總結(jié)OpAICPUDef::KernelSo是 asc-devkit 自定義 AICPU 算子原型注冊中的一個小而關(guān)鍵的配置接口它用一個字符串把算子原型和算子實現(xiàn)編譯產(chǎn)出的動態(tài)庫綁定起來。掌握它的簽名OpAICPUDef KernelSo(const char *value)、取值語義與.so編譯產(chǎn)物名稱一致以及在OpAICPUDef鏈式配置中的位置再結(jié)合Engine、OpkernelLib、FunctionName等固定字段和OP_ADD注冊流程即可完整、正確地完成一個 AICPU 自定義算子的原型定義與注冊。贊分享人工智能深度學習算子庫CANNAscend【免費下載鏈接】asc-devkit本項目是CANN 推出的昇騰AI處理器專用的算子程序開發(fā)語言原生支持C和C標準規(guī)范主要由類庫和語言擴展層構(gòu)成提供多層級API滿足多維場景算子開發(fā)訴求。項目地址https://gitcode.com/cann/asc-devkit點擊查看免費下載相關(guān)推薦asc-devkit 算子原型注冊OpAICPUDef::Engine 接口詳解與 AICPU 算子引擎配置實戰(zhàn)asc devkit 算子原型注冊OpAICPUDef::Engine 接口詳解與 AICPU 算子引擎配置實戰(zhàn) 本篇技術(shù)指南圍繞 asc devkitCA人工智能深度學習算子庫CANNAscendasc-devkit 算子原型注冊系列OpAICPUDef::ExtendCfgInfo 擴展配置接口詳解asc devkit 算子原型注冊系列OpAICPUDef::ExtendCfgInfo 擴展配置接口詳解 導讀 ExtendCfgInfo 是 asc de人工智能深度學習算子庫CANNAscendasc-devkit 算子原型注冊詳解OpAICPUDef::FlagAsync 預留參數(shù)的語義與正確用法asc devkit 算子原型注冊詳解OpAICPUDef::FlagAsync 預留參數(shù)的語義與正確用法 導讀 FlagAsync 是 CANN asc d人工智能深度學習算子庫CANNAscend上一篇LiteLLM Grafana 監(jiān)控看板實戰(zhàn)導入 gen_ai 與 litellm_* 指標 JSON讀懂每一塊 Panel 的 PromQL下一篇TypeScript 與 React Native Game Engine完整的類型安全游戲開發(fā)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考