Build TVM From Source and Codegen
Contents
最近做研究需要要看 TVM 的 CMSIS-NN backend 產生的 code,發現網路上這部份的討論不是很多。
紀錄一下 build TVM 以及 codegen 的過程。
Build TVM
考慮到可能之後會改 TVM,所以選擇 build from source,主要按照官方文件的流程走。
由於我習慣把各個不同的軟體建置環境隔開,避免產生依賴套件的版本衝突,所以我選擇在 conda environment 裡 build。
1, 下載 TVM repo
|
|
- 建立 conda environment
|
|
- 編輯 cmake configuration
|
|
這部份需要特別留意,為了讓編譯出來的 TVM 能夠支援 CMSIS-NN,需要在 config.cmake
修改以下相關設定。
|
|
其他設定可以依據需求更動。
- Build
|
|
完成後會在 build
目錄下看到 libtvm_runtime.so
和 libtvm.so
這兩個檔案。
- Install TVM package
官方有提供兩種作法:
- Method 1
如果會常常改動 TVM code 或設定需要重新 build 的話,可以設定 PYTHONPATH
直接告訴 python library 的位置。
|
|
- Method 2
建立 python binding,這個作法 TVM 會被裝在當前的環境下,所以如果是在虛擬環境下裝,離開虛擬環境後就不能使用了。
|
|
到此 TVM 就安裝完成了。
Compile
裝好 TVM 後就能使用 tvmc
來 compile model 了。
設定 target 是 cmsis-nn,c
,TVM 會盡可能去把 op map 到 CMSIS-NN
library 實作 ,不能的才會用 c code。
這裡指定 target cpu 是 cortex-m7
。
|
|
Compile 完會產生一個 TAR package module.tar
,把它解開後會得到該 model 透過 TVM 產生出來的 library,其格式為 Model Library Format,詳細的 layout 介紹可以參考文件。
|
|
Codegen content
要看 model codegen 的內容,主要看 codegen
目錄。
|
|
tvmgen_default.h
裡定義了 model 的 input/output tensor pointer 和宣告 model 的 entry point。
|
|
default_lib0.c
裡放的是 model 的權重等 constant,以及定義 entry point function。
|
|
default_lib1.c
裡定義了 tvmgen_default___tvm_main__
function,是 model inference 的主要流程。
|
|
default_lib2.c
裡定義了每個 operator 的實作會 bind 到哪個 CNSIS-NN 的 operator 實作上。
|
|
Reference
TVM - Install from Source
TVM - Running TVM on bare metal Arm(R) Cortex(R)-M55 CPU and Ethos(TM)-U55 NPU with CMSIS-NN
TVM - Model Library Format
Running TVM on bare metal Arm(R) Cortex(R)-M55 CPU and CMSIS-NN