安装llvm
# 下载源码
git clone https://github.com/llvm/llvm-project.git
# 新建编译目录
sudo mkdir -p llvm-project/build
# 进入编译目录
cd llvm-project/build
# cmake生成编译信息
cmake -G "Unix Makefiles" -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_TARGETS_TO_BUILD=X86 -DCMAKE_BUILD_TYPE="Release" -DLLVM_INCLUDE_TESTS=OFF -DCMAKE_INSTALL_PREFIX="/home/Project/llvm" ../llvm
# 编译
cmake --build .
# 安装到安装目录
cmake --build . --target install
其中,我使用的版本是
# commit eddecd3ade5ce1b827dafb84e8137cc6f89576fb (**HEAD ->** **main**, **origin/main**, **origin/HEAD**)
# Author: Florian Hahn <flo@fhahn.com>
# Date: Fri Feb 24 09:41:52 2023 +0100
注意:
- 安装llvm通过官方给的包似乎更方便,文件也比较小。但我用那种方式遇到一些问题,于是便采用了源码编译安装的方式。
- 新版本的llvm似乎已经不能使用
configure
那一套方式安装,这里在选择教程时需要注意。
安装TVM
git clone --recursive https://github.com/apache/tvm tvm
mkdir build
cp cmake/config.cmake build
cd build/
vi config.cmake
# set(USE_LLVM /home/project/llvm/bin/llvm-config)
cmake ..
make -j8
cd ../python
python3 setup.py install
setup.py install
的执行结果:
Using /usr/local/lib/python3.8/dist-packages
Finished processing dependencies for tvm==0.12.dev271+gaa927df6b
添加tvm环境变量到.bashrc
文件,执行source .bashrc
:
export TVM_HOME=/path/to/tvm
export PYTHONPATH=$TVM_HOME/python:${PYTHONPATH}
其中,我使用的版本是
commit aa927df6b3e33856998cb3a4938d8fb4cbdbcec9 (HEAD -> main, origin/main, origin/HEAD)
Author: Sergey <88086617+shtinsa@users.noreply.github.com>
Date: Thu Feb 16 11:12:27 2023 +0300
注意:
在tvm的make过程中,我遇到这么一个问题:
/home/Project/tvm/src/target/llvm/codegen_blob.cc:29:10: fatal error: llvm/ADT/Triple.h: No such file or directory
29 | #include <llvm/ADT/Triple.h>
| ^~~~~~~~~~~~~~~~~~~
compilation terminated.
make[2]: *** [CMakeFiles/tvm_objs.dir/build.make:8280: CMakeFiles/tvm_objs.dir/src/target/llvm/codegen_blob.cc.o] Error 1
make[2]: *** Waiting for unfinished jobs....
/home/Project/tvm/src/target/llvm/codegen_llvm.cc:30:10: fatal error: llvm/ADT/Triple.h: No such file or directory
30 | #include <llvm/ADT/Triple.h>
| ^~~~~~~~~~~~~~~~~~~
compilation terminated.
于是我找了一下
~/Project$ find . -name Triple.h
./llvm-project/llvm/include/llvm/TargetParser/Triple.h
./llvm/include/llvm/TargetParser/Triple.h
是有文件的,应该是代码里路径的问题。于是将路径改一下就可以了顺利编译了。
**diff --git a/src/target/llvm/codegen_blob.cc b/src/target/llvm/codegen_blob.cc**
**index b67aac480..1e9084c81 100644**
**--- a/src/target/llvm/codegen_blob.cc**
**+++ b/src/target/llvm/codegen_blob.cc**
@@ -26,7 +26,7 @@
#include <llvm/ADT/SmallVector.h>
#include <llvm/ADT/StringRef.h>
-#include <llvm/ADT/Triple.h>
+#include <llvm/TargetParser/Triple.h>
#include <llvm/ADT/Twine.h>
#include <llvm/IR/BasicBlock.h>
#include <llvm/IR/Constants.h>
**diff --git a/src/target/llvm/codegen_llvm.cc b/src/target/llvm/codegen_llvm.cc**
**index dcca33732..73f27205e 100644**
**--- a/src/target/llvm/codegen_llvm.cc**
**+++ b/src/target/llvm/codegen_llvm.cc**
@@ -27,7 +27,7 @@
#include <llvm/ADT/ArrayRef.h>
#include <llvm/ADT/SmallVector.h>
#include <llvm/ADT/StringRef.h>
-#include <llvm/ADT/Triple.h>
+#include <llvm/TargetParser/Triple.h>
#include <llvm/Analysis/TargetTransformInfo.h>
#if TVM_LLVM_VERSION >= 50
#include <llvm/BinaryFormat/Dwarf.h>
这个bug已提交,待进一步确认。
下一步计划
至此,环境已经搭建完成。下一步准备使用树莓派做一些交叉编译的事情,看看TVM对resnet18的的优化效果如何。
参考
本文参考了以下文档:
TVM 官网
Installing TVM
中文安装文档
参考oldpan博客
参考jiesonshan博客
参考ApsarasX博客