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

article/2025/9/15 17:54:33

学习MACE也有一个月了,将其划分三步来学习。本文是MACE学习的第一步即MACE环境的搭建。之后还有两步mace的编译和mace工程化。

  MACE(2)-----模型编译:https://www.cnblogs.com/missidiot/p/9509831.html

  MACE(3)-----工程化:https://www.cnblogs.com/missidiot/p/9717633.html

文章内容翻译自 MACE 官方手册,记录本人阅读与开发过程,力求不失原意,但推荐阅读原文。

  MACE官方文档:https://media.readthedocs.org/pdf/mace/latest/mace.pdf

  小米MACE Github地址:https://github.com/xiaomi/mace

  小米MACE安装说明:https://mace.readthedocs.io/en/latest/

  

MACE

目录

  介绍

  环境搭建

  实例运行

一、简介(Introduction)

  MACE(移动AI计算引擎)小米开发的一款针对移动异构计算平台优化的深度学习推理框架。MACE覆盖了常见的移动端计算设备(CPU,GPU和DSP),并且提供了完整的工具链和文档,帮助用户将深度学习模型部署到手机,平板电脑,个人电脑和物联网设备。MACE已经在小米内部广泛使用并且被充分验证具有业界领先的性能和稳定性。

框架(Architecture)

  上图描述了MACE的基本框架。

1. MACE Model

  MACE定义了自有的模型格式(类似于Caffe2),通过MACE提供的工具可以将Caffe和TensorFlow的模型 转为MACE模型。

2. MACE Interpreter

  MACE Interpreter主要负责解析运行神经网络图(DAG)并管理网络中的Tensors。

3. Run Time

  CPU/GPU/DSP Runtime对应于各个计算设备的算子实现。

使用流程

1. 配置模型部署文件(model.yml)

  模型部署文件详细描述了需要部署的模型以及生成库的信息,MACE根据该文件最终生成对应的库文件。

2. 编译MACE库

  编译MACE的静态库或者动态库。

3. 模型转换

  将TensorFlow 或者 Caffe的模型转为MACE的模型。

4.1 部署

  根据不同使用目的集成Build阶段生成的库文件,然后调用MACE相应的接口执行模型。

4.2 命令行运行

  MACE提供了命令行工具,可以在命令行运行模型,可以用来测试模型运行时间,内存占用和正确性。

4.3 Benchmark

  MACE提供了命令行benchmark工具,可以细粒度的查看模型中所涉及的所有算子的运行时间。

总结 

  以上步骤是基于官方文档,以下为博主理解:最初我们设计算法为python文件(model.py)训练完成后生成model.pb模型文件。再将model.pb文件部署在model.yml文件中,之后经过编译转换将model.yml文件经过converter.py转换生成库文件。最终进入第四步按需求去调用这些库文件即可。

二、环境搭建

  环境要求:本文基于Ubuntu 16.04搭建,所需安装的软件主要包括docker,bazel和Android jdk,以及python的依赖库,Cmake在构建工程时候Android stdio会自动更新下载。当这些所需的库安装好后便可以在MACE官方pull mace镜像了。

  下图为所需的依赖库:

1. 在Ubuntu16.04下安装Docker 

1.1 安装docker:sudo apt-get install docker.io
1.2 检查版本: docker version 当出现client和service表面安装成功
1.3 启动docker:systemctl start docker.service
1.4 更新docker 

  1.需要使用apt-get来升级,借助阿里的docker-ce源
    sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
  2.sudo apt-get update
  3.搜索源
    apt-cache madison docker-ce

  会出现版本,选择一个
  4.sudo apt-get -y install docker-ce=17.09.0~ce-0~ubuntu --allow-unauthenticated
  5.查看是否更新
    sudo docker version

 1.5 设置开机自启动
    sudo systemctl enable docker

  然后再重启:
    systemctl restart docker

 2. python库的安装(python2.7)  

库的安装需要加 --user
比如:
  pip install
-I --user filelock==3.0.0
或者:
  pip install tensorflow

3.安装Android NDK(r15b, r15c and r16b )

  注:不要下载最新版的,博主下的17b出现问题。

3.1 由于挂载在/opt文件夹下面,需要权限,所以首先进入到管理员状态sudo su
3.2 进入到/opt文件下面cd opt
3.3 执行下面命令下载(博主采用的是r15c的版本,测试可用)wget -q https://dl.google.com/android/repository/android-ndk-r15c-linux-x86_64.zip
3.4 在此目录下面进行解压unzip -q android-ndk-r15c-linux-x86_64.zip
3.5 导入环境变量(红色版本根据自己下载更改)export ANDROID_NDK_VERSION=r15cexport ANDROID_NDK=/opt/android-ndk-${ANDROID_NDK_VERSION}export ANDROID_NDK_HOME=${ANDROID_NDK}# add to PATHexport PATH=${PATH}:${ANDROID_NDK_HOME}
3.6 变量生效:source /etc/profile
3.7 验证是否生效:ndk-build
  注:若
