派大星 · 2020年11月10日

MNN 1.1.0发布:CUDA后端/ASR模型支持/ARM CPU和GPU性能再提升/MNN工作台

首发:NeuralTalk
作者:NeuralTalk

一、框架通用性

1.1 几何计算

几何计算是本次发布中大规模的框架重构。它将大部分算子的计算过程中与硬件后端无关部分(形状计算和几何计算)剥离出来,极大地降低了异构后端算子实现的成本。基于几何计算,MNN重写了目前所有的硬件后端。由于引入几何计算之后GPU后端算子的覆盖率的增加,在阿里巴巴内部的业务模型中,MNN GPU后端性能普遍获得约20%提升。

1.2 新增后端

基于几何计算机制,MNN新增了TensorRT和CUDA后端。目前已经支持常用CV模型与RNN模型。

1.3 ASR模型支持

除了业务应用广泛的CV模型,MNN在这次发布中添加了对基于Transformer结构的ASR模型的支持。这类模型结构要求推理引擎支持Control Flow、Dynamic Shape和Zero Shape等特性。MNN在框架层面对这些特性进行了支持和完善:
• 重构Control Flow支持方案,提供用户透明的functional control flow实现,并支持TF1.x的控制流模型转换
• 添加Dynamic Shape的支持,MNN将整图按照动态形状算子划分为多个分段子图。在代码层面,一个子图对应一个Module,Module支持嵌套,即整图被表达为一个由Module组成的调用树,树的叶子节点可以使用Session来执行,Session每次执行前Resize,重新进行形状推理和预分配内存
• Zero Shape指的是模型中某些Tensor的shape存在0值,比如 (1, 0, 256),这种情况大多是为了给while-loop中某些循环变量提供初始值而引入的。MNN在对形状推理和执行逻辑上对Zero Shape进行了支持。

二、模型压缩

新添模型压缩的仅权值量化(MNNConvert --weightQuantBits)。此功能仅对conv/matmul/LSTM的float32权值进行量化,仅优化模型大小,加载模型后会解码为float32,量化位宽可选2~8,运行速度和float32模型一致。经内部测试8bit时精度基本无损,模型大小减小4倍

三、性能优化

ARM后端

在今年5月,MNN在ARM CPU上的性能已立于业界前列(https://zhuanlan.zhihu.com/p/...)。在此之后,MNN持续投入ARM CPU性能优化,在各模型和芯片上又获得了10%~20%的性能提升。性能提升之路永无止境。

image.png

OpenCL后端

开启AutoTuning等一系列优化后,MNN在1.0.0的基础上,普遍有20%~100%的性能提升。具体性能数据如下:

image.png

x86后端

5月以来,MNN团队持续投入x86后端的优化,目前浮点单线程性能与行业标杆OpenVINO基本持平,部分情况 (Squeezenet v1.0) 超越。

image.png

四、框架易用性

Interpreter::setCacheFile API
由于OpenCL新增的AutoTuning机制、TensorRT后端初次推理的耗时较高,MNN在Interpreter上增加setCacheFile API,用于缓存GPU后端的编译优化之后的模型。用法如下:

    std::shared_ptr<MNN::Interpreter> net =        std::shared_ptr<MNN::Interpreter>(MNN::Interpreter::createFromFile(fileName));    if (nullptr == net) {        return 0;    }    // Must call it before createSession.    // If ".tempcache" file does not exist, Interpreter will go through the     // regular initialization procedure, after which the compiled model files     // will be written  to ".tempcache".    // If ".tempcache" file exists, the Interpreter will be created from the    // cache.    net->setCacheFile(".tempcache");        MNN::ScheduleConfig config;    // Creates the session after you've called setCacheFile.    MNN::Session* session = net->createSession(config);

五、Bugfixes

修正但不限于如下 Bug:

  1. SpaceToBatchND , BatchToSpaceND 支持 block size / padding 作为输入(支持在输入shape 未知情况下的 Tensorflow 空洞卷积)
  2. 修正 depthToSpace 和 spaceToDepth ,支持 pixelshuffle
  3. 修正 1x1 卷积对于 batch 较大,width / height 较小时,性能不好的问题
  4. 修正 Onnx 的 ConvTranspose output padding 支持问题
  5. 修正 Onnx 的 Resize 在某些输入个数下不支持的问题

六、One More Thing

MNN有自己的官网啦!官网上还可以下载MNN团队全新力作「MNN工作台」涵盖开箱即用模型、可视化训练等工具,更可以一键部署到多端设备

image.png

END
往期回顾


本作品采用知识共享署名-相同方式共享 4.0 通用许可协议进行许可。
欢迎关注公众号,关注模型压缩、低比特量化、移动端推理加速优化、部署。
嵌入式AI.jpg
更多嵌入式AI相关技术干货请关注嵌入式AI专栏。
3 阅读 531
推荐阅读
0 条评论
关注数
13841
内容数
251
嵌入式端AI,包括AI算法在推理框架Tengine,MNN,NCNN,PaddlePaddle及相关芯片上的实现。欢迎加入微信交流群,微信号:gg15319381845(备注:嵌入式)
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
Arm中国学堂公众号
关注Arm中国学堂
实时获取免费 Arm 教学资源信息
Arm中国招聘公众号
关注Arm中国招聘
实时获取 Arm 中国职位信息