带你读《2022技术人的百宝黑皮书》——MNN 2.0 发布 ——移动端推理引擎到通用深度学习引擎(3) https://developer.aliyun.com/article/1248036?groupCode=taobaotech
预推理
MNN 在加载模型之后,会根据用户设定的输入形状,对模型中的算子做一遍预处理,降低算子种类,寻找最优计算策略,做资源分配。这个过程称为预推理。
预推理相比推理过程是轻量的,若用户设定的输入形状不变,预推理不需要重复执行,可以降低推理延时。
如上图所示,预推理主要包括如下步骤:
1.策略搜索:对核心算子,根据输入输出的大小,按预设的评估函数计算各类实现策略的成本,选择最优的计算策略。
2.资源分配:根据网络图的拓扑顺序,计算所需的最小资源分配方案,并进行资源申请。
3.几何计算:MNN 为了应对计算资源碎片化的问题所创造的新机制。在这一机制下,能够大大降低多算子,多后端情况下的实现成本,同时能够通过在线的算子融合提升模型性能。其核心思想是使用一个通用算子来描述内存映射关系,从而方便开发之使用基础算子组合成复杂算子,降低复杂算子的实现成本。在模型中的内存映射可以描述为张量平面的映射关系如下:
张量平面 在内存中的线性地址为:
,
因此可以使用offset和stride[]来描述内存张量平面;对于张量平面 内存映射 : ,当取张量维度为3时,映射关系为:
即可用三层嵌套循环实现该映射关系;
因此使用Region来描述张量平面,构造Raster算子来实现张量平面映射;实现了内存映射的元算子。在有了内存映射元算子后,im2col, transpose, concat, split等操作在后端中均可用Raster算子实现;conv3d,pool3d等也可以通过Raster与matmul,pool2d等组合实现,也不需要新增算子,可以大大降低实现的工作量。
同时因为使用了通用的映射表达各类内存映射关系,可以通过循环变换自动化寻找可融合算子,如:Permute(0, 2, 1) + Permute(1, 0, 2)可以自动化合并为Permute(2, 0, 1),减少冗余,提升性能。
带你读《2022技术人的百宝黑皮书》——MNN 2.0 发布 ——移动端推理引擎到通用深度学习引擎(5) https://developer.aliyun.com/article/1248034?groupCode=taobaotech