自己的NPU算子?ops-transformer標(biāo)準(zhǔn)算子開發(fā)6步全流程詳解)
如何開發(fā)自己的NPU算子ops-transformer標(biāo)準(zhǔn)算子開發(fā)6步全流程詳解【免費(fèi)下載鏈接】ops-transformer本項(xiàng)目是CANN提供的transformer類大模型算子庫(kù)實(shí)現(xiàn)網(wǎng)絡(luò)在NPU上加速計(jì)算。項(xiàng)目地址: https://gitcode.com/cann/ops-transformerops-transformer是 CANN 提供的 transformer 類大模型算子庫(kù)覆蓋 Attention、MoE、MC2 等場(chǎng)景幫助大模型在 NPU 上加速計(jì)算。本文將帶你基于 ops-transformer 完整走一遍NPU算子開發(fā)的 6 步標(biāo)準(zhǔn)流程從環(huán)境準(zhǔn)備、項(xiàng)目結(jié)構(gòu)理解到編譯打包、Kernel 開發(fā)再到調(diào)試與性能驗(yàn)證全程以官方示例算子 AddExample 為實(shí)踐對(duì)象零基礎(chǔ)也能跟著跑通。第1步環(huán)境準(zhǔn)備與源碼下載 ?NPU算子開發(fā)的前提是搭好一套可用的編譯環(huán)境推薦兩條路線CANNLab 云開發(fā)環(huán)境默認(rèn)已提供最新版 CANN 包及配套源碼開箱即用本地 Docker 部署參考 docs/zh/install/quick_install.md 完成 NPU 驅(qū)動(dòng)與 CANN 包安裝。環(huán)境就緒后下載與你 CANN 版本配套標(biāo)簽的源碼版本不匹配是新手最常見的編譯失敗原因git clone -b 9.0.0 https://gitcode.com/cann/ops-transformer.git 說明${tag_version}替換為分支標(biāo)簽名。項(xiàng)目版本配套關(guān)系見 README 中的版本配套章節(jié)。第2步看懂標(biāo)準(zhǔn)算子項(xiàng)目的 5 大目錄 這是 NPU算子開發(fā) 中最容易迷路的一步。每個(gè)算子工程以 examples/add_example/ 為例都遵循統(tǒng)一的分層結(jié)構(gòu)目錄職責(zé)類比理解op_kernel/AI Core 側(cè) Kernel 實(shí)現(xiàn)Ascend C算子的計(jì)算大腦op_host/Host 側(cè)信息庫(kù)、Tiling、InferShape算子的調(diào)度中樞op_graph/圖模式構(gòu)圖、類型推導(dǎo)、融合規(guī)則算子的接入圖引擎的接口examples/aclnn / geir 調(diào)用示例算子的使用說明tests/UT 單元測(cè)試用例算子的質(zhì)檢報(bào)告幾個(gè)關(guān)鍵文件值得記住add_example_def.cpp定義算子名稱、輸入輸出、數(shù)據(jù)類型等基本信息add_example_tiling.cppTiling 實(shí)現(xiàn)把張量劃分成多個(gè)小塊并行計(jì)算add_example.hKernel 核心計(jì)算邏輯80% 的算子開發(fā)工作都發(fā)生在這里。完整目錄規(guī)范請(qǐng)參考 docs/zh/install/dir_structure.md。上圖為項(xiàng)目中一個(gè)真實(shí)算子的張量布局示意。開發(fā) NPU 算子前務(wù)必先弄清每個(gè)輸入/輸出張量的 shape 與內(nèi)存排布——這是寫出正確 Kernel 的第一步。第3步一鍵編譯算子包 回到項(xiàng)目根目錄通用編譯命令格式為bash build.sh --pkg --soc芯片版本 --ops算子名 -j16以 AddExample 為例bash build.sh --pkg --socascend910b --opsadd_example -j16SoC 取值映射表按你的芯片系列選擇產(chǎn)品系列--soc取值A(chǔ)tlas A2 系列訓(xùn)練/推理ascend910bAtlas A3 系列訓(xùn)練/推理ascend910_93950 系列ascend950看到如下輸出即編譯成功run 包會(huì)生成在build_out/目錄下Self-extractable archive cann-ops-transformer-custom_linux.${arch}.run successfully created.?? 編譯前先確認(rèn) CANN 環(huán)境變量已配置如source /usr/local/Ascend/cann/set_env.sh否則會(huì)因找不到ASCEND_HOME_PATH而失敗。第4步安裝算子包并配置環(huán)境變量 ??NPU算子開發(fā) 編譯出的 run 包需要安裝到 CANN 的 vendor 目錄運(yùn)行時(shí)才能被識(shí)別./build_out/cann-ops-transformer-*linux*.run export LD_LIBRARY_PATH${ASCEND_HOME_PATH}/opp/vendors/custom_transformer/op_api/lib:${LD_LIBRARY_PATH}安裝成功后算子會(huì)落在${ASCEND_HOME_PATH}/opp/vendors路徑下。可用grep load_priority ${ASCEND_HOME_PATH}/opp/vendors/config.ini校驗(yàn)是否加載——無輸出通常是目錄屬主或權(quán)限問題。第5步修改 Kernel開發(fā)你自己的 NPU 算子 前面四步跑通后你手里已經(jīng)有一個(gè)可運(yùn)行的骨架算子。現(xiàn)在把它改成你自己的邏輯。以 AddExample 為例打開 op_kernel/add_example.h在Compute函數(shù)中把加法替換為乘法__aicore__ inline void AddExampleT::Compute(int32_t progress) { AscendC::LocalTensorT xLocal inputQueueX.DeQueT(); AscendC::LocalTensorT yLocal inputQueueY.DeQueT(); AscendC::LocalTensorT zLocal outputQueueZ.AllocTensorT(); // 在此處將 Add 替換為 Mul AscendC::Mul(zLocal, xLocal, yLocal, tileLength_); outputQueueZ.EnQueT(zLocal); inputQueueX.FreeTensor(xLocal); inputQueueY.FreeTensor(yLocal); }Ascend C 開發(fā)的核心套路就是DeQue 取輸入 → 調(diào)用計(jì)算 API → EnQue 輸出完整規(guī)范與最小交付件說明見 docs/zh/develop/aicore_develop_guide.md。開發(fā)完執(zhí)行重編譯 → 重裝 → 重驗(yàn)證三連bash build.sh --pkg --socascend910b --opsadd_example -j16 ./build_out/cann-ops-transformer-*linux*.run bash build.sh --run_example add_example eager cust --vendor_namecustom輸出從加法結(jié)果2.000000變成乘法結(jié)果1.000000說明你的 Kernel 修改已生效 ?你的算子放哪里項(xiàng)目專門提供了 experimental/ 目錄存放用戶自定義算子按 attention、moe、mc2 等分類建目錄即可這是貢獻(xiàn)新算子的標(biāo)準(zhǔn)入口規(guī)范見 CONTRIBUTING.md。第6步算子調(diào)試、驗(yàn)證與性能采集 6.1 功能驗(yàn)證修改 examples/test_aclnn_add_example.cpp 中的輸入 shape 與數(shù)據(jù)例如從{32,4,4,4}改為{8,8,8,8}并同步調(diào)整 host 側(cè)數(shù)據(jù)長(zhǎng)度重新運(yùn)行 example 即可驗(yàn)證不同輸入下的正確性bash build.sh --run_example add_example eager cust --vendor_namecustom6.2 調(diào)試打印算子執(zhí)行失敗或精度異常時(shí)在 Kernel 中使用兩類調(diào)試接口printf打印 Scalar 類型數(shù)據(jù)如AscendC::PRINTF(blockLength is %ld\n, blockLength_);DumpTensor把指定 Tensor 內(nèi)容 Dump 到本地文件如DumpTensor(zLocal, 0, 128);無真機(jī)環(huán)境也可以先仿真調(diào)試開源算子支持 NPU Simulator 仿真工具詳見 docs/zh/debug/npu_sim.md。6.3 性能采集功能驗(yàn)證通過后用msprof op采集算子級(jí)性能bash build.sh --run_example add_example eager cust --vendor_namecustom cd build msprof op ./test_aclnn_add_example執(zhí)行后會(huì)打印 Op Name、Task Duration、Block Dim 等基礎(chǔ)信息并給出性能瓶頸提示完整數(shù)據(jù)保存在build/OPPROF_*目錄中可進(jìn)一步分析流水占比、帶寬利用率等指標(biāo)。常見問題速查 Q1編譯報(bào)找不到ASCEND_HOME_PATH怎么辦先sourceCANN 安裝目錄下的set_env.sh配置環(huán)境變量再重新編譯。Q2源碼用 master 分支編譯失敗請(qǐng)改用與 CANN 版本配套的標(biāo)簽分支如 9.0.0版本配套關(guān)系見 README。Q3只想學(xué)調(diào)用不想寫 Kernel從哪入手先看 docs/QUICKSTART.md 的編譯運(yùn)行部分跑通 AddExample再對(duì)照 docs/zh/invocation/quick_op_invocation.md 學(xué)習(xí)算子調(diào)用。Q4新算子應(yīng)該放在項(xiàng)目哪個(gè)目錄用戶自定義算子統(tǒng)一放在 experimental/ 目錄開發(fā)調(diào)試后按 CONTRIBUTING.md 流程貢獻(xiàn)。寫在最后恭喜你完成了 NPU算子開發(fā) 的完整閉環(huán) 回顧 6 步流程環(huán)境準(zhǔn)備CANNLab/Docker 配套標(biāo)簽源碼看懂結(jié)構(gòu)op_kernel / op_host / op_graph 分層職責(zé)編譯打包build.sh --pkg --soc --ops安裝配置run 包 LD_LIBRARY_PATH開發(fā) KernelAscend C 的 DeQue-計(jì)算-EnQue 套路調(diào)試驗(yàn)證example 驗(yàn)證 打印調(diào)試 msprof 性能采集想深入了解更多標(biāo)準(zhǔn)算子的實(shí)現(xiàn)細(xì)節(jié)Attention、GroupedMatmul、MoE 等可以按 docs/zh/op_list.md 瀏覽項(xiàng)目算子清單每個(gè)算子目錄內(nèi)都附有完整的 README 與 docs 文檔是現(xiàn)成的最佳實(shí)踐素材。【免費(fèi)下載鏈接】ops-transformer本項(xiàng)目是CANN提供的transformer類大模型算子庫(kù)實(shí)現(xiàn)網(wǎng)絡(luò)在NPU上加速計(jì)算。項(xiàng)目地址: https://gitcode.com/cann/ops-transformer創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考