1.先下载TVM: git clone --recursive https://github.com/dmlc/tvm
2.安装LLVM:
如果需要模型在CPU上运行,则必须安装LLVM。对于Ubuntu,TVM已经提供了编译好的库,直接下载link.
也可源码编译(方法下面给出), 但是没必要。
3.配置:
① cd tvm ②mkdir build ③cp cmake/config.cmake build
④set(USE_LLVM /path/to/your/llvm/bin/llvm-config)
⑤set(USE_CUDA ON)....(需要GPU的话)
4.编译:
①cd build ②cmake .. ③make -j4
5.设置python路径:
export TVM_HOME=/path/to/tvm export PYTHONPATH=$TVM_HOME/python:$TVM_HOME/topi/python:$TVM_HOME/nnvm/python:${PYTHONPATH}
能 import tvm 说明安装成功
由于官方并没有给出llvm已经编译好的库,所以需要我们从头编译llvm,这里是6.0.0版本。编译完成后会占很大的内存,一定要确保空间足够。并且这里是源码编译(某些原因不能联网)。
1.下载llvm源码
wget http://llvm.org/releases/6.0.0/llvm-6.0.0.src.tar.xz tar xf llvm-6.0.0.src.tar.xz mv llvm-6.0.0.src llvm2.下载clang源码
cd llvm/tools wget http://llvm.org/releases/6.0.0/cfe-6.0.0.src.tar.xz tar xf cfe-6.0.0.src.tar.xz mv cfe-6.0.0.src clang cd ../..3. 下载clang-tools-extra源码
cd llvm/tools/clang/tools wget http://llvm.org/releases/6.0.0/clang-tools-extra-6.0.0.src.tar.xz tar xf clang-tools-extra-6.0.0.src.tar.xz mv clang-tools-extra-6.0.0.src extra cd ../../../..4. 下载compiler-rt源码
cd llvm/projects wget http://llvm.org/releases/6.0.0/compiler-rt-6.0.0.src.tar.xz tar xf compiler-rt-6.0.0.src.tar.xz mv compiler-rt-6.0.0.src compiler-rt cd ../..这样之后 clang,clang-tool-extra 和 compiler-rt 就可以和 llvm 一起编译了。
下载后,接下来就开始编译了。
①mkdir build ②cd build ③cmake path/to/llvm/source/root ④cmake --build .
这里到第4步就可以了,不需要继续往下编,因为我们只需要它生成的文件。
编译模型的时候:
1.target=’cuda':
找到出错的地方 把一个向量改成[1024,1024,1024]只要 乘积大于2048就行,但是不能太大。
2.target='llvm -target=aarch64-linux-gnu'
保存.so的时候不能用
libpath = "../tvm_output_lib/mobilenet.so" lib.export_library(libpath)因为这时候的编译器是linux下的gcc,目标确是arm板上的文件。
所以要用:
lib.export_library("xxxxx.so", ndk.create_shared)
对于生成直接在目标平台上运行的文件。
①:可以直接生成.o文件然后在arm上编译。
②:lib.export_library("depress_deploy.so", tvm.contrib.cc.create_shared, cc="/usr/bin/arm-linux-gnueabihf-g++")
在cc后面写上交叉编译器的g++路径。
实验记录:
检测模型(pytorch训练),利用TVM在GPU端对其进行了编译和测试,下面是测试结论:
测试集
测试项
效果
效率
Corr/%
Acc/%
大题正确率/%
前向推理次数
平均耗时/秒
验收-混合版面-200张图片
pytorch
99.52
97.87
71.21
200
0.0086
TVM
99.52
97.86
71.21
200
0.0004
结论:TVM在GPU上,优化等级为2,效果保持不变的同时,效率相比原始pytorch,提升很明显,从平均0.0086秒降低至平均0.0004秒。
目前有如下问题,暂时未得到解决:
Pse-Net在GPU下优化等级为2的效率与优化等级为3的时候差不多。
利用TVM在CPU端对其进行了编译和测试,下面是测试结论:
测试集
测试项
效果
效率
Corr/%
Acc/%
大题正确率/%
前向推理次数
平均耗时/秒
验收-混合版面-200张图片
pytorch
99.52
97.87
71.21
200
13.01
TVM
99.52
97.86
71.21
200
2.73
结论:TVM在CPU上,效果保持不变的同时,效率相比原始pytorch,提升很明显,从平均13秒降低至平均2.73秒
Android NDK 是一组使您能将 C 或 C++(“原生代码”)嵌入到 Android 应用中的工具。
1.在平台之间移植其应用。
2.重复使用现有库,或者提供其自己的库供重复使用。
3.在某些情况下提高性能,特别是像游戏这种计算密集型应用。
下载地址:
https://link.jianshu.com/?t=https://developer.android.com/ndk/downloads/index.html
将其解压到/opt 文件夹下,并修改环境变量:
export NDKROOT=/opt/ndk/android-ndk-r12bexport PATH=$NDKROOT:$PATH
保存更新环境变量:
source ~/.bashrc
你可以单独使用 Android NDK 附带的工具链,也可以将其作为插件与现有 IDE 结合使用。如果已拥有自己的编译系统,只需要能够调用交叉编译器以便为其增加对 Android 的支持。
在 ${NDKROOT}/build/tools 下有两个脚本:make_standalone_toolchain.py 和 make-standalone-toolchain.sh。
执行以下命令便可生成交叉编译工具:
./make_standalone_toolchain.py --arch=arm64 --api=24 --install-dir=/opt/ndk-tool
这里不要把install dir 放在tmp目录下,这样一旦机器重启便会失效。
--arch {arm,arm64,mips,mips64,x86,x86_64}
-api API Target the given API version (example: "--api 24").
1、adb shell (linux进入翻译机。)
2、cat /proc/cpuinfo (查看翻译机型号)
只列出关键步骤,其他步骤与linux环境下无异:
修改target:
arch = "arm64"
target = "llvm -target=%s-linux-android" % arch
修改lib的输出方式:
lib.export_library("mobile_yolov2.so", ndk.create_shared)
添加TVM_NDK_CC环境变量
export TVM_NDK_CC=/opt/ndk/bin/aarch64-linux-android-ld
下载:http://www.android-studio.org/
tar zxvf jdk-8u77-linux-x64.tar.gz -C /opt
bashrc里添加环境变量:
export JAVA_HOME=/opt/jdk1.8.0_77
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=.:${JAVA_HOME}/bin:$PATH
测试:
java –version
下载 http://dl.google.com/android/android-sdk_r24.4.1-linux.tgz
解压到/opt 目录下。
(在外网利用android studio 下载好所有SDK文件,再拷贝到内网。)
环境变量
export ANDROID_HOME=/opt/android-sdk-linuxexport PATH=$ANDROID_HOME/tools:$PATHexport PATH=$ANDROID_HOME/platform-tools:$PATH
下载:https://maven.apache.org/download.cgi
解压到 /opt
设置环境变量
export MAVEN_HOME=/opt/maven
export PATH=$MAVEN_HOME/bin:$PATH
下载:https://gradle.org/install/
mkdir /opt/gradle
unzip -d /opt/gradle gradle-5.5.1-bin.zip
环境变量
export PATH=$PATH:/opt/gradle/gradle-5.5.1/bin
以上环境配好后就可以编译java 的tvm 运行环境了(tvm4j)。
项目根目录下运行:
make jvmpkg
make jvminstall
这里需要先编译好x86 linux下的tvm运行环境 libtvm_runtime.so 。
利用TVM_NDK_CC=/opt/ndk/bin/aarch64-linux-android-ld
(Linux与android的交叉编译工具链) 将linux下的libtvm_runtime.so转成TVM4J。
注意:
在项目的根目录下运行 make jvmpkg的时候会一直等待下载文件(因为是在内网)。
解决办法:
先在外网把需要的东西下载好,再到内网搭建个仓库,把文件拷贝到仓库。
生成tvm4j后,修改配置文件:
cd apps/android_deploy/app/src/main/jni
cp make/config.mk .
vim config.mk
(根据自己的设备属性修改)
APP_ABI = arm64-v8a
APP_PLATFORM = android-17
# whether enable OpenCL during compile
USE_OPENCL = 0
现在使用Gradle编译JNI,解析Java依赖关系,并与tvm4j一起构建Android应用程序。运行以下脚本生成apk文件。
cd apps/android_deploy
gradle clean build
运行 gradle clean build 同样会遇到上述类似下载问题,解决方法与上类似。
这样就生成了能在安卓手机上直接运行的apk文件。
如果你想迅速使用tvm的安卓apk,点这里:https://pan.baidu.com/s/1rjld0QAvs5pqwMN9fbErCA;
还有tvm4j也一起分享了哟~。
参考:https://blog.csdn.net/u012675539/article/details/51489078
