作者:霞影(姜霄棠) 阿里大淘宝技术团队
MNN是一个轻量级的深度学习引擎,它通过独特的架构设计,结合各类性能优化的工作,解决了业务场景下深度学习部署的问题。近期MNN再次更新,迈向了端云一体化的通用深度学习框架,本文将对MNN2.0的相关技术做详细介绍。
MNN是全平台轻量级高性能深度学习引擎,核心解决深度神经网络模型在各类设备,尤其是移动设备/嵌入式设备的推理与训练问题。目前,MNN已经在淘宝、手猫、优酷、聚划算、UC、飞猪、千牛等30多个App中使用,广泛支持了阿里巴巴在计算机视觉、语音识别技术、自然语言处理等领域的70多个AI应用场景,包含淘宝搜索、拍立淘、淘宝直播、AR导购等,日调用量达十亿量级。基于MNN实现了首个端到端、通用型、规模化产业应用的端云协同机器学习系统——Walle,相关论文发表在系统领域顶级会议OSDI'22 上:https://arxiv.org/pdf/2002.12418.pdf
轻量级深度神经网络推理引擎MNN已开源,感兴趣的同学可以移步至项目体验:
https://github.com/alibaba/MNN
MNN的特点是轻量、通用、易用、高效:
MNN面临的技术挑战,如上图所示,主要是两个矛盾:
AI应用需要的复杂功能支持与受限制的程序体积之间的矛盾
AI应用需要的强大算力支撑与碎片化的计算资源之间的矛盾
为了应对性能与功能层面的挑战,MNN 设计了预推理与表达式两个核心模块:
MNN 在加载模型之后,会根据用户设定的输入形状,对模型中的算子做一遍预处理,降低算子种类,寻找最优计算策略,做资源分配。这个过程称为预推理。
预推理相比推理过程是轻量的,若用户设定的输入形状不变,预推理不需要重复执行,可以降低推理延时。
如上图所示,预推理主要包括如下步骤:
1)张量平面在内存中的线性地址为:,因此可以使用offset和stride[]来描述内存张量平面;
2)对于张量平面内存映射,当取张量维度为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),减少冗余,提升性能。
MNN 需要对接各种训练框架导出的模型格式,有如下特点:
框架 | 导出方式 | 导出成功率 | 算子数(不完全统计) | 冗余度 |
Caffe | Caffe | 高 | 52 | 低 |
Tensorflow | Pb - 1.x | 高 | 1566 | 高 |
Tflite | 中 | 141 | 低 | |
MLIR | 中 | |||
Pytorch | Onnx | 中 | 165 | 低 |
Torchscripts | 较高 | 566 | 高 | |
Torch PKL + Python | 高 |
为了抹平训练框架不同的差异,比较明确的做法就是定义MNN自己一套算子并实现前端,基于基于此对接各个训练框架。
这个MNN的前端就是表达式模块,对应的MNN模型转换流程优化如下:
由于 AI 模型的算子数逐渐丰富,推理引擎(或称张量计算引擎)与图像处理和数值计算正在趋同,如 Tensorflow 实现了 numpy 库,OpenCV 也通过 GAPI 的方式,将图像处理表示为计算图,由内置的张量计算引擎实现。
MNN 也基于表达式去实现了 Numpy 和 OpenCV 常用功能,详细见下文。
MNN可以分为主体(推理引擎)和工具两大部分。
1)主体:亦即推理引擎,负责AI模型(张量计算图)的加载与执行,可分为调度(预推理)与执行(推理)两层。
2)工具:
MNN 的架构设计可以降低性能优化的成本,但性能优化本身仍然是MNN中最艰难复杂的工作,需要深入理解模型结构、算子实现、硬件架构,分析模型运行中的计算冗余,并将其尽可能地压制。
深度学习推理中存在的计算冗余大致可分为以下几类:
结构冗余与精度冗余的压制一般需要离线工具辅助,MNN对应提供了图优化、模型压缩工具,在端上则提供了部分架构的低精度的计算支持。
为了适配SIMD优化,MNN通过权重矩阵稀疏化设计,训练合适的稀疏化分布,使权重矩阵呈现出“半结构化”稀疏的特性,而不是在行、列方向完全随机化稀疏,避免了向量vector用不满、数据复用低的弊端。如下图所示的BCSR(Block Compressed Sparse Row ) 格式:
图中白色代表的零元素,实际计算可以跳过,减少计算开销。
MNN实现了对稠密模型权重稀疏化训练的功能,导入MNN Python压缩工具包(mnncompress),设定mnncompress需要的参数,运行将原模型中权重部分数值稀疏化为0。需要注意的是稀疏化0元素的分布模式需要符合分块形态,才能最大化发挥加速性能。
在常规的CPU GPU中并没有稀疏指令支持,我们须用常规向量指令实现计算加速,在MNN中我们设计实现了稀疏算子,最大化提取复用代码、扩展差异化后端。并且稀疏化算子对用户无感知,无需增加认知成本。
在后端方面,为最大化向量并行加速,设计了灵活的“半结构化”分块大小,例如对于AVX2可以用float32 x 8 的分块大小,同时为ARM NEON和x86 AVX2/AVX512指令实现了多种稀疏后端内核汇编代码。
第一点,CV模型在ARM端获得3.16x-4.13x加速比(0.9稀疏度),跨机型、跨模型加速效果都比较显著,详见参考资料大图。
第二点,在实际业务模型中验证了业务精度指标,损失有限、可接受。
第三点,推理耗时随稀疏度增加线性下降,跨模型、cpu一致;在小米6上,稀疏分块1x4加速临界值优化到0.3,中高端机型甚至稀疏度0.1的时候可达临界值。
这几类冗余的压制往往是互相冲突的,需要计算方法与内存排布的精心设计与内核计算的深度调优,寻找一个平衡点。
深度学习的CV算子往往具有如下计算特性,在C方向上计算可并行,但需要读取HW方向相邻数据。为了充分利用SIMD加速能力,MNN设计了NC4HW4布局,以兼顾SIMD使用和内存访问连续的需求。
算法方面,MNN 采用Strassen算法加速矩阵乘法计算,Winograd算法加速卷积计算。
为了降低读写冗余,MNN 在CPU的汇编代码中做最大数目的循环展开,并手排指令减少相依数据依赖。
GPU则在内存、并发数、内核方面优化,在读写/并发冗余的压制上找到平衡点。
MNN 的预推理模块可以较好地降低调度冗余,我们把算子的执行拆分为onResize和onExecute两个部分,在预推理过程中执行onResize,在推理过程中执行onExecute,视各类GPU的API设计不同,可以不同程度地降低调度冗余。
MNN在针对端侧开发的特点,在具有高性能与轻量性的同时还具有针对算法人员非常友好的易用性。MNN提供的Python部分接口不仅具备MNN模型推理的基础能力,同时还提供了算法开发人员在前后处理中使用频率最高的基础库numpy与opencv的能力,用户在移动端仅使用MNN便可以完成全套算法的迁移与部署。
MNN的Python接口提供的能力如下:
其中MNN与MNN.expr为MNN的核心能力,MNN.numpy和MNN.opencv是基于MNN的核心能力进行的扩展功能,在用法上更加贴近算法常用库,在实现上复用MNN核心功能,低成本(200K内)大幅降低算法部署难度。
4.2 算法部署实例
使用以上能力可以将服务端代码便捷的迁移到移动端而不依赖其他Python库,代码如下:
import MNN
import MNN.cv as cv2
import MNN.numpy as np
def inference(model_path, img_path):
net = MNN.nn.load_module_from_file(model_path, ["data"], ["prob"])
image = cv2.imread(img_path)
image = image[..., ::-1]
image = cv2.resize(image, (224, 224))
image = image - (103.94, 116.78, 123.68)
image = image * (0.017, 0.017, 0.017)
image = image.astype(np.float32)
input_var = MNN.expr.convert(image, MNN.expr.NC4HW4)
output_var = net.forward(input_var)
output_var = MNN.expr.convert(output_var, MNN.expr.NHWC)
print("output belong to class: {}".format(np.argmax(output_var)))
在移动端能够仅使用MNN便可以无缝部署服务端的算法,Python化部署对于算法工程师具有非常高的易用性,同时还具有更好的动态性,方便算法的热更新,热修复等;降低了端侧算法部署门坎,提升了端侧算法部署的效率。
MNN 通过独特的架构设计,结合各类性能优化的工作,解决了业务场景下深度学习部署的问题。后续也将持续努力,优化架构,改良算法,不断降低算法工程师AI部署的门槛,持续为各类业务带来增量价值。
https://github.com/alibaba/MNN
https://arxiv.org/pdf/2002.12418.pdf
https://arxiv.org/abs/2205.14833
https://www.yuque.com/mnn/cn
https://mp.weixin.qq.com/s/vv2RZHcinKwPyq5_qzNxTg
https://mp.weixin.qq.com/s/mYphx3JKiOEGtWS-H9P7Dg
https://www.khronos.org/assets/uploads/developers/presentations/Alibaba-Xiaying_geometry_outside_Apr21.pdf
https://www.tensorflow.org/guide/tf_numpy
https://numpy.org/
https://docs.opencv.org/4.x/d0/d1e/gapi.html
https://www.tensorflow.org/xla
留言与评论(共有 0 条评论) “” |