使用MACE加速---使用篇

article/2025/9/15 17:23:19

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

 


http://chatgpt.dhexx.cn/article/kryKql3o.shtml

相关文章

小米AI推理框架MACE介绍

MACE 是小米公司自研的移动端深度学习框架 Mobile AI Compute Engine,2017年12月15日于公司内部正式发布。2018年6月28日,在“2018(第十三届)开源中国开源世界高峰论坛”上,小米公司人工智能与云平台副总裁崔宝秋博士宣…

MACE 使用笔记

环境安装 tensorflow 安装,一直不太想用mace的部分原因是不支持tensorflow2.模型, 但为了GPU(OpenCL)还是要用啊。 Shell set -e 学习笔记: shell 中的 set -e , set e 用法_滴水成川-CSDN博客_linux set-eset -eset命令的-e参…

小米开源框架MACE 简介

转载自 https://www.jianshu.com/p/2ab68779d05b 前言 MACE 是小米公司自研的移动端深度学习框架 Mobile AI Compute Engine,2017年12月15日于公司内部正式发布。2018年6月28日,在“2018(第十三届)开源中国开源世界高峰论坛”上…

MACE(1)-----环境搭建

学习MACE也有一个月了,将其划分三步来学习。本文是MACE学习的第一步即MACE环境的搭建。之后还有两步mace的编译和mace工程化。 MACE(2)-----模型编译:https://www.cnblogs.com/missidiot/p/9509831.html MACE(3)-----工程化:https://www.cnbl…

JDK , Tomcat , Eclipse 版本对应关系

1. JDK , Tomcat 版本对应关系 参考网址 : https://tomcat.apache.org/whichversion.html 2. JDK , Eclipse 版本对应关系 参考网址 : https://wiki.eclipse.org/Eclipse/Installation 作者 Github : tojohnonly , 博客 : EnskDeCode

如何查看eclipse的版本

阅读数:20254 转载文章,原文地址:https://blog.csdn.net/duqian94/article/details/52386076 由于作者已经写的很清楚了,就没有做修改直接转载过来了。 本篇文章主要讲解的是三种查看eclipse版本的方法(超详细&#xf…

Eclipse各版本有什么区别?

一直以来对eclipse这个IDE的各发行版本都弄不清楚,今天做一个梳理和记录。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环境插件(JDT),插件开发环境(PDE&#xff0…

超方便插件lombok的使用(eclipse版本)

1 准备 下载地址: 链接:https://pan.baidu.com/s/1Qoy2VRoERqZcgsOVYl3mZQ 提取码:2chx 2.安装 点击 或者找到对应的lombok文件所在目录执行java -jar lombok(1).jar 会自动扫描eclipse所以目录,也可以自己选择点击"S…

查看Eclipse版本号及各个版本区别

1. 找到eclipse安装目录 2. 进入readme文件夹,打开readme_eclipse.html 3. readme_eclipse.html呈现的第二行即数字版本号,如: Eclipse Project Release Notes Release 4.2.0 Last revised June 8th, 2012 附:Eclipse各个版本简介…

安装两个Eclipse 版本不一致,高版本无法打开

Could not create the Java Virtual Machine,A fatal exception has occurred。 首先删除了 工作空间的配置 然后删除掉C:\Windows\System32 里面的三个java文件 java.exe javas.exe javaw.exe 配置好环境变量就好了

eclipse选择java版本_使用 Eclipse 开发版本选择和下载说明

现在越来越多的人开发使用 IDEA,使用 Eclipse 开发的已经渐渐变少了,这篇就简单介绍下 Eclipse 的版本选择和下载,供目前还在坚守使用 Eclipse 开发的同胞们~ Eclipse 简介 Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,…

解决pydev与eclipse版本问题

eclipsepydevanaconda版本问题方法: 在eclipse安装pydev插件时,会遇见安装后在“Preference”不显示“pydev”现象,原因:下载的pydev版本与eclipse版本不匹配,导致无法使用,经过反复调试,发现官…

Eclipse版本升级(2020-12)

文章目录 Eclipse版本升级(2020-12)内置工具栏安装本地安装包安装 Eclipse版本升级(2020-12) Eclipse内安装软件通常会通过内置软件安装方式或者是自己下载安装包方式安装。同样,Eclipse版本升级也可以用这两种方式。…

Eclipse版本对应的jdk需求及查看eclipse的java版本怎么看Eclipse需要安装哪个版本jdk

1)找到eclipse安装目录。 2)进入readme文件夹,打开readme_eclipse.html。 Eclipse软件 jdk及种操作方法 自行百度网盘提取 链接:https://pan.baidu.com/s/1JEYq4Lo8aEms7ClPIchLsA?pwddt4z 提取码:dt4z 我先给一个我翻译过的图&#x…

Eclipse版本号及各个版本区别

附:Eclipse各个版本简介(http://zh.wikipedia.org/wiki/Eclipse) 从2006年起,Eclipse基金会每年都会安排同步发布(simultaneous release)。同步发布主要在6月进行,并且会在接下来的9月及2月释放…

如何更新Eclipse版本

Eclipse用久了上面会集成了使用者长久以来集成的开发插件,如何更新Eclipse并且将这些插件带到下一个版本是本文主要介绍的内容。 此外,升级Eclipse版本的好处还在于更好的支持新版JDK的特性,如JDK8的Lambda语法,以及对高版本Tomcat的配置支持,还有minimap视图支持…

Eclipse 版本升级记录

前言 Eclipse 不是不能在线升级,至少没有找对方法,下面就让我来一步一步带你学会它、使用它吧! 一、概念 Eclipse主要分为两个概念,一个是在线升级 Eclipse 新版本,另一个是在线升级 Eclipse 插件,这两个是有很大区…

Eclipse版本与jdk对应版本等信息

最近整理了一下Java学习的准备基础工作,每次用的时候都要重新找一遍比较麻烦,就先把目前的资料连接备份一下,方便自己参考取用。 1、Eclipse官方网站: Enabling Open Innovation & Collaboration | The Eclipse Foundationh…

Eclipse各版本代号一览表以及官网上有很多版本的eclipse,下载哪个版本比较合适呢?

Eclipse各版本代号一览表 Eclipse的设计思想是:一切皆插件。Eclipse核心很小,其它所有功能都以插件的形式附加于Eclipse核心之上。 Eclipse基本内核包括:图形API(SWT/Jface),Java开发环境插件&#xff08…

架构问题--削峰填谷

削峰填谷 瞬时集中突发性的流量在系统中是很常见的问题,在系统的架构中需要针对相关的业务场景做良好的设计;不仅维护系统的稳定,还能很好的解决业务问题,提高并发性能。削峰填谷是在应对突发性流量的时候最常用的设计思想。 问题…