DSP

使用MACE加速---使用篇

2019-07-13 17:41发布

最近开始研究如何对手机应用中的识别算法进行加速,搜索后发现了小米的MACE。 Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算设备优化的深度学习前向预测框架。 覆盖了常见的移动端计算设备(CPU,GPU和DSP)。支持的硬件加速比较全面,是小米提供的一个比较有诚意的框架。 这篇博文主要记录一下环境的配置,以及把小米提供的例子运行一下,以这样一个过程来熟悉使用方法。当然大家看MACE的官方文档MACE也可以获得这些知识,不过我会对我在使用过程中遇到的一些坑进行记录。  

环境配置

环境配置有两种方式,一种是自己安装环境,并不是太复杂,一种是使用小米提供的docker,很简单,但是需要对docker有基本的了解。

1.使用docker的环境(推荐)

小米提供了两种docker,一个是little edition,一个是full edition,一般使用little edition已经足够了, full edition版本提供了多个版本的android NDK。 使用docker pull将image拉下来 docker pull registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev-lite 然后就可以启动container了 # Create a container named `mace-dev` docker run -it --privileged -d --name mace-dev -v /dev/bus/usb:/dev/bus/usb --net=host -v /local/path:/container/path -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev-lite # Execute an interactive bash shell on the container docker exec -it mace-dev /bin/bash 使用docker的image非常方便,我们不用自己配置环境,只是下载image需要花费一些时间。

2.自己安装环境

必须的依赖环境如下: 安装依赖的时候最好使用测试过的版本号,否则可能存在编译不过的情况。

安装bazel

export BAZEL_VERSION=0.13.1 mkdir /bazel && cd /bazel && wget https://github.com/bazelbuild/bazel/releases/download/$BAZEL_VERSION/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && chmod +x bazel-*.sh && ./bazel-$BAZEL_VERSION-installer-linux-x86_64.sh && cd / && rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh 我之前bazel安装成了0.21.0,就会导致编译的时候报下面的错误: ERROR: Analysis of target '//mace/libmace:libmace_dynamic' failed; build aborted: no such package '@tflite//': The native http_archive rule is deprecated. load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") for a drop-in replacement. 如果已经遇到了这个问题,将bazel版本回退就好了,最好是用验证过的版本0.13.0。bazel的回退其实很简单,只需要按照上面的安装命令重新安装就可以了。

安装NDK

# Download NDK r15c cd /opt/ && wget -q https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip && unzip -q android-ndk-r15c-linux-x86_64.zip && rm -f android-ndk-r15c-linux-x86_64.zip export ANDROID_NDK_VERSION=r15c export ANDROID_NDK=/opt/android-ndk-${ANDROID_NDK_VERSION} export ANDROID_NDK_HOME=${ANDROID_NDK} # add to PATH export PATH=${PATH}:${ANDROID_NDK_HOME}

安装其他tools

apt-get install -y --no-install-recommends cmake android-tools-adb pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com setuptools pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com "numpy>=1.14.0" scipy jinja2 pyyaml sh==1.12.14 pycodestyle==2.4.0 filelock

安装tensorflow

pip install -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com tensorflow==1.8.0

编译使用

1.下载MACE代码

git clone https://github.com/XiaoMi/mace.git cd mace/ git fetch --all --tags --prune

2.下载models

git clone https://github.com/XiaoMi/mace-models.git models中是小米已经训练过的一些models,刚开始学习的时候可以使用这些models进行试验。  

模型转换

1.编译mace libs

可以使用下面的命令自己编译,也可以从mace网站上下载已经编译好的libs。 cd path/to/mace # Build library # output lib path: builds/lib bash tools/build-standalone-lib.sh 最后我们在mace目录下会得到一个builds文件夹,有一个include文件夹和一个libs文件夹,主要是为不同的环境生成cpu gpu优化的静态和动态库。 ├── include
│   └── mace
│       └── public
│           └── mace.h
└── lib
    ├── aarch64_linux_gnu
    │   └── cpu_gpu
    │       ├── libmace.a
    │       └── libmace.so
    ├── arm64-v8a
    │   └── cpu_gpu
    │       ├── libmace.a
    │       └── libmace.so
    ├── armeabi-v7a
    │   ├── cpu_gpu
    │   │   ├── libmace.a
    │   │   └── libmace.so
    │   └── cpu_gpu_dsp
    │       ├── libhexagon_controller.so
    │       ├── libmace.a
    │       └── libmace.so
    ├── arm_linux_gnueabihf
    │   └── cpu_gpu
    │       ├── libmace.a
    │       └── libmace.so
    └── linux-x86-64
        ├── libmace.a
        └── libmace.so

2.将mobilenetv2转成mace的格式

因为后面我们需要讲生成的文件在android代码中使用,所以需要修改mobilenet-v2.yml和mobilenet-v2-host.yml这两个文件中的 model_graph_format: file
model_data_format: file 更改为 model_graph_format: code
model_data_format: code 然后用convertor脚本开始转换。 cd path/to/mace # Build library python tools/converter.py convert --config=/path/to/mace-models/mobilenet-v2/mobilenet-v2.yml converter.py这个脚本是根据mobilenet-v2.yml中的配置进行转换的,如果需要转换自己的模型文件,就需要写自己的yml文件。 转换成功后得到了mobilenet-v2文件夹,其中mobilenet_v2_index.html是网络结构列表。 ......
├── mobilenet-v2
│   ├── include
│   │   └── mace
│   │       └── public
│   │           ├── mace_engine_factory.h ------引用模型时需要包含的h文件
│   │           └── mobilenet_v2.h   ------引用模型时需要包含的h文件
│   └── model
│       ├── arm64-v8a
│       │   └── mobilenet-v2.a   ------模型库文件
│       └── armeabi-v7a
│           └── mobilenet-v2.a
└── mobilenet_v2_index.html  

3.在手机中运行

上面的编译生成的库文件需要在代码中调用,但是如果要方便的跑android demo可以直接在mace/examples/android下跑脚本: ./build.sh dynamic 这个脚本会直接从编译libmace开始开始直到编译出apk文件。 编译完成后安装apk adb install ./app/build/outputs/apk/app/release/app-app-release.apk 使用GPU计算大约会比CPU提升一倍的速度。   下一篇介绍如何使用mace对自己的模型加速。