小米开源AI框架mace编译构建

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

目录

简介

环境要求

1 安装 Bazel

2 安装Android NDK 

3 在Ubuntu16.04下安装Docker(17.09)

构建并运行示例模型

1 拉取MACE项目

2 拉取MACE Model Zoo项目

3 构建通用MACE库

4 将预先训练的mobilenet-v2模型转换为MACE格式模型

编译运行DEMO

1 运行build.sh编译

2 使用Android Studio编译


 

简介

MACE是一种针对移动异构计算平台优化的深度学习推理框架。

Github:https://github.com/xiaomi/mace

编译系统:虚拟机 ubuntu 16.04 LTS

环境要求

MACE需要以下依赖项:

SoftwareInstallation commandTested version
Python 2.7
Bazelbazel installation guide0.13.0
CMakeapt-get install cmake>= 3.11.3
Jinja2pip install -I jinja2==2.102.10
PyYamlpip install -I pyyaml==3.123.12.0
shpip install -I sh==1.12.141.12.14
Numpypip install -I numpy==1.14.0Required by model validation
sixpip install -I six==1.11.0Required for Python 2 and 3 compatibility (TODO)
SoftwareInstallation commandRemark
Android NDKNDK installation guideRequired by Android build, r15b, r15c, r16b, r17b
ADBapt-get install android-tools-adbRequired by Android run, >= 1.0.32
TensorFlowpip install -I tensorflow==1.6.0Required by TensorFlow model
Dockerdocker installation guideRequired by docker mode for Caffe model
Scipypip install -I scipy==1.0.0Required by model validation
FileLockpip install -I filelock==3.0.0Required by run on Android

注:如果在使用pip来进行安装操作时碰到这样的问题:pip Import Error:cannot import name main

解决方案:

sudo gedit /usr/bin/pip

将原来的:

from pip import main
if __name__ == '__main__':sys.exit(main())

改成:

from pip import __main__
if __name__ == '__main__':sys.exit(__main__._main())

1 安装 Bazel

推荐尺寸大于bazel 0.13.0

使用以下方法之一在Ubuntu上安装Bazel

  • 使用二进制安装程序(推荐)
  • 使用Bazel自定义APT存储库

方法一:使用二进制安装程序(推荐)

第1步:安装所需的包
首先,安装先决条件:pkg-config,zip,g++,zlib1g-dev,unzip,和python。sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python第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第3步:运行安装程序
chmod +x bazel-*.sh
./bazel-$BAZEL_VERSION-installer-linux-x86_64.sh --user第4步:删除安装包
cd /
rm -f /bazel/bazel-$BAZEL_VERSION-installer-linux-x86_64.sh第5步:设置环境
该--user标志将Bazel安装到$HOME/bin系统上的目录并设置.bazelrc路径$HOME/.bazelrc。使用该--help命令可以查看其他安装选项。如果您使用--user上面的标志运行Bazel安装程序,则Bazel可执行文件将安装在您的$HOME/bin目录中。将此目录添加到默认路径,如下所示:export PATH="$PATH:$HOME/bin"也可以将此命令添加到~/.bashrc文件中。

注:试过通过离线下载好的包进行安装出现错误,后改成用wget在线下载进行安装成功

如果安装成功后输入命令bazel 正常,使用sudo bazel却提示找不到命令的话,解决方案如下:

以root用户身份来编辑文件/etc/sudoers
sudo vim /etc/sudoers找到Defaults env_reset, 将其改为
Defaults        !env_reset  这里加了这个感叹号表示不重置环境变量然后,编辑用户根目录下的配置文件~/.bashrc
vim .bashrc在文件内最后追加
alias sudo='sudo env PATH=$PATH'最后, 使配置文件生效
source ~/.bashrc

方法二:使用Bazel自定义APT存储库

第1步:安装JDK
安装JDK 8:
sudo apt-get install openjdk-8-jdk在Ubuntu 14.04 LTS上,必须使用PPA:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update && sudo apt-get install oracle-java8-installer第2步:添加Bazel分发URI作为包源
注意:这是一次性设置步骤。echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list
curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -如果要安装Bazel的测试版,请替换stable为testing。第3步:安装和更新Bazel
sudo apt-get update && sudo apt-get install bazel如果这一步出错:
由于没有公钥,无法验证下列签名: NO_PUBKEY 7EA0A9C3F273FCD8
W: 仓库 “http://mirrors.aliyun.com/docker-ce/linux/ubuntu xenial InRelease” 没有数字签名。
N: 无法认证来自该源的数据,所以使用它会带
解决办法:(红色字符串是PUBKEY的后八位)sudo apt-key adv --recv-keys --keyserver keyserver.Ubuntu.com F273FCD8安装后,可以使用以下命令升级到较新版本的Bazel:
sudo apt-get upgrade bazel

