CMSIS-NN是什么?
官方的解釋是:
CMSIS NN software library is a collection of efficient neural network kernels developed to maximize the performance and minimize the memory footprint of neural networks on Arm Cortex-M processors.
翻譯一下就是:
CMSIS NN 軟件庫是一組高效的神經(jīng)網(wǎng)絡(luò)核(函數(shù)),旨在最大限度地提高 Arm Cortex-M 處理器上神經(jīng)網(wǎng)絡(luò)的性能并最大限度地減少內(nèi)存占用。
CMSIS-NN是一個計(jì)算庫,它向上提供了神經(jīng)網(wǎng)絡(luò)(NN)計(jì)算接口,實(shí)現(xiàn)了神經(jīng)網(wǎng)絡(luò)計(jì)算的硬件加速。它內(nèi)部實(shí)現(xiàn)了純CPU計(jì)算、DSP計(jì)算、MVE計(jì)算,屏蔽了底層硬件的具體細(xì)節(jié),降低了編程難度。
為什么移植CMSIS-NN v6.0.0版本?
1
CMSIS-NN核心特性
總結(jié)一下官方的介紹,可以知道CMSIS-NN庫的核心特性:
專為Cortex-M處理器開發(fā);
神經(jīng)網(wǎng)絡(luò)計(jì)算函數(shù);
最大化性能;
最小化內(nèi)存占用
2
CMSIS-NN的硬件和軟件支持
除此之外,CMSIS-NN庫還有幾點(diǎn)也是值得關(guān)注的:
支持DSP擴(kuò)展的處理器,使用SIMD優(yōu)化,例如Cortex-M4核;
支持ARM的Heilum技術(shù)的處理器,使用M核向量擴(kuò)展(MVE,M-profile Vector Extension)進(jìn)行優(yōu)化,例如 Cortex-M55 或 Cortex-M85;
MVE擴(kuò)展恰好是ARM Cortex-M85內(nèi)置的;
VisionBoard主控芯片瑞薩RA8D1的CPU核正是ARM Cortex-M85;
CMSIS-NN可以作為TensorFlow Lite for Microcontroller的后端實(shí)現(xiàn);
3
CMSIS-NN核心特性
CMSIS-NN v6.0.0版本的發(fā)布說明中,介紹了新特性:
全連接(FC)、卷積(CONV)和深度卷積(DWCONV)添加了MVE指令的int4類型支持;
重新實(shí)現(xiàn) LSTM 以與 TFLM 參考內(nèi)核保持一致;
LSTM 對 int16 輸入的支持
DSP/MVEI 支持轉(zhuǎn)置卷積
支持分組卷積
支持 FC 的非零濾波器偏移
對 MVEI 的 Int16 輸入卷積支持
對 int16x8 卷積的 Int32 偏置支持
更能多內(nèi)容可以查看本文末尾的CMSIS-NN v6.0.0 Release Note;
如何移植CMSIS-NN v6.0.0到VisionBoard?
1
創(chuàng)建RT-Thread項(xiàng)目
RT-Thread Studio創(chuàng)建基于VisionBoard開發(fā)板的模板項(xiàng)目,過程比較簡單,不再贅述。
2
添加CMSIS-NN源碼
RT-Thread Studio創(chuàng)建基于VisionBoard開發(fā)板的模板項(xiàng)目后,
在packages目錄手動下載CMSIS-NN v6.0.0版本:
3
修改RT-Thread代碼
修改項(xiàng)目頂層的Kconfig文件,添加如下代碼行:
注意:Kconfig修改需要完需要保證最后有一行空行,否則menuconfig命令會報(bào)奇怪的錯誤。
檢查packages目錄內(nèi)是否有SConsript文件,并且內(nèi)容如下:
如果沒有,可以手動創(chuàng)建。
4
修改CMSIS-NN代碼
CMSIS-NN目錄頂層創(chuàng)建SConscript文件,內(nèi)容如下:
創(chuàng)建Kconfig文件,內(nèi)容如下:
5
編譯RT-Thread項(xiàng)目
完成以上修改之后,已經(jīng)可以編譯CMSIS-NN庫的代碼了。
在命令行中執(zhí)行如下命令,編譯整個項(xiàng)目:
編譯輸出最后部分如下圖所示:
如何測試CMSIS-NN v6.0.0?
1
CMSIS-NN核心特性
CMSIS-NN庫內(nèi)部帶有了單元測試,具體位于 Tests/UnitTest 子目錄,其中 unittest_targets.py 腳本可以用于生成測試腳手架代碼,使用方法如下:
當(dāng)前生成的代碼是單獨(dú)生成elf文件,并在ARM虛擬硬件(AVH)平臺上運(yùn)行的。
默認(rèn)情況下,執(zhí)行python unittest_targets.py —download-and-generate-test-runners命令,會為每個測試用例生成一個main函數(shù),每個測試用例單獨(dú)編譯為一個elf文件,之后使用ARM虛擬硬件(AVH)執(zhí)行elf進(jìn)行測試。
為了能夠生成在RT-Thread上運(yùn)行的測試代碼,需要修改部分測試腳本代碼,實(shí)現(xiàn)將每個測試用例注冊為一個獨(dú)立的finsh命令,在串口命令行中交互測試。
具體修改的代碼差異如下:
這段修改實(shí)現(xiàn)了:
調(diào)用unity的ruby腳本,傳遞main_name命令行參數(shù),用于修改單元測試入口函數(shù)名稱(不指定默認(rèn)是main);
生成一個獨(dú)立的RT-Thread finsh命令注冊代碼.c文件;
生成一個用于編譯的SConscript代碼文件;
另外,再結(jié)合上層目錄的SConcsript包含所有子目錄的SConscript,就可以實(shí)現(xiàn)將所有單元測試編譯為finsh命令了。
修改完該腳本文件后,執(zhí)行如下命令,生成RT-Thread平臺測試代碼:
命令執(zhí)行輸出如下:
2
測試代碼的構(gòu)建規(guī)則SConscript
然后需要在CMSIS-NN的Tests子目錄內(nèi),添加SConscript文件:
這段SConscript的作用是,將子目錄的SConscript腳本包含到整個項(xiàng)目的構(gòu)建流程中去。
接著需要在CMSIS-NN的Tests/UnitTest子目錄內(nèi),添加SConscript文件:
完成以上修改后,通過menuconfig打開 PKG_USING_CMSIS_NN_TESTS 配置項(xiàng)目,再次 scons 編譯,就可以編譯單元測試代碼文件了。
3
解決鏈接失敗問題
但是還會有一些編譯錯誤,原因主要有:
原來的測試腳本為每個測試用例獨(dú)立生成main函數(shù),每個目錄單獨(dú)編譯;
鏈接到一起時,會有大量重復(fù)的setUp/tearDown/resetTest/verifyTest函數(shù)定義;
原來的測試數(shù)據(jù)數(shù)組沒有加static修飾,被重復(fù)include到多個.c文件;
鏈接到一起時,會有數(shù)組重復(fù)的數(shù)組定義;
為了解決上述兩類問題,分別創(chuàng)建兩個腳本。
修復(fù)重復(fù)函數(shù)定義的 fix_testCode.sh:
解決方法,所有 setUp/tearDown/resetTest/verifyTest 函數(shù)添加 weak 屬性修飾;
修復(fù)重復(fù)數(shù)組定義的 fix_testData.sh:
解決方法,所有測試數(shù)據(jù)的數(shù)組添加static修飾。
分別執(zhí)行上面兩個腳本之后,再次編譯,就沒有編譯錯誤了。
4
運(yùn)行單元測試
順利編譯之后,下載固件:
運(yùn)行后,在串口輸入help命令可以看到:
輸入命令,運(yùn)行avgpool算子的測試:
其他幾個算子的s8類型測試:
-
CMSIS
+關(guān)注
關(guān)注
0文章
39瀏覽量
11855 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4895瀏覽量
97055 -
RT-Thread
+關(guān)注
關(guān)注
31文章
1261瀏覽量
39836
發(fā)布評論請先 登錄
相關(guān)推薦
評論