tvm优化模型

it2022-05-05  118

Ubuntu:

          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 说明安装成功

 

Centos:

         由于官方并没有给出llvm已经编译好的库,所以需要我们从头编译llvm,这里是6.0.0版本。编译完成后会占很大的内存,一定要确保空间足够。并且这里是源码编译(某些原因不能联网)。

源码编译llvm,其他步骤与Ubuntu相似。

 

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 llvm

2.下载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

结论:TVMGPU上,优化等级为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

结论:TVMCPU上,效果保持不变的同时,效率相比原始pytorch,提升很明显,从平均13秒降低至平均2.73

 

                                    Linux 下编译安卓TVM app:

 

安装NDK

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

 

 

生成设备专用的toolchain

你可以单独使用 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            (查看翻译机型号)

 

 

利用toolchain生成安卓机下能运行的模型参数文件。

只列出关键步骤,其他步骤与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

 

 

linux 下安装Android Studio

安装jdk:

下载: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

安装SDK

下载  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

配置Maven

下载:https://maven.apache.org/download.cgi

解压到 /opt

 

设置环境变量

export MAVEN_HOME=/opt/maven

export PATH=$MAVEN_HOME/bin:$PATH

配置gradle

下载: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

 

编译TVM4J

以上环境配好后就可以编译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

 

 

 

 

 

 

 

 

 

 

 

 

 

         

      

 


最新回复(0)