出现以下这些表明安装成功。
  Android NDK: Could not find application project directory !  
Android NDK: Please define the NDK_PROJECT_PATH variable to point to it.   
  /home/weilong/android/android-ndk-r16b/build/core/build-local.mk:151: *** Android NDK: Aborting . Stop.

4. 在Linux下面安装bazel

4.1安装Jdk8sudo apt-get install openjdk-8-jdk
4.2在包资源中增加Bazel的发布源4.2.1 echo "deb [arch=amd64] http://storage.googleapis.com/bazel-apt stable jdk1.8" | sudo tee /etc/apt/sources.list.d/bazel.list4.2.2 curl https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
4.3 安装Bazelsudo apt-get update && s 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
4.4 更新Bazelsudo apt-get upgrade bazel
4.5 导入路径(红色版本号根据自己查看的写) 
  查看版本:bazel versionexport BAZEL_VERSION
=0.13.1 4.6 创建bazel环境创建一个bazel目录: sudo mkdir /bazel 进入到该目录: cd /bazel 下载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

5. 构建MACE镜像

  MACE提供已安装依赖项的docker镜像以及用于构建镜像的Dockerfiles,您可以直接拉取现有的镜像或从Dockerfiles构建它们。在大多数情况下,镜像可以满足开发人员的基本需求。

 5.1.创建镜像

  MACE镜像已经在docker环境创建好了,有两种创建方式,pull或者build。官方提供的MACE镜像有两种,lite版和full版。官方强烈建议pull来构建镜像到本地,建议读者在docker的学习上花一点时间。

  1.1 lite版本    

# Pull lite edition docker image
docker pull registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev-lite
# Build lite edition docker image
docker build -t registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev-lite ./docker/mace-dev-lite

  1.2 full版本

# Pull full edition docker image
docker pull registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev
# Build full edition docker image
docker build -t registry.cn-hangzhou.aliyuncs.com/xiaomimace/mace-dev ./docker/mace-dev

 5.2 使用镜像

启动docker
2.1 创建一个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
2.2 执行该容器 docker exec -it mace-dev /bin/bash

  本文直接pull的mace-dev版本。如下图所示构建的镜像为mace-dev为13.4GB,并开启了一个容器,ID为12899***。

  至此,MACE环境就搭建起来了,下一节内容为构建一个实例,演示如何通过MACE来转模型文件。

现在开启一个容器,在容器中pull mace项目:

1.sudo docker ps -a  #c查看镜像,会看见一个id
2. sudo docker start id    #id为上条命令的id号码
3. sudo docker exec -it id bash  #同理id为镜像的id

三、构建并运行实例模型

  我们以mobilenet-v2模型为例。

1. Pull MACE项目

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

2. pull MACE Model Zoo 项目

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

3. 编译MACE Library(后期发现这一步其实不用,当打开容器时候资源可以通用,在本地的都可以用,模型git到本地即可。这块后期再改)

  Question?如何在文件夹下找到容器中创建的文件?

  Answer!通过查看容器的Id找到位置。

  3.1 进入到mace路径下

3.1.1 首先对docker文件全部解锁,在cd /var/lib下执行命令:chmod -R 777 docker
3.1.2 方法一:通过ID在docker文件下找,
3.1.3 方法二:在docker下面直接搜索mace文件即可,mace文件已经在容器中了。

如上图所示就进入到了容器中的mace路径下,注意该操作得另起一个终端操作。

  3.2 进行编译

bash tools/build-standalone-lib.sh

 

  如上图所示即编译完成。

4. 模型转换成C++代码,防止反编译有效保护模型。有两种方法

1. 将模型图转换为代码,将模型权重转换为文件
model_graph_format: code 
model_data_format: file
2. 将模型图和模型权重都转换为代码
model_graph_format: code 
model_data_format: code

  以mobilenet-v2为例子,将mace-models/mobilenet-v2 文件夹下的mobilenet-v2.yml和mobilenet-v2-host.yml都修改为code。

 5. 将mobilenet-v2.yml模型转换为MACE格式

在mace路径下:cd /mace
python tools/converter.py convert --config=/var/lib/docker/aufs/diff/b1e110a3c38e93df0e36c475a137d390c6c44dc4299da4895494453d88f21e65/mace-models/
mobilenet-v2/mobilenet-v2.yml

  

  以上图片为转换过程,若出现则表明转换工作完成。

  以上的步骤已经将model.yml文件转换完毕形成库,之后的步骤就是将这些库加载到工程中形成model.apk文件部署在安卓终端中。 

  在转换后所生成的库在mace/builds/文件夹下面;

  mace中的android工程路径;/mace/mcae/examples/android/这在后期用Android studio直接加载此工程即可。

  在加载之前我么需要将转换生成的库挂载到工程中。

