最近开始研究如何对手机应用中的识别算法进行加速,搜索后发现了小米的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.zipexport 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对自己的模型加速。

使用MACE加速---使用篇相关推荐

  1. 2D_Detection-模型加速(网络篇)

    layout: post title: 2D_Detection-模型加速(网络篇) date: 2021-09-04 16:34:34.000000000 +09:00 categories: [算 ...

  2. GitHub下载加速-加速网站篇(二)

    介绍 众所周知,GitHub是一个巨大的开源宝库,以及程序员和编程爱好者的聚集地,诸多优秀的开源项目全部都是位于GitHub上.但是每当我们看到优秀的开源项目,准备去下(bai)载(piao)时,会发 ...

  3. ClickHouse MergeTree启动加速--使用篇

    前言 MergeTree Family启动慢问题一直是ClickHouse社区的痛点.在完成对所有MergeTree part的加载之前,clickhouse-server实例无法对外提供服务.而在生 ...

  4. 如何root安卓手机_介绍安卓手机如何加速

    今天来聊聊一篇关于安卓手机如何加速的文章,现在就为大家来简单介绍下安卓手机如何加速,希望对各位小伙伴们有所帮助. 虽然如今的安卓手机便携设备已经越来越智能,配置和性能也越来越高,但随着使用时间的延长, ...

  5. 怒写400篇AI文章!这群妹子卷疯了…

    今天这篇文章不谈技术,给大家分享一些干货!首先来聊聊一个AI圈子里画风清奇的公众号 夕小瑶的卖萌屋.公号的作者中不仅妹子居多,颜值能打,而且喜欢将学术研究和大厂业务上线中的收获与读者分享. 卖萌屋的作 ...

  6. Tensorrt踩坑日志—YOLOv5使用python的Tensorrt依赖包直接加速

    1.用python版的tensrrt实现 1.1安装依赖包 需要注意的是这个方法只在linux环境下可行 pip install -U nvidia-tensorrt --index-url http ...

  7. 7 个小仙女花3年时间写了一本1200页的机器学习算法手册(限时开放下载)

    今天这篇文章不谈技术,给大家分享一些干货!首先来聊聊NLP.搜索与推荐领域的画风清奇的公众号 夕小瑶的卖萌屋.公号的作者基本都是 妹子,不仅长得好看,而且实力硬核,还会画画. 这些妹子们毕业于北大.中 ...

  8. Linux调优方案,sysctl.conf的设置

    $ /proc/sys/net/core/wmem_max 最大socket写buffer,可参考的优化值:873200 $ /proc/sys/net/core/rmem_max 最大socket读 ...

  9. 音视频技术开发周刊 | 217

    每周一期,纵览音视频技术领域的干货. 新闻投稿:contribute@livevideostack.com. 小提示:点击标题即可跳转到相应文章 链接跳转仅支持公众号相关链接 即构科技:解决行业痛点, ...

最新文章

  1. Spring MVC测试框架
  2. 什么是分布式事务以及有哪些解决方案?
  3. Linux 下的常用工具
  4. ajax 微信code获取_获取链接的参数,判断是否是微信打开,ajax获取数据
  5. 远程服务器 上传公钥,SecureCRT+Ubuntu SSH服务器的远程公钥登陆
  6. 【Python3网络爬虫开发实战】 1.2.2-Selenium的安装
  7. JDK(Install)
  8. Qtum研究院:市面上企业级解决方案都有哪些亮点?
  9. 108次练习之模拟实现STL中的Vector(一)
  10. 什么是不简单?把每一件简单的事做好就是不简单;什么是不平凡?能把每一件平凡的事做好就是不平凡。
  11. APP测试:禁止APP登录页面截图解决方法
  12. kubuntu我显示服务器,还是不行!kubuntu到底怎么配置IP才能上网啊?[已经解决!]...
  13. MasterCAM快捷功能大全
  14. 理科女生计算机与会计学选择,我是一理科女生、在报考学校时候、选择会计还是会计电算化比较好呢?还有会计与审计、会计于统计核算....
  15. php接入外汇购物,兑换难!这些外币最好别带回国
  16. 意识比智力重要,选择比努力重要
  17. Quasi-Dense Similarity Learning for Multiple Object Tracking(用于多目标跟踪的拟密集相似度学习)
  18. 全国计算机二级考试公共知识
  19. 搜狗输入法自定义短语使用小技巧
  20. echarts折线图设置横向基准线/水平线

热门文章

  1. 红黑树原理浅谈(附Linux内核源码注释)
  2. Sci论文——respectively用法
  3. WeiFenLuo.winFormsUI.Docking.dll的使用(停靠效果)
  4. 【Ubuntu】修改系统时间
  5. 学平面设计需要会什么软件?如何自学?
  6. 登陆注册实现腾讯云短信验证功能
  7. 微信小程序开发-短信注册功能
  8. 如何去掉/消除网页复制粘贴后带到word或WPS文档中的浅灰色背景
  9. Python经典书籍有哪些?这份书单送给你_黑马程序员
  10. Carla仿真环境部署