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