Tensorflow-benchmark_model部署至android平台,测试模型性能

TF-benchmark_model部署至android平台,测试模型性能

Host: 用来编译的pc平台,本文环境为 Ubuntu 16.04
Target: 用来跑分的android平台(主要指指令集架构),本文环境为armeabi-v7a

本文只编译一个android版benchmark_model工具


1. 在Host上,部署Tensorflow与Bazel

(a) 在本地创建Tensorflow的仓库
unaguo@unaguo:~/backends/$ git clone https://github.com/tensorflow/tensorflow
...
unaguo@unaguo:~/backends/$ git checkout r1.8
...
unaguo@unaguo:~/backends/$ ./configure

注意:configure是tensorflow根目录下的一个全局配置文件,
除了Jetmalloc其余都用No

(b) 在本地创建Bazel的仓库

先下载jdk8

unaguo@unaguo:~/backends/$ sudo apt-get install openjdk-8-jdk

安装Bazel,这段是抄师兄的,并不是我当时配置的过程,后面会检查一下。

unaguo@unaguo:~/backends/$ echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
unaguo@unaguo:~/backends/$ curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
unaguo@unaguo:~/backends/$ sudo apt-get update && sudo apt-get install bazel
©不需要用Bazel编译整个Tensorflow

2. 在Host上,配置交叉编译链(NDK)

Tensorflow编译专用NDK&SDK的github工程

(a) 在本地创建上述链接中工程的仓库
unaguo@unaguo:~/backends/$ git clone https://github.com/snipsco/tensorflow-build.git
(b) 编译工程(也即是配置交叉编译链)
unaguo@unaguo:~/backends/$ cd tensorflow-build 
unaguo@unaguo:~/backends/tensorflow-build/$ ./compile-android.sh

3. 编译Android适用的benchmark_model工具

(a) 参考 /tensorflow/tensorflow/tools/benchmark/README.md

markdown中讲,参照AndroidApp例程项目中,对 编辑Workspace 的说明去编辑Workspace

unaguo@unaguo:~/backends/tensorflow/$ ./configure

之后,
Answer “Yes” when the script asks to automatically configure the ./WORKSPACE

(b) cd到 tensorflow的Workspace下

保证bazel编译的时候,目录在tensorflow下

unaguo@unaguo:~/backends/$ cd tensorflow
unaguo@unaguo:~/backends/tensorflow/$
© 编译benchmark_model
unaguo@unaguo:~/backends/tensorflow/$ bazel build -c opt \
  --crosstool_top=//external:android/crosstool \
  --cpu=armeabi-v7a \
  --host_crosstool_top=@bazel_tools//tools/cpp:toolchain \
  --config monolithic \
  tensorflow/tools/benchmark:benchmark_model

注意:这个操作中,我不记得是不是会报一个“没有build-tools”的错误。

如果出了这个错误,我解决的办法是,把/tensorflow-build/target/android-ndk-r12b/build文件夹名字换成build-tools


4. 使用adb把工具push进手机中

(a) 下载platform-tools

因为上述那个github的交叉编译链工程中,我git下来特么的没有platform-tools,我也不知道,反正师兄给的

platform-tools从这个链接下载,应该是我看的官方页面给的链接,靠谱的
(b) 解压完了之后放到刚刚那个tensorflow-build的工程中
整个platform-tools文件夹放到 /tensorflow-build/target/android-ndk-r12b/文件夹下,和/platforms文件夹一个目录。
然后把platform-tools下的adb2文件,创建一个快捷方式到
~/backends/tensorflow
目录下。这样后面在tensorflow的workspace中时,不需要键入adb地址的全路径。
当然你也可以把adb配置到系统环境当中。
© 然后cd到/tensorflow路径下,将benchmark_model工具push进手机中
首先保证手机连上了,而且已经root,然后设置USB调试为传输文件模式
然后:
unaguo@unaguo:~/backends/tensorflow/$ ./adb push bazel-bin/tensorflow/tools/benchmark/benchmark_model /data/local/tmp
同样的方法把模型文件push进手机,一般也是push进/data/local/tmp路径下
例如:
unaguo@unaguo:~/backends/tensorflow/$ ./adb push /your/path/to/model/MS512.pb /data/local/tmp

5. 在android手机上测试模型(跑分)

adb shell 进入adb调试,注意,此前我们把adb快捷方式到了tensorflow的目录下,因此使用adb指令前应该加上./

unaguo@unaguo:~/backends/tensorflow/$ ./adb shell
Z91:/ #

然后使用benchmark_model

例如:
Z91:/ # /data/local/tmp/benchmark_model \
--graph=/data/local/tmp/MS512_O.pb \
--input_layer="input_1:0" \
--input_layer_shape="1,512,512,3" \
--input_layer_type="float" \
--output_layer="proba/Sigmoid:0" \
--show_run_order=false \
--show_time=false \
--show_memory=true \
--show_summary=true \
--show_flops=true \
--max_num_runs=50 \

几个一定要修改的options:

Options Definitions
–graph 模型名称
–input_layer 输入节点名称
–input_layer_shape 输入值的尺寸
–output_layer 输出节点名称

附录1:记录一些bug

(a) 在手机上测的时候,出现无法计算FLOPS的bug:
FLOPs calculation failed with Invalid argument: You must feed a value for 
placeholder tensor 'input_1' with dtype float and shape [?,512,512,3]
解决办法:将输入节点名称后面加上:0,即
--input_layer="input_1:0"
:0的就把它去掉。

猜你喜欢

转载自blog.csdn.net/weixin_36047799/article/details/89339839