作者:十岁的小男孩

QQ:929994365

无用

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

  本文是mace学习的第二步,如何撰写Yaml文件,将pb模型部署到该文件中进行编译。若环境尚未搭建完毕的同学请看第一篇环境搭建,编译出的库在安卓中如何使用请浏览第三步即mace工程化。

MACE(1)-----环境搭建:https://www.cnblogs.com/missidiot/p/9480033.html

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

小米官方文档编写部署文件:https://mace.readthedocs.io/en/latest/user_guide/basic_usage.html

目录

  准备模型文件

  创建部署文件

  高级用法

1.准备模型文件

  说明:本文只关注TensorFlow平台。

  准备好预先训练的TensorFlow model.pb文件。使用图形转换工具 优化模型以进行推理。此工具将通过进行多个优化来提高推理效率,例如操作员折叠,冗余节点删除等。我们强烈建议MACE用户在构建之前使用它。

# CPU/GPU:
./transform_graph \
--in_graph=/path/to/your/tf_model.pb \
--out_graph=/path/to/your/output/tf_model_opt.pb \
--inputs='input node name' \
--outputs='output node name' \
--transforms='strip_unused_nodes(type=float, shape="1,64,64,3")
strip_unused_nodes(type=float, shape="1,64,64,3")
remove_nodes(op=Identity, op=CheckNumerics)
fold_constants(ignore_errors=true)
flatten_atrous_conv
fold_batch_norms
fold_old_batch_norms
remove_control_dependencies
strip_unused_nodes
sort_by_execution_order'

注:(尚未搞清楚,以下文件的如何用)

2. 创建部署文件(model.yaml)

  转换模型或构建库时,MACE需要读取YAML文件,此文件称为模型部署文件。模型部署文件包含模型和构建选项的所有信息。构建过程包括解析模型部署文件,转换模型,构建MACE核心库以及打包生成的模型库。

  一个部署文件将正常生成一个库,但如果指定了多个ABI,则将为每个ABI生成一个库。部署文件还可以包含多个模型。例如,AI相机应用程序可以包含面部识别,对象识别和语音识别模型,所有这些都可以在一个部署文件中定义。

  下例为mace官方提供的例子:

# The name of library
library_name: mobilenet
target_abis: [arm64-v8a]
model_graph_format: file
model_data_format: file
models:
mobilenet_v1: # model tag, which will be used in model loading and must be specific.
platform: tensorflow
# path to your tensorflow model's pb file. Support local path, http:// and https://
model_file_path: https://cnbj1.fds.api.xiaomi.com/mace/miai-models/mobilenet-v1/mobilenet-v1-1.0.pb
# sha256_checksum of your model's pb file.
# use this command to get the sha256_checksum: sha256sum path/to/your/pb/file
model_sha256_checksum: 71b10f540ece33c49a7b51f5d4095fc9bd78ce46ebf0300487b2ee23d71294e6
# define your model's interface
# if there multiple inputs or outputs, write like blow:
# subgraphs:
# - input_tensors:
# - input0
# - input1
# input_shapes:
# - 1,224,224,3
# - 1,224,224,3
# output_tensors:
# - output0
# - output1
# output_shapes:
# - 1,1001
# - 1,1001
subgraphs:
- input_tensors:
- input
input_shapes:
- 1,224,224,3
output_tensors:
- MobilenetV1/Predictions/Reshape_1
output_shapes:
- 1,1001
  # cpu, gpu or cpu+gpu
   runtime: cpu+gpu
  winograd: 0

Command:

# Get device's soc info.(尚未搞清楚在哪用)
adb shell getprop | grep platform # command for generating sha256_sum,获取检测码,路径指向pb文件目录(直接在终端下使用)
sha256sum /path/to/your/file 

配置:

注:[option]为可选的,在部署文件中可选。

3. 高级用法

3.1 将模型转换成C++代码

  1. 更改部署文件

    如果要保护模型,可以将模型转换为C ++代码。还有两种情况:

    1.1 将模型图转换为代码并使用以下模型配置将权重建模到文件。

model_graph_format: code
model_data_format: file

    将模型图和模型权重转换为具有以下模型配置的代码。

model_graph_format: code
model_data_format: code

    以上两步当model_graph_format: code时候后期会生成mace_engine_factory.h文件,后期遇到再解释(未完成,尚未知其用途)

    1.2 另一种模型保护方法obfuscate用于混淆模型运算符的名称。(未知)

  2. 将模型转换为代码

