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