注:安装bazel最新版本0.17.1出现无法正常编译mace

2 安装Android NDK 

推荐的Android NDK版本包括r15b,r15c和r16b

# Download NDK r15c
cd /opt/
wget https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip 
unzip android-ndk-r15c-linux-x86_64.zip 
rm -f android-ndk-r15c-linux-x86_64.zip配置NDK系统环境变量sudo vim /etc/profile在文件内最后追加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}查看是否安装成功
ndk-build

3 在Ubuntu16.04下安装Docker(17.09)

1 安装docker:sudo apt-get install docker.io
2 检查版本: docker version 当出现client和service表面安装成功
3 启动docker:systemctl start docker.service
4 更新docker 4.1 需要使用apt-get来升级,借助阿里的docker-ce源sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"4.2 sudo apt-get update4.3 搜索源 apt-cache madison docker-ce会出现版本,选择一个4.4 sudo apt-get -y install docker-ce=17.09.0~ce-0~ubuntu --allow-unauthenticated4.5 查看是否更新sudo docker version

构建并运行示例模型

首先,确保已经正确设置了环境

1 拉取MACE项目

git clone https://github.com/XiaoMi/mace.git
cd mace/
git fetch --all --tags --prune# Checkout the latest tag (i.e. release version)
tag_name=`git describe --abbrev=0 --tags`
git checkout tags/${tag_name}

2 拉取MACE Model Zoo项目

git clone https://github.com/XiaoMi/mace-models.git

3 构建通用MACE库

cd path/to/mace
# Build library
# output lib path: builds/lib
bash tools/build-standalone-lib.sh

注:编译时如果NDK没有设置环境变量会提示未找到NDK则需要配置NDK路径

在mace源码根目录下有一个WORKSPACE文件,请把你的NDK 路径配置在android_ndk_repository下

NDK路径是相对于mace源码的根目录

# Set up Android NDK
android_ndk_repository(name = "androidndk",# Android 5.0api_level = 21,path="../../Android/Sdk/ndk-bundle",
)

4 将预先训练的mobilenet-v2模型转换为MACE格式模型

cd path/to/mace
# Build library
python tools/converter.py convert --config=/path/to/mace-models/mobilenet-v2/mobilenet-v2.yml

注: 在转换模型过程中,如果mobilenet-v2.yml格式为code时,不知为何只要Android Studio打开Demo工程就无法转换成功,关闭后就可以,但是格式为file时就不存在此问题

编译运行DEMO

位置:mace/examples/android

使用以下方法之一可以生成APK

  • 运行build.sh编译
  • 使用Android Studio编译

运行build.sh编译

android工程目录下有一个build.sh的配置文件,运行就可以编译,但是该配置使用的模型是mobilenet,该模型只有arm64-v8a平台,而现在手机大部分是armeabi-v7a平台,所以改成使用模型mobilenet-v2

第一步,修改build.sh文件