python tools/converter.py convert --config=/path/to/model_deployment_file.yml

  该命令将在builds / $ {library_name} / model目录中生成$ {library_name} .a,在builds / $ {library_name} / include生成 ** .h *,如下面的dir-tree。   

# model_graph_format: code
# model_data_format: file builds
├── include
│ └── mace
│ └── public
│ ├── mace_engine_factory.h
│ └── mobilenet_v1.h
└── model
├── mobilenet-v1.a
└── mobilenet_v1.data # model_graph_format: code
# model_data_format: code builds
├── include
│ └── mace
│ └── public
│ ├── mace_engine_factory.h
│ └── mobilenet_v1.h
└── model
└── mobilenet-v1.a

  3. 部署

    libmace.a$ {library_name} .a链接到您的目标。

    参阅mace/examples/example.cc完整用法。以下列出了关键步骤。

// Include the headers
#include "mace/public/mace.h"
#include "mace/public/mace_runtime.h"
// If the model_graph_format is code
#include "mace/public/${model_name}.h"
#include "mace/public/mace_engine_factory.h" // ... Same with the code in basic usage // 4. Create MaceEngine instance
std::shared_ptr<mace::MaceEngine> engine;
MaceStatus create_engine_status;
// Create Engine from compiled code
create_engine_status =
CreateMaceEngineFromCode(model_name.c_str(),
model_data_file, // empty string if model_data_format is code
input_names,
output_names,
device_type,
&engine);
if (create_engine_status != MaceStatus::MACE_SUCCESS) {
// Report error
} // ... Same with the code in basic usage

3.2 调整特点的SoC的GPU内核(尚未搞清楚干啥)

  如果您想使用特定设备的GPU,您只需target_socs在YAML文件中指定,然后为其调整MACE lib(OpenCL内核),这可能会提高1~10%的性能。

  1.更改模型部署文件(.yml)

  指定target_socs模型中的部署文件(.yml):

target_socs: [sdm845]
注意:获取设备的soc信息:adb shell getprop | grep平台

  2.转换模型

python tools/converter.py convert --config=/path/to/model_deployment_file.yml

  3.调整

  tools / converter.py将启用GPU内核的自动调整。这通常需要一些时间才能完成,具体取决于模型的复杂程度。

python tools/converter.py run --config=/path/to/model_deployment_file.yml --validate

  该命令将在builds / $ {library_name} / opencl中生成两个文件,如下面的dir-tree。

builds
└── mobilenet-v2
├── model
│ ├── mobilenet_v2.data
│ └── mobilenet_v2.pb
└── opencl
└── arm64-v8a
├── moblinet-v2_compiled_opencl_kernel.MiNote3.sdm660.bin
└── moblinet-v2_tuned_opencl_parameter.MiNote3.sdm660.bin

  mobilenet-v2-gpu_compiled_opencl_kernel.MI6.msm8998.bin代表用于模型的OpenCL二进制文件,可以加速初始化阶段。详情请参阅OpenCL规范

  mobilenet-v2-tuned_opencl_parameter.MI6.msm8998.bin代表SoC的调整OpenCL参数。

4.部署

  更改上面生成的文件名称以防止发生冲突,并将它们推送到您自己设备的目录中

  使用与前面的过程类似,下面列出了不同的关键步骤。

// Include the headers
#include "mace/public/mace.h"
#include "mace/public/mace_runtime.h" // 0. Set pre-compiled OpenCL binary program file paths and OpenCL parameters file path when available
if (device_type == DeviceType::GPU) {
mace::SetOpenCLBinaryPaths(path/to/opencl_binary_paths);
mace::SetOpenCLParameterPath(path/to/opencl_parameter_file);
} // ... Same with the code in basic usage.

