MNN高效地移动端推理引擎

发布时间:2021-8-6 11:20:38   点击数:
中科白癜风公益惠民活动 https://baijiahao.baidu.com/s?id=1700353303318890248&wfr=spider&for=pc

MNN:AUniversalandEfficientInferenceEngine

AMNN简介

MNN的优势:

pre-inference管理运行时优化,优化使用在线cost评估和最优算法流程选择;

深度算子内核优化获得最优计算性能,使用了改进的算法和数据局部;

后端抽象模块,混合调度,引擎轻量

移动端推理框架有:TF-Lite,NCNN,CoreML(Apple),...

移动端推理框架的主要挑战有3方面:

1)模型兼容:TensorFlow,PyTorch,Caffe,CNTK,MXNet;模型兼容不同的格式和不同的算子。

2)设备多样:为了高性能,需要考虑不同的GPU,Mali,Adreno;不同的方案OpenCL,OpenGL,Vulkan

3)资源有限

好的移动端推理框架有2个属性:

可以处理模型兼容性和设备多样性;

用最小的内存和能耗有效地做模型推断

BMNN主要构成部分

MNN的主流程主要有2部分:离线转换和设备推理。

离线转换:converter先把输入模型转换成自己的模型格式.mnn;同时执行基础的计算图优化,比如operatorfusion,replacement,模型量化。

设备推理有3个模块:pre-inference,operator-leveloptimization,后端抽象.对每个算子,pre-infernce作代价评估,根据算子信息(比如,输入大小,内核大小)和后端特性(核心数量,硬件可用性),从方案池中动态决定最优计算方案。然后,算子优化使用算法和SIMD来提高性能。所有后端都单独执行,但有后端抽象模块提供统一的接口隐藏原始细节(比如,异构后端内存管理)。

CPre-Inference

Pre-inference:模型的输入大小通常都是固定的(或者是可以预处理成目标大小),内存管理和计算成本就可以在正式推断之前提前决定。因此,可以提前优化内存预分配和重用,来优化性能。Pre-inference可以分为:计算流程选择和preparation-execution解耦。

计算流程选择:成本评估可以表示为Ctotal=Calgorithm+Cbackend.

举例卷积运算来说,有2种算法:滑动窗口和Winograd。基于不同的卷积设置动态选择算法最小化计算成本。因此,最小化Calgorithm的最优计算流程可以用如下方法来确定:

?如果内核大小k=1,它只是一个矩阵乘法.那么就使用Strassen算法.

?如果内核大小k1,使用Winograd把卷积转换成矩阵乘法.Winograd卷积对不同的输出切片大小n,有不同的选择,计算成本可以表示为如下公式。根据这个公式可以选择最优输出切片大小n^来最小化计算成本C。

?如果n^等于1,使用滑动窗口;否则使用Winograd卷积。

卷积的计算成本评估就可以表示为:

那么下一个问题就是如何决定Cbackend。

通常就是把不同后端的所有算子的计算成本加起来,选择成本最小的后端。

如果GPU后端不支持某个算子,它就会在CPU上运行。算子在CPU或GPU上运行的计算成本就定义为:

MUL表示乘法的数量,表示一个算子的计算复杂度。FLOPS(FLoating-OperationsPerSecond)一个通用指标衡量CPU或GPU的计算功耗。GPU和CPU不同的一个地方是tschedule,是GPU准备指令缓存和指令描述的时间。对于特定后端,FLOPS和tschedule是已知常量。

CPU和GPU都使用FLOPS测量处理器性能。只有GPU有tschedule。

FLOPS:CPU可以使用每个核的最大主频,2线程就是2x10^9.对GPU需要通过实际运行情况去估计,比如运行次MobileNetv1网络就可以估计出来移动端GPU的FLOPS。

tschedule:这个依赖于所采用的API。对于OpenCL和OpenGL,通常是0.05ms。这是调用API的平均时间,比如clEnqueueNDRKernel。对于Vulkan,只需要提交

欢迎转载,转载请注明原文网址:http://www.hnqianxun.com/lszz/16801.html

------分隔线----------------------------