最近想想学习一下TVM,结果只是安装编译就花了一天多的时间。由于环境不同,官网的安装教程有很多坑需要自己趟,特此记录一下,希望能帮大家节省时间。
由于要用到RPC来进行auto-tuning,所以Ubuntu20.04的网络适配器需要选择桥接模式,VMware也需要编辑虚拟网络适配器,添加桥接模式。Win10的WSL2默认的是NAT模式,最新的WSL2可以支持桥接,但是需要升级系统比较麻烦,本文中采用Ubuntu20.04。
注:安装VMware及Ubuntu20.04,建议虚拟盘内存设置大一些,我的环境中设置的是100G。
sudo apt-get install git vim gcc g++ make
cmake最好由源码安装,apt-get安装的版本比较老,本环境安装:cmake-3.25.1.tar.gz
sudo apt-get install libssl-dev #不安装编译会报错: Could not find OpenSSL
./bootstrap
make -j4
sudo make install
运行cmake --version显示版本号则安装正确。
xz -d clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04.tar.xz
tar -xvf clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04.tar
mv clang+llvm-13.0.0-x86_64-linux-gnu-ubuntu-20.04 clang+llvm-13.0.0
添加llvm环境变量,后source ~/.bashrc
echo 'export LLVM_HOME=/opt/clang+llvm-13.0.0/bin' >> ~/.bashrc
echo 'export PATH=$LLVM_HOME:$PATH' >> ~/.bashrc
下载tvm源码,建议不要从git拉,直接下载稳定的release版本,具体安装编译过程可参考官网,应该会有一些坑需要自己慢慢趟,我把我遇到的问题都加在了下面的注释里。
软件版本:CMake 3.18+,LLVM 4.0+,CUDA8.0+,Python3.7.X/3.8.X,不支持Python 3.9.X+
sudo apt-get update
sudo apt-get install -y python3 python3-dev python3-setuptools gcc libtinfo-dev zlib1g-dev build-essential cmake libedit-dev libxml2-dev
mkdir build
cp cmake/config.cmake build
set(USE_OPENCL ON) #也可以开启其他后端,包括:CUDA,OpenCL, RCOM, METAL, VULKAN, …
set(USE_GRAPH_EXECUTOR ON)
set(USE_PROFILER ON #这两项主要是开启调试功能
set(USE_RELAY_DEBUG ON) #调试IRs
set(HIDE_PRIVATE_SYMBOLS ON)
set(USE_LLVM "/llvm_path/bin/llvm-config --link-static") #设置llvm(pytorch),避免版本冲突
最后还需要设置环境变量TVM_LOG_DEBUG
echo 'export TVM_LOG_DEBUG="ir/transform.cc=1,relay/ir/transform.cc=1"' >> ~/.bashrc
sudo apt install ocl-icd-opencl-dev #不安装会报错:missing: OpenCL_LIBRARY OpenCL_INCLUDE_DIR
sudo apt-get install lld #不安装会报错:collect2: fatal error: cannot find ‘ld’
sudo apt-get install libboost-all-dev
cd build && cmake ..
make -j4 && cd ..
查看./build/目录是否包含libtvm.so/ibtvm_runtime.so文件,有则表示安装成功。除了此方法外,官网中还推荐了conda安装编译方法,因为里面也会遇到比较多问题,这里不做介绍。
pip3 install --user numpy decorator attrs -i https://pypi.tuna.tsinghua.edu.cn/simple #相关依赖
pip3 install --user tornado -i https://pypi.tuna.tsinghua.edu.cn/simple #RPC Tracker
pip3 install --user tornado psutil 'xgboost<1.6.0' cloudpickle -i https://pypi.tuna.tsinghua.edu.cn/simple #使用auto-tuning
cd python && python3 setup.py install --user
import tvm
print(tvm.__version__)
能成功导入tvm包打印版本号则安装成功!
git clone https://github.com/google/googletest
cd googletest
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make -j4
sudo make install
这部分内容可参考tvm官方的安装教程。
JDK1.11+,Gradle v7.6,Maven3
sudo apt-get install openjdk-11-jdk #jdk11以下的版本编译JNI的时候会报错
java -version #openjdk version "11.0.17"
官网介绍了两种安装方式,这里建议直接手动安装,环境中安装Gradle v7.6。
wget https://services.gradle.org/distributions/gradle-7.6-bin.zip
mkdir /opt/gradle #opt安装文件夹的绝对路径,pwd可查看
unzip -d /opt/gradle gradle-7.6-bin.zip
#------------- 添加到环境变量 ------------#
echo 'export PATH=$PATH:/opt/gradle/gradle-7.6/bin' >> ~/.bashrc
source ~/.bashrc
gradle -v #正常显示版本号Gradle 7.6则安装正确安装
wget https://dlcdn.apache.org/maven/maven-3/3.8.7/binaries/apache-maven-3.8.7-bin.tar.gz
tar -zxvf apache-maven-3.8.7-bin.tar.gz
#------------- 添加到环境变量 ------------#
echo 'export PATH=$PATH:/home/whao/tools/apache-maven-3.8.7/bin' >> ~/.bashrc
echo 'export MAVEN_OPTS="-Xms256m -Xmx512m"' >> ~/.bashrc
source ~/.bashrc
mvn --version #输出版本号则安装成功
cd /opt/tvm &&make jvmpkg
make jvminstall
# 添加androidsdk和androidndk进环境变量
echo 'export ANDROID_HOME=/opt/Android/sdk' >> ~/.bashrc
echo 'export PATH=$PATH:$ANDROID_HOME' >> ~/.bashrc
echo 'export NDK_HOME=/opt/Android/ndk/25.1.8937393/' >> ~/.bashrc
echo 'export PATH=$PATH:$NDK_HOME' >> ~/.bashrc
source ~/.bashrc
# 使用Gradle编译JNI工程
cd apps/android_rpc && gradle clean build
直接运行会报错:"Could not resolve com.android.tools.build:gradle:7.1.2.",解决办法:替换默认源:
// 目录:/opt/tvm/apps/android_rpc/build.gradle
maven {
//url 'https://maven.google.com'
url 'https://maven.aliyun.com/repository/google'
}
如果编译成功,会在app/build/outputs/apk目录中看到app-release-unsigned.apk文件,运行:
sh dev_tools/sign_apk.sh # 具体注册信息可以随便填写
sh dev_tools/sign_apk.sh
得到带签名的apk:app/build/outputs/apk/release/tvmrpc-release.apk,可以用abd工具安装到手机:
sudo apt-get install zipalign
zipalign -p -f -v 4 tvmrpc-release.apk tvmrpc-release1.apk #对齐so库,不加apk安装会报错:Failed to extract native libraries
$ANDROID_HOME/platform-tools/adb install app/build/outputs/apk/release/tvmrpc-release1.apk
如果虚拟机无法安装,可以拷贝到win10中,连接手机,使用platform-tools(win10)进行安装。
cd /opt/Android/Sdk/ndk/25.1.8937393/build/tools
python3 make_standalone_toolchain.py --arch=arm64 --install-dir=/home/whao/tools/android-toolchain-arm64
注:NDK25已经删掉了make-standalone-toolchain.sh,建议通过python脚本编译安装。
确保手机和PC在同一个局域网下,查看ubuntu20.04的ip,注意网络适配器要选择桥接模式
ip addr show # 2: ens33后面即为ubuntu ip地址
ubuntu命令窗口输入:
python3 -m tvm.exec.rpc_tracker --host=0.0.0.0 --port=9190
# 输出应该为:2023-01-12 17:00:40.130 INFO bind to 0.0.0.0:9190
手机端打开TVM RPC,配置ubuntu的ip地址/port,Key输入android,enable RPC。ubuntu上重新打开一个命令窗口,验证是否连接成功:
python3 -m tvm.exec.query_rpc_tracker --host=0.0.0.0 --port=9190
如果连接失败,可以ping一下手机和电脑的ip地址,看是否可以ping通,一般都是ip设置错误或者虚拟机适配器设置错误造成的。正常应该会显示如下连接状态:
Queue Status
-------------------------------
key total free pending
-------------------------------
android 1 1 0
-------------------------------
跑示例模型时,relay.build报错"Failed to download tophub package for llvm",解决办法:
git clone https://github.com/tlc-pack/tophub.git
mv ./tophub/tophub ~/.tvm/tophub