[TOC]

概述

神经网络层类型 描述 CPU GPU DSP/AIP
批量归一化(Batch normalization) 批量标准化,然后进行缩放操作。批量归一化操作可以单独执行,也可以与缩放结合执行。 ✔ ✔ ✔
色彩空间转换 将输入图像颜色格式(编码类型)转换为 SNPE 原生颜色空间。颜色空间转换参数作为模型转换器工具的一个选项提供。 ✔ ✔ ✔
Concatenation 该层将多个输入连接成一个输出 ✔ ✔ ✔
回旋 计算过滤器条目和任意位置输入之间的点积 ✔ ✔ ✔
裁剪 将一层裁剪为参考层的尺寸 ✔ ✔ ✔
跨图归一化 这是 LRN 层中的一个选项 ✔ ✔ ✔
去卷积 Performs deconvolution operation ✔ ✔ ✔
深度卷积 执行 2D 深度卷积 ✔ ✔ ✔
Dropout Layer is used for training only. Converters remove this layer from DLC creation. NA NA NA
按元素 支持带系数的 SUM、PROD 和 MAX 模式 ✔ ✔ ✔
变平;变单调 将输入展平到图层 ✔ ✔ ✔
全连接 类似于卷积,但连接到完整的输入区域(即过滤器大小正好是输入体积的大小)

image-20210721191009126

深度学习模型到运行时工作流

深度学习框架(caffe、Tensorflow) ==> 训练数据、测试数据 ==> 模型构建和训练 ===> 训练出最优模型 ===> 模型测试 ===> 模型文件:静态权重和偏置 ===> 通过SNPE的模型转换工具 ===> 转换成SNPE模型(deep learning container 深度学习容器) ===> 量化工具 ===> 优化的神经网络模型 ===> SNPE嵌入式的APP ===> SNPE运行时 ===> SNPE应用

SNPE 主要使已经训练好的网络模型能够在 CPU、GPU 和 DSP 上运行并输出具有最佳执行时间的推理。训练网络模型是 OEM 的责任。

基本 SNPE 工作流程

神经网络模型转换

将网络模型转换为可由SNPE加载的DLC文件

可选择量化以在Hexagon DSP上运行

加载网络模型

实例化SNPE接口并加载DLC文件

选择所需的运行时间(例如 CPU、GPU、DSP、HTA)和其他离线 在线运行时选项

准备输入数据

为模型准备输入数据(例如,预处理以匹配模型输入数据层维度,为 DSP 量化输入数据)

运行网络模型

使用 SNPE 运行时执行模型,一次输入

转换网络模型

1、使用 snpe-深度学习网络框架-to-dlc 将网络模型转换为 DLC

使用 snpe-Caffe-to-dlc 转换基于 Caffe 的模型

使用 snpe-Caffe2-to-dlc 转换基于 Caffe2 的模型

使用 snpe-tensorflow-to-dlc 转换基于 TensorFlow 的模型

2、就像运行 Python 脚本一样简单

脚本的输入是原始训练框架格式的模型

输出是带有转换模型的 DLC 文件,可以直接传入 SNPE

image-20210721192645915

For additional details on conversion tools and syntax, refer to the SDK documentation in /snpe-/doc/html/tools.html

模型量化

我们使用的snpe-framework-to-dlc进行模型缓缓,默认输出是非量化模型。

所有网络参数都保留在原始模型中的 32 位浮点数

量化是将网络模型转换为最适合在 DSP 上运行的 8 位定点格式的过程

snpe-dlc-quantize 是离线工具,可将非量化 DLC 模型转换为 8 位量化 DLC 模型

量化方法:

权重、偏差和激活的静态量化,支持非对称动态范围和任意步长(类似于 TensorFlow 风格的量化)

仅支持量化定点算法的 SNPE 运行时需要量化模型(例如:DSP HTA)

转换和(可选)量化模型

image-20210721205932692

snpe--to-dlc ( = caffe/caffe2/tensorflow/onnx)

就像运行 Python 脚本一样简单

脚本的输入是原始训练框架格式的模型

模型转化的步骤:

脚本的输入是原始训练框架格式的模型

输出是带有转换模型的DLC文件,可以直接传入SNPE

snpe-dlc-quantize

将非量化 DLC 模型转换为 8 位量化 DLC 模型

权重、偏差和激活的量化,支持非对称动态范围和任意步长(类似于 TensorFlow 风格的量化)

定点 Snapdragon NPE 运行时(例如 DSP)需要量化模型

也可用于减少磁盘大小(可能会损失一些精度)

HTA 工具流程概述

模型分区

根据硬件平台选择量化模型还是非量化模型

CPU和GPU

GPU 和 CPU 始终使用浮点(非量化)网络参数

如果网络初始化时间是一个问题,建议对 GPU 和 CPU 使用非量化的 DLC 文件(默认)。因为CPU和GPU都是浮点数的运算,所以使用量化后的模型(定点计算)就会有反量化的过程。造成性能损失。

DLC 文件的量化确实会引入噪声,因为量化是有损的

DSP

DSP 总是使用量化的网络参数

支持在 DSP 上使用非量化 DLC 文件。

网络初始化时间将急剧增加。因为 SNPE 会自动量化网络参数以便在 DSP 上运行。

HTA

HTA 总是使用量化的网络参数

有关量化的其他详细信息,请参阅 /snpe- 中的 SDK 文档<版本>/doc/html/quantized_models.html

量化模型 – 离线 – Tensorflow 或 Caffe 模型

image-20210721213332996

image-20210721213547226

image-20210721213627690