MACE(2)-----模型编译的更多相关文章

  1. TVM将深度学习模型编译为WebGL

    使用TVM将深度学习模型编译为WebGL TVM带有全新的OpenGL / WebGL后端! OpenGL / WebGL后端 TVM已经瞄准了涵盖各种平台的大量后端:CPU,GPU,移动设备等.这次 ...

  2. Win 10环境下6sV2.1模型编译心得

    最新版本6sV2.1模型是通过FORTRAN95编写的,2017年11月代码编写完成,2018年11月发布在模型官网上.通常我们在使用过程中都是调用模型的.exe可执行文件,而下载下来的是FORTRA ...

  3. mace

    作者:十岁的小男孩 QQ:929994365 心之安处即是吾乡. 本文主要的方向是终端移植.其主要又分两个小方向,理论和实践,即模型优化和模型移植.下文为前期写的,较为潦草,现在基本框架思路已经搭起来 ...

  4. MACE(3)-----工程化

    作者:十岁的小男孩 QQ:929994365 能下者,上. 前言 本文是MACE的第三步即MACE环境编译出来的库在Android工程中的使用.在第一篇博文中通过mace官方提供的安卓工程进行调试,本 ...

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

    作者:十岁的小男孩 QQ:929994365 无为 本文仅用于学习研究,非商业用途,欢迎大家指出错误一起学习,文章内容翻译自 MACE 官方手册,记录本人阅读与开发过程,力求不失原意,但推荐阅读原文. ...

  6. keras channels_last、preprocess_input、全连接层Dense、SGD优化器、模型及编译

    channels_last 和 channels_first keras中 channels_last 和 channels_first 用来设定数据的维度顺序(image_data_format). ...

  7. 有关基于模型的设计(MBD)一些概念和理解(zz)

    http://www.matlabsky.com/thread-38774-1-1.html 本文转载于MathWorks中国高级工程师董淑成的帖子内容.为了方便阅读,对原文进行了重新整理编辑. 之前 ...

  8. TensorFlow从1到2(七)线性回归模型预测汽车油耗以及训练过程优化

    线性回归模型 "回归"这个词,既是Regression算法的名称,也代表了不同的计算结果.当然结果也是由算法决定的. 不同于前面讲过的多个分类算法或者逻辑回归,线性回归模型的结果是 ...

  9. Keras序列模型学习

    转自:https://keras.io/zh/getting-started/sequential-model-guide/ 1.顺序模型是多个网络层的线性堆叠. 你可以通过将网络层实例的列表传递给  ...

随机推荐

  1. 枚举 enum 成员变量初始化

    typedef enum { A1, A2, A3, A4 = , A_END }A; 如果A1赋值为5,则下列依次递增1,即A2等于6,A3等于7: 由于A4赋值为10,所以A_END等于11 如果 ...

  2. logistic regression浅析

    最近开始学习机器学习的相关理论知识,准备把自己的整个学习心得整理汇集成博客,一来可以督促自己,二来可以整理思路,对问题有一个更加透彻的理解,三来也可以放在网上和大家分享讨论,促进交流. 由于这次的学习 ...

  3. 基于 Dojo toolkit 实现 web2.0 的 MVC 模式

    前言 MVC 模式是设计模式中的经典模式,它可以有效的分离数据层,展示层,和业务逻辑层.Web2.0 技术由于其良好的用户体验被广泛应用于 WEB 应用的展示层.但是在传统的 web 开发中,展示层的 ...

  4. excel自动化翻译2

    Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...

  5. 多线程ExecutorService中submit和execute区别

    submit和execute都是 ExecutorService 的方法,都是添加线程到线程池中. 区别 三个区别: 1.接收的参数不一样 2.submit有返回值,而execute没有 Method ...

  6. Java编程思想 学习笔记3

    三.操作符 1.优先级 当一个表达式中存在多个操作符时,操作符的优先级就决定了各部分的计算顺序.程序员常常忘记其他优先级规则,所以应该用括号明确规定计算顺序. 当编译器观察到一个String后面紧跟着 ...

  7. NTT模板

    NTT(快速数论变换)用到的各种素数及原根: https://blog.csdn.net/hnust_xx/article/details/76572828 NTT多项式乘法模板 #include&l ...

  8. Docker部署Consul集群

    服务介绍 Consul是一种分布式.高可用.支持水平扩展的服务注册与发现工具.包含的特性有:服务发现.健康检查.键值存储.多数据中心和服务管理页面等. 官方架构设计图: 图中包含两个Consul数据中 ...

  9. Git与GitHub学习笔记(四)合并远程分支

    在这里的前提: 1.你已经fork 源作者的项目到你自己的仓库了 2.git clone 自己仓库fork的项目,注意地址,这里是自己的账号下的地址,而不是源作者的项目地址哦 3.在本地修改代码,gi ...

  10. C# Dictionary序列化/反序列化

    [Serializable] public class SerializableDictionary<TKey, TValue> : Dictionary<TKey, TValue& ...