打开build.sh文件TARGET_ABI=arm64-v8a
修改成
TARGET_ABI=armeabi-v7apython tools/converter.py convert --config=mace/examples/android/mobilenet.yml --target_abis=$TARGET_ABI
cp -rf builds/mobilenet/include/mace/public/*.h $INCLUDE_DIR
cp -rf builds/mobilenet/model $LIBRARY_DIR重新指定模型路径
mobilenet-v2模型路径:mace-models/mobilenet-v2/mobilenet-v2.yml替换mobilenet模型路径:mace/examples/android/mobilenet.yml模型转换成功后会builds下生成mobilenet-v2目录
将mobilenet-v2替换mobilenet修改完成如下所示
python tools/converter.py convert --config=mace-models/mobilenet-v2/mobilenet-v2.yml  --target_abis=$TARGET_ABI
cp -rf builds/mobilenet-v2/include/mace/public/*.h $INCLUDE_DIR
cp -rf builds/mobilenet-v2/model $LIBRARY_DIR

第二步,修改CMake配置文件 

打开macelibrary Module下CMakeLists.txt文件set(mace_lib ${CMAKE_SOURCE_DIR}/src/main/cpp/lib/arm64-v8a/libmace.a)
set(mobilenet_lib ${CMAKE_SOURCE_DIR}/src/main/cpp/model/arm64-v8a/mobilenet.a)将arm64-v8a平台换成armeabi-v7a
将mobilenet.a 修改成 mobilenet-v2.a修改完成如下所示
set(mace_lib ${CMAKE_SOURCE_DIR}/src/main/cpp/lib/armeabi-v7a/libmace.a)
set(mobilenet_lib ${CMAKE_SOURCE_DIR}/src/main/cpp/model/armeabi-v7a/mobilenet-v2.a)

第三步,修改build.gradle

打开macelibrary Module工程下的build.gradleabiFilters "arm64-v8a"
修改成
abiFilters "armeabi-v7a"

第四步,修改模型转换格式

file:文件格式,tensorflow的模型将转换成 .pb格式文件

code:c++代码格式,模型加密与保护

模型转换成C++代码,防止反编译有效保护模型model_graph_format: file
model_data_format: file将模型图形格式和模型数据格式都转换为代码model_graph_format: code
model_data_format: code具体操作将mace-models/mobilenet-v2 目录下的mobilenet-v2.yml和mobilenet-v2-host.yml都修改为code,修改完成如下所示
library_name: mobilenet-v2
target_abis: [armeabi-v7a, arm64-v8a]
model_graph_format: code
model_data_format: code

第五步,设置sdk和ndk路径

在项目根目录下local.properties文件设置SDK和NDKsdk.dir=E\:\\AndroidStudio\\SDK
ndk.dir=E\:\\AndroidStudio\\android-ndk-r16b

第六步,编译Demo

在项目根目录下运行
./build.sh

注:因为编译时有进行模型转换,如上所注,在编译的时候Android Studio不能打开该Demo工程,否则编译将出现错误。编译完成后可能会因为没有连接设备而提示错误,但是可以在app/build/outputs下看是否有成功打包apk

2 使用Android Studio编译

第一步,转换模型数据

将mace-models/mobilenet-v2 目录下的mobilenet-v2.yml和mobilenet-v2-host.yml都修改为code,修改完成如下所示
library_name: mobilenet-v2
target_abis: [armeabi-v7a, arm64-v8a]
model_graph_format: code
model_data_format: code修改完后使用命令转换
python tools/converter.py convert --config=/path/to/mace-models/mobilenet-v2/mobilenet-v2.yml

第二步,导入Demo工程,设置sdk和ndk

注:ndk如果设置最新的版本将无法正常编译,请选择推荐的版本

第三步,将生成的库放至macelibrary

在Demo项目中的macelibrary/src/main/cpp 目录下

    1 新建include/mace/public文件夹

           1.1 将builds/include/mace/public/ 下的mace.h 和 mace_runtime.h复制到该文件夹下

           1.2 将builds/mobilenet-v2/include/mace/public/ 下的mace_engine_factory.h 、mobilenet_v2.h复制到该文件夹下

    2 新建lib文件夹

           2.1 将builds/lib下的arm64-v8a、armeabi-v7a和linux-x86-64复制到该文件夹下

           2.2 将cpu_gpu/下的libmace.a、libmace.so文件复制到与此同级别目录后删除cpu_gpu文件夹

    3 新建model文件夹

           3.1 将builds/mobilenet-v2/model 下的 arm64-v8a/mobilenet-v2.a、armeabi-v7a/mobilenet-v2.a复制到该文件夹下

           3.2 将mobilenet-v2.a 重命名为 mobilenet.a  或 修改CMakeLists.txt文件  将mobilenet.a 改为 mobilenet-v2.a  如下

                 set(mobilenet_lib ${CMAKE_SOURCE_DIR}/src/main/cpp/model/arm64-v8a/mobilenet-v2.a)

第四步,点击运行

修改以下代码,加载使用模型mobilenet_v2后点击运行


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

相关文章

使用MACE加速---使用篇

最近开始研究如何对手机应用中的识别算法进行加速,搜索后发现了小米的MACE。 Mobile AI Compute Engine (MACE) 是一个专为移动端异构计算设备优化的深度学习前向预测框架。 覆盖了常见的移动端计算设备(CPU,GPU和DSP)。支持的硬…

小米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…