小米开源框架MACE - 源码阅读笔记一

article/2025/9/15 17:14:34

首先先一目了然看一下其目录结构(这些个源码可以在github上下载到,只要在GitHub搜索mace即可):

介绍

MACE(Mobile AI Compute Engine)是一个针对移动异构计算平台优化的深度学习推理框架。MACE提供工具和文档,帮助用户将深度学习模型部署到移动电话、平板电脑、个人电脑和物联网设备上。

架构

下图显示了整个体系结构

MACE模型

MACE定义了与Caffe2类似的自定义模型格式。MACE模型能够转换TensorFlow、Caffe或ONNX的导出模型。

MACE解释器

Mace解释器主要对NN图进行解析,并对图中的张量进行管理。

运行时

CPU/GPU/DSP运行时对应于不同设备的操作。

工作流程

下图显示了MACE的基本工作流程。

  • 配置模型部署文件

         模型部署配置文件(.yml)描述了模型和库的信息,MACE将基于该文件构建库。

  • 生成库

       建立MACE动态或静态库。

  • 转换模型

        将TensorFlow、Caffe或ONNX模型转换为MACE模型。

  • 部署

        将MACE库集成到应用程序中,并使用MACE API运行。

  • 运行(CLI)

       MACE提供了MACE_run命令行工具,可用于运行模型,并根据最初的TensorFlow或Caffe结果验证模型的正确性。

  • 基准

       MACE提供了基准测试工具来获取模型的操作级分析结果。

浏览一下源码

docker文件夹是几个与docker安装相关的文件。docs文件夹是一些文档,与代码关系不大。third_partytools文件夹是需要用到的一些第三方模块和代码构建、测试所用到的相关脚本。其中tools/converter.py是构建代码的顶层脚本。

mace/public/mace.h

enum DeviceType { CPU = 0, GPU = 2, HEXAGON = 3, HTA = 4, APU = 5 };enum class DataFormat {NONE = 0, NHWC = 1, NCHW = 2,HWOI = 100, OIHW = 101, HWIO = 102, OHWI = 103,AUTO = 1000,
};enum GPUPerfHint {PERF_DEFAULT = 0,PERF_LOW = 1,PERF_NORMAL = 2,PERF_HIGH = 3
};enum GPUPriorityHint {PRIORITY_DEFAULT = 0,PRIORITY_LOW = 1,PRIORITY_NORMAL = 2,PRIORITY_HIGH = 3
};

mace.h文件中定义了三个主要类:RunMetadataMaceTensorMaceEngine.

RunMetadata:定义了一个public类型的变量 op_stats,类型为vector <OperatorStats>
MaceTensor: 定义了 MACE 输入输出 tensor,有几个不同形式的构造函数
MaceEngine: 作为 MACE 框架引擎,根据构造函数传入的DeviceType执行相应的功能代码
// MACE input/output tensor
class MACE_API MaceTensor {friend class MaceEngine;public:// shape - the shape of the tensor, with size n, if shape is unknown// in advance, it should be specified large enough to hold tensor of all// possible size.// data - the buffer of the tensor, must not be null with size equals//        shape[0] * shape[1] * ... * shape[n-1].//        If you want to pass a buffer which is unsuitable to use the default//        shared_ptr deleter (for example, the buffer is not dynamically//        allocated by C++, e.g. a C buffer), you can set customized deleter//        of shared_ptr and manage the life cycle of the buffer by yourself.//        For example, std::shared_ptr<float>(raw_buffer, [](float *){});MaceTensor(const std::vector<int64_t> &shape,std::shared_ptr<void> data,const DataFormat format = DataFormat::NHWC);MaceTensor();MaceTensor(const MaceTensor &other);MaceTensor(const MaceTensor &&other);MaceTensor &operator=(const MaceTensor &other);MaceTensor &operator=(const MaceTensor &&other);~MaceTensor();// shape will be updated to the actual output shape after running.const std::vector<int64_t> &shape() const;const std::shared_ptr<float> data() const;std::shared_ptr<float> data();template <typename T>const std::shared_ptr<T> data() const {return std::static_pointer_cast<T>(raw_data());}template <typename T>std::shared_ptr<T> data() {return std::static_pointer_cast<T>(raw_mutable_data());}DataFormat data_format() const;private:std::shared_ptr<void> raw_data() const;std::shared_ptr<void> raw_mutable_data();private:class Impl;std::unique_ptr<Impl> impl_;
};
class MACE_API MaceEngine {public:explicit MaceEngine(const MaceEngineConfig &config);~MaceEngine();MaceStatus Init(const NetDef *net_def,const std::vector<std::string> &input_nodes,const std::vector<std::string> &output_nodes,const unsigned char *model_data);MaceStatus Init(const NetDef *net_def,const std::vector<std::string> &input_nodes,const std::vector<std::string> &output_nodes,const std::string &model_data_file);MaceStatus Run(const std::map<std::string, MaceTensor> &inputs,std::map<std::string, MaceTensor> *outputs);MaceStatus Run(const std::map<std::string, MaceTensor> &inputs,std::map<std::string, MaceTensor> *outputs,RunMetadata *run_metadata);private:class Impl;std::unique_ptr<Impl> impl_;MaceEngine(const MaceEngine &) = delete;MaceEngine &operator=(const MaceEngine &) = delete;
};

 


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

相关文章

MACE的环境搭建和工程构建

1. MACE 主页 MACE 的github地址&#xff1a;https://github.com/XiaoMi/mace 小米官方的相关文档&#xff1a;https://mace.readthedocs.io/en/latest/ 对开发环境的要求&#xff0c;可以按照以下指令安装相关的包&#xff1a; 2. 安装docker 参照教程&#xff1a;https:/…

meterpreter之timestomp命令修改文件MACE时间

文章目录 前言一、timestomp的使用前提二、MACE时间1、文件系统简述2、linux操作系统3、windows操作系统 三、timestomp使用详解1.查看帮助文档2.使用-v选项查看文件信息3.使用-f选项拷贝文件MACE时间4.使用-m/-a/-c/-e修改文件MACE时间5.使用-b/-r使MACE时间显示清空 总结 前言…

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

目录 简介 环境要求 1 安装 Bazel 2 安装Android NDK 3 在Ubuntu16.04下安装Docker&#xff08;17.09&#xff09; 构建并运行示例模型 1 拉取MACE项目 2 拉取MACE Model Zoo项目 3 构建通用MACE库 4 将预先训练的mobilenet-v2模型转换为MACE格式模型 编译运行DEMO…

使用MACE加速---使用篇

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

小米AI推理框架MACE介绍

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

MACE 使用笔记

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

小米开源框架MACE 简介

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

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

学习MACE也有一个月了&#xff0c;将其划分三步来学习。本文是MACE学习的第一步即MACE环境的搭建。之后还有两步mace的编译和mace工程化。 MACE(2)-----模型编译&#xff1a;https://www.cnblogs.com/missidiot/p/9509831.html MACE(3)-----工程化&#xff1a;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的版本

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

Eclipse各版本有什么区别?

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

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

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

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

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

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

Could not create the Java Virtual Machine&#xff0c;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版本问题方法&#xff1a; 在eclipse安装pydev插件时&#xff0c;会遇见安装后在“Preference”不显示“pydev”现象&#xff0c;原因&#xff1a;下载的pydev版本与eclipse版本不匹配&#xff0c;导致无法使用&#xff0c;经过反复调试&#xff0c;发现官…

Eclipse版本升级(2020-12)

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

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

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

Eclipse版本号及各个版本区别

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

如何更新Eclipse版本

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