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