在android项目中的macelibrary/src/main/cpp 文件夹下,如下图所示
-- 新建include/mace/public文件夹
-- 新建lib文件夹
-- 新建model文件夹

  1. 将builds/include/mace/public/ 下的mace.h 以及 mace_runtime.h拷贝进去macelibrary/src/main/cpp/include/mace/public中

  2. 将builds/mobilenet-v2/include/mace/public/ 下的mace_engine_factory.h 以及 mobilenet_v2.h拷贝至 macelibrary/src/main/cpp/include/mace/public中

    3. 将builds/mobilenet-v2/model 下的mobilenet-v2.a 拷贝至 macelibrary/src/main/cpp/model中,并修改mobilenet-v2.a 为 mobilenet.a

    4. 将builds/lib下的文件都拷贝至macelibrary/src/main/cpp/lib中,里面有三个文件夹,分别是arm64-v8a,armeabi-v7a和linux-x86-64。

    这三个文件是针对的终端硬件结构也不一致,读者自己百度,当往终端部署时候首先会找v8a的so文件,如果没有则向下兼容找v7a文件。arm是cpu的一种体系结构,x86用于平板或者电脑cpu结构。

    4.1 我们需要将各个版本的下的/cpu_gpu下的文件复制到与此同级别目录,还有个dsp体系结构,本例子暂不介绍。

    4.2 将model下的mobilenet.a文件同样复制到各个体系结构下。如下图所示:

  5. macelibrary/src/main/cpp/include/mace/public下所有.h文件都要被引入,如下图,总共有四个.h文件

    mace.h不需要引入

    mace_runtime需要引入mace.h

    mace_mobilenet.h需要引入mace.h 和mace_runtime.h

    mace_engine_factory.h需要引入mace.h 和mace_runtime.h,同理如下图所示

  至此以上的工作模型经过编译转换,并且将生成的库加载在工程文件中,这个工作已经完成,下一步将在Android studio中加载工程 ,并运行生成apk文件在终端。

  打开Android stdio,在File下找到Project Structure加载NDK路径。

  在Android studio加载在/var/lib/docker/aufs/diff/b1e110a3c38e93df0e36c475a137d390c6c44dc4299da4895494453d88f21e65/mace/mace/examples下的android工程

由于这个测试的app默认是使用mobilenet_v1的模型的,所以我们更改一下代码让他使用mobilenet_v2,修改com.xiaomi.mace.demo.result下的InitData.java文件中的
model =  MODELS[0];改为:model =  MODELS[ 1];即可

 运行后的结果如下图所示,该实例功能是物体实时识别;下篇博文会会针对mobilenet_v2.pb文件分析网络结构。

如果遇到卡退问题,原因是权限要读写外部存储卡,权限不够导致,在客户端apk设置下赋予权限即可。

 

本文仅用于学习研究,非商业用途,欢迎大家指出错误一起学习,文章内容翻译自 MACE 官方手册,记录本人阅读与开发过程,力求不失原意,但推荐阅读原文。

MACE官方文档:https://media.readthedocs.org/pdf/mace/latest/mace.pdf

小米MACE Github地址:https://github.com/xiaomi/mace

小米MACE安装说明:https://mace.readthedocs.io/en/latest/

  

 

转载于:https://www.cnblogs.com/missidiot/p/9480033.html


http://chatgpt.dhexx.cn/article/27VVDccP.shtml

相关文章

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…

架构问题--削峰填谷

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

PMP知识点2

根据PMBOK和参考书籍自己总结的一些不熟悉知识点,当做笔记放这复习。 1. 估算方法对比 方法说明使用情景类比估算历史估算无详细信息,或者有类似项目,要少钱,要快参数估算数学模型有数据三点估算三角/贝塔分布更精确自下而上估算…

高并发系统设计:消息队列的三大作用:削峰填谷、异步处理、模块解耦

削去秒杀场景下的峰值写流量 而在秒杀场景下,高并发的写请求并不是持续的,也不是经常发生的,而只有在秒杀活动开始后的几秒或者十几秒时间内才会存在。为了应对这十几秒的瞬间写高峰,将秒杀请求暂存在消息队列中,然后…

Java曲线之削峰填谷,科学网—Lorenz曲线之削峰填谷 - 李宁的博文

我给黄小邪同学的置顶博文《中科院研究生入学考试的Lorenz曲线》(http://blog.sciencenet.cn/home.php?modspace&uid480705&doblog&id706263) 留言说:“建议模拟一个李小文老师所假设的双峰分布(其实可以做N峰分布,N大于等于2),…

并发编程之削峰填谷

背景 在系统的某个阶段,并发访问数(流量)会急剧膨胀,在瞬时时间内(1秒或数秒),达到一个临界点,许多系统往往在这个阶段奔溃而失去响应,比如商家促销活动进行秒杀,或618,双11等等。系统在其他时间业务压力往…