爲什麼選擇TVM
爲提升深度學習模型的推理效率,設備平臺製造商針對自己的平臺推出優化的推理引擎,例如NAVIDA的tensorRT,Intel的OpenVINO,Tencent針對移動端應用推出NCNN等。目前,深度學習模型應用廣泛,在服務端和移動端都有應用,甚至於特殊的嵌入式場景想,它們都有加速模型推理的需求。
TVM介是從深度學習編譯器的角度來做推理引擎,目前技術領域還比較新,具體技術細節以後有機會會深入學習,這裏主要想體驗一下使用TVM做深度模型推理,重點是推理效率的提升,所以嘗試安裝下TVM測試下。
相關版本
```bash
gcc版本 6.4.0
cmake 3.16.4
llvm 我選擇的版本爲llvm-9.0.0
```
-
gcc 安裝
- 查看系統版本
cat /etc/redhat-release
- 查看默認的gcc版本
gcc --version
- 查看默認動態庫
strings /usr/lib64/libstdc++.so.6 | grep GLIBC GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBCXX_3.4.15 GLIBCXX_3.4.16 GLIBCXX_3.4.17 GLIBCXX_3.4.18 GLIBCXX_3.4.19 GLIBC_2.3 GLIBC_2.2.5 GLIBC_2.14 GLIBC_2.4 GLIBC_2.3.2 GLIBCXX_DEBUG_MESSAGE_LENGTH
- 下載gcc源碼
cd /usr/local/src/ wget http://ftp.gnu.org/gnu/gcc/gcc-6.4.0/gcc-6.4.0.tar.xz tar -xf gcc-6.4.0.tar.xz -C /usr/src cd /usr/src/gcc-6.4.0 # 自動下載mpfr-2.4.2.tar.bz2、gmp-4.3.2.tar.bz2、mpc-0.8.1.tar.gz和isl-0.15.tar.bz2軟件包 ./contrib/download_prerequisites ./configure -enable-checking=release -enable-languages=c,c++ -disable-multilib make -j4 make install
- 配置gcc
find / -name "libstdc++.so*" # /usr/src/gcc-6.4.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 cd /usr/lib64 cp /usr/src/gcc-6.4.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 libstdc++.so.6.0.22 mv libstdc++.so.6 libstdc++.so.6.old ln -sv libstdc++.so.6.0.22 libstdc++.so.6 ####### strings /usr/lib64/libstdc++.so.6 | grep GLIBC GLIBCXX_3.4 GLIBCXX_3.4.1 GLIBCXX_3.4.2 GLIBCXX_3.4.3 GLIBCXX_3.4.4 GLIBCXX_3.4.5 GLIBCXX_3.4.6 GLIBCXX_3.4.7 GLIBCXX_3.4.8 GLIBCXX_3.4.9 GLIBCXX_3.4.10 GLIBCXX_3.4.11 GLIBCXX_3.4.12 GLIBCXX_3.4.13 GLIBCXX_3.4.14 GLIBCXX_3.4.15 GLIBCXX_3.4.16 GLIBCXX_3.4.17 GLIBCXX_3.4.18 GLIBCXX_3.4.19 GLIBCXX_3.4.20 GLIBCXX_3.4.21 GLIBCXX_3.4.22 GLIBC_2.3 GLIBC_2.2.5 GLIBC_2.14 GLIBC_2.17 GLIBC_2.3.2 GLIBCXX_DEBUG_MESSAGE_LENGTH
- 查看系統版本
-
cmake 安裝
https://cmake.org/download/# 解壓Cmake壓縮包 tar -zxvf cmake-3.16.4.tar.gz # 進入Cmake文件夾 cd cmake-3.16.4 # 運行bootstrap ./bootstrap # 編譯gmake gmake # 進行安裝Cmake gmake install
Step1 llvm安裝
llvm源碼下載
llvm安裝教程
下載 Sources下除LLVM Test Suite外的所有源碼
- 一鍵下載
llvm 爲了防止污染源碼,不能在源碼目錄直接安裝,在 llvm 同級目錄下新建一個 build 目錄,進入再安裝# LLVM 源碼下載 wget https://releases.llvm.org/9.0.0/clang-tools-extra-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/compiler-rt-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/libunwind-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/libcxxabi-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/libcxx-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/openmp-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/lldb-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/polly-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/lld-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/cfe-9.0.0.src.tar.xz wget https://releases.llvm.org/9.0.0/llvm-9.0.0.src.tar.xz # 放在llvm/tools 目錄下的組件 tar Jxvf llvm-9.0.0.src.tar.xz mv llvm-9.0.0.src llvm tar Jxvf cfe-9.0.0.src.tar.xz mv cfe-9.0.0.src clang mv clang llvm/tools tar Jxvf lld-9.0.0.src.tar.xz mv lld-9.0.0.src lld mv lld llvm/tools tar Jxvf polly-9.0.0.src.tar.xz mv polly-9.0.0.src polly mv polly llvm/tools tar Jxvf lldb-9.0.0.src.tar.xz mv lldb-9.0.0.src lldb mv lldb llvm/tools # 放在 llvm/projects 目錄下的組件 tar Jxvf openmp-9.0.0.src.tar.xz mv openmp-9.0.0.src openmp mv openmp llvm/projects tar Jxvf libcxx-9.0.0.src.tar.xz mv libcxx-9.0.0.src libcxx mv libcxx llvm/projects tar Jxvf libcxxabi-9.0.0.src.tar.xz mv libcxxabi-9.0.0.src libcxxabi mv libcxxabi llvm/projects tar Jxvf libunwind-9.0.0.src.tar.xz mv libunwind-9.0.0.src libunwind mv libunwind llvm/projects tar Jxvf compiler-rt-9.0.0.src.tar.xz mv compiler-rt-9.0.0.src compiler-rt mv compiler-rt llvm/projects # clang 的子組件 tar Jxvf clang-tools-extra-9.0.0.src.tar.xz mv clang-tools-extra-9.0.0.src extra mv extra llvm/tools/clang/tools # 刪除下載的tar.xz rm -rf *.tar.xz
如果出現以下報錯:cmake -G "Unix Makefiles" \ -DLLVM_ENABLE_ASSERTIONS=On \ -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_C_COMPILER=/usr/local/bin/gcc \ -DCMAKE_CXX_COMPILER=/usr/local/bin/c++ \ -DLIBCXXABI_LIBC_INCLUDES= /path/llvm/projects/libcxxabi/include \ -DLIBCXX_LIBCXX_INCLUDES= /path/llvm/projects/libcxx/include \ ../llvm make -j4 make install
執行CMake Error at tools/lldb/scripts/cmake_install.cmake:41 (file): file INSTALL cannot find "/usr/local/src/llvm/llvm/build/./lib/python2.7": No such file or directory. Call Stack (most recent call first): tools/lldb/cmake_install.cmake:50 (include) tools/cmake_install.cmake:51 (include) cmake_install.cmake:68 (include)
如果出現以下報錯:cp -r lib64/python2.7 lib/python2.7
執行CMake Error at /usr/local/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message): Could NOT find SWIG (missing: SWIG_EXECUTABLE SWIG_DIR) Call Stack (most recent call first): /usr/local/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:393 (_FPHSA_FAILURE_MESSAGE) /usr/local/share/cmake-3.16/Modules/FindSWIG.cmake:64 (FIND_PACKAGE_HANDLE_STANDARD_ARGS) tools/lldb/scripts/CMakeLists.txt:16 (find_package)
如果報以下錯yum install swig
執行CMake Error at /usr/local/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:146 (message): Could NOT find LibEdit (missing: libedit_INCLUDE_DIRS libedit_LIBRARIES) Call Stack (most recent call first): /usr/local/share/cmake-3.16/Modules/FindPackageHandleStandardArgs.cmake:393 (_FPHSA_FAILURE_MESSAGE) tools/lldb/cmake/modules/FindLibEdit.cmake:54 (find_package_handle_standard_args) tools/lldb/cmake/modules/LLDBConfig.cmake:94 (find_package) tools/lldb/CMakeLists.txt:20 (include)
yum install libedit.i686 libedit-devel.i686
Step2 TVM安裝
git clone --recursive https://github.com/apache/incubator-tvm tvm
git submodule init
git submodule update
- 定製config.cmake
cd tvm $$ mkdir build
cp cmake/config.cmake build
cd build
編輯build/config.cmake文件,裏面有一些功能開關,這些配置有:
USE_CUDA,NVIDIA的GPU計算;
USE_ROCM,通用的GPU計算,AMD提出,目的很顯然...;
USE_SDACCEL,FPGA計算;
USE_AOCL,Intel FPGA SDK for OpenCL (AOCL) runtime;
USE_OPENCL,異構平臺編寫程序的框架,異構平臺可由CPU、GPU、DSP、FPGA或其他類型的處理器與硬件加速器所組成;
USE_METAL,iOS上的GPU計算;
USE_VULKAN,新一代的openGL,Android 7.x開始支持(iOS不支持,因爲有自己的metal2);
USE_OPENGL,2D/3D渲染庫標準,顯卡廠家負責實現和支持;
USE_SGX, Intel SGX ;
USE_RPC,遠程調用,電腦和手機可以通過網絡聯調;
USE_STACKVM_RUNTIME,embed stackvm into the runtime;
USE_GRAPH_RUNTIME,enable tiny embedded graph runtime;
USE_GRAPH_RUNTIME_DEBUG,enable additional graph debug functions;
USE_LLVM,llvm support;
USE_BLAS,API標準,規範發佈基礎線性代數操作的數值庫(如矢量或矩陣乘法),不同的實現有openblas, mkl, atlas, apple
USE_RANDOM,contrib.random運行時;
USE_NNPACK,
USE_CUDNN,
USE_CUBLAS,
USE_MIOPEN,
USE_MPS,
USE_ROCBLAS,
USE_SORT,使用contrib sort;
USE_ANTLR,
USE_VTA_TSIM,
USE_RELAY_DEBUG,Relay debug模式
cmake .. //如果需要gdb跟蹤源碼的話需要加-DCMAKE_BUILD_TYPE=Debug
make -j4
make install
error:
git submodule init
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = (unset),
LC_ALL = (unset),
LANG = "zh_CN.utf8"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
解決方法:
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
tvm系統配置
vim ~/.bashrc
export TVM_PATH=/yourpath/to/tvm # 你自己tvm
export PYTHONPATH=$TVM_PATH/python:$TVM_PATH/topi/python:$TVM_PATH/nnvm/python:${PYTHONPATH}
source ~/.bashrc
安裝TVM python bindings by setup.py
cd tvm
cd python
python3 setup.py install --user
cd ..
cd topi/python
python setup.py install --user
測試
python3
Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tvm
>>> print(tvm.__version__)
0.7.dev0
>>>
Reference
PyTorch模型轉TVM模型全流程記錄
安裝TVM
--------------------------------------------------------- END --------------------------------------------------------