TVM的安装编译

最近想想学习一下TVM,结果只是安装编译就花了一天多的时间。由于环境不同,官网的安装教程有很多坑需要自己趟,特此记录一下,希望能帮大家节省时间。

一. Ubuntu20.04安装配置

由于要用到RPC来进行auto-tuning,所以Ubuntu20.04的网络适配器需要选择桥接模式,VMware也需要编辑虚拟网络适配器,添加桥接模式。Win10的WSL2默认的是NAT模式,最新的WSL2可以支持桥接,但是需要升级系统比较麻烦,本文中采用Ubuntu20.04。

:安装VMware及Ubuntu20.04,建议虚拟盘内存设置大一些,我的环境中设置的是100G。

二. 安装编译工具

2.1 安装git/vim/gcc/g++/make

sudo apt-get install git vim gcc g++ make

2.2 安装cmake

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显示版本号则安装正确。

2.3 安装LLVM,本环境安装:clang+llvm-13.0.0

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的编译安装

下载tvm源码,建议不要从git拉,直接下载稳定的release版本,具体安装编译过程可参考官网,应该会有一些坑需要自己慢慢趟,我把我遇到的问题都加在了下面的注释里。

软件版本:CMake 3.18+,LLVM 4.0+,CUDA8.0+,Python3.7.X/3.8.X,不支持Python 3.9.X+

3.1 安装最小依赖项

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

3.2 创建build目录,拷贝cmake/config文件

mkdir build
cp cmake/config.cmake build

3.3 配置config.cmake文件

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

3.4 编译tvm(开启了openCL)

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安装编译方法,因为里面也会遇到比较多问题,这里不做介绍。

3.5 安装Python包(setup.py方法)

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

3.6 验证是否正确安装tvm

import tvm
print(tvm.__version__)

能成功导入tvm包打印版本号则安装成功!

四. 安装 Google Test用于C++代码测试

git clone https://github.com/google/googletest
cd googletest
mkdir build && cd build
cmake -DBUILD_SHARED_LIBS=ON ..
make -j4
sudo make install

五. RPC Tracker的安装配置

这部分内容可参考tvm官方的安装教程。

JDK1.11+,Gradle v7.6,Maven3

5.1. Gradle安装编译

5.1.1 安装JDK

sudo apt-get install openjdk-11-jdk  #jdk11以下的版本编译JNI的时候会报错
java -version  #openjdk version "11.0.17"

5.1.2 安装Gradle

官网介绍了两种安装方式,这里建议直接手动安装,环境中安装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则安装正确安装

5.2. TVM4J安装编译

5.2.1 安装moven3

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    #输出版本号则安装成功

5.2.2 编译tvm4j

cd /opt/tvm &&make jvmpkg
make jvminstall

5.3. 编译JNI工程,生成tvmrpc-release.apk

# 添加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)进行安装。

5.4. 生成android独立的编译工具链

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脚本编译安装。

5.5. 验证RPC Tracker是否正常连接

确保手机和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      
-------------------------------

六. TVM android端模型部署

6.1. Android部署float模型

跑示例模型时,relay.build报错"Failed to download tophub package for llvm",解决办法:

git clone https://github.com/tlc-pack/tophub.git
mv ./tophub/tophub ~/.tvm/tophub

你可能感兴趣的:(图像处理,性能优化,深度学习)