作者|舒会(玄裳)
出品|阿里巴巴新零售淘系技术部
关注「淘系技术」微信公众号,回复“MNN”即可获取两次直播完整版 PPT 及视频回放链接;
点击下方「阅读原文」获取 MNN 开源地址,欢迎大家 star 我们哦~
作者:舒会(玄裳)
MNN 项目核心负责人之一
阿里巴巴淘系技术高级技术专家
先后任职于美国 Amazon、Google
Google ML Kit Founding Members之一
引言
在
淘系专家带你初探端智能与MNN(上篇)里,我们探讨了端智能的特性,挑战以及趋势。端智能是Mobile First和AI First两条道路的交叉点,也是许多移动开发者跨界发展的出路。
在这篇文章里,我们会介绍一下手机淘宝中端智能的应用。然后会介绍一下手机淘宝端智能中提供核心基础设施的推理引擎MNN。顺带说一句,MNN团队中许多成员之前是做移动开发的。移动开发者向AI开发跨界,可以参考一下哦。
手机淘宝中端智能的应用
手机淘宝(手淘)里面的端智能应用比比皆是。从大家最常用的商品搜索框,到利用照相机视频流买东西的“拍立淘”,再到最近几年兴起的使用AR(增强现实)进行化妆品的试妆,到处都是端智能的应用。
个人认为,端智能在手淘中的应用方式,分为以下两类:
1、利用AI新技术,创造全新的交互方式。这种利用AI,打开一个新赛道的方式是最难的,也是最有回报的。这方面的例子是AR试妆(口红,染发等)。现在在手淘里,你可以进入雅诗兰黛的口红页面,点击“在线试妆”来玩AR技术预览口红的效果。见下图。
2、利用 AI 新技术,给已有的工作的流程提供新的增长点。这个所谓的增长点,可以是更加契合用户个人的特点,也可以是某些操作更加有效率,更加节省服务端的压力,或者更加隐私。当然,可以是以上的几点(个性化,时效性,省服务端算力,隐私性)结合起来。
- 个性化:千人千模。全局模型可以被用户的个人使用数据个性化定制。目前手淘首页的“猜你喜欢”页面的推荐内容,就是使用了用户的个人数据对全局推荐模型进行了定制,取得CTR的提升 (目前此功能在灰度实验中)。
- 时效性+省服务端的算力:以手机淘宝首页的信息流为例,手机端会向服务端请求展示的商品,服务端为回复一定数量的商品以及相应的排序,但是这个排序是可以被app内的用户行为实时改变的。这个所谓的“端上重排”就是手机端利用本地的信息,运行一个ML模型,快速做出决定,不用与服务端通信。端上重排根据用户的浏览信息重排商品,可以提高转化率。
- 隐私性:这方面比较火的是前几年由Google推出的Federated Learning。它可以在每个用户数据不离开手机的情况下,训练出一个描述所有用户的模型,同时有安全算法保证最终的全局模型无法逆向出原始的训练数据。Federated Learning还存在一些基本的研究挑战没有解决[1],所以手机淘宝还停留在尝试Federated Learning,并没有完全工业落地。
MNN介绍
MNN (Mobile Neural Network) 是阿里巴巴内部自己研发的推理引擎。在它研发之初,TFLite刚刚发布,而且由于TFLite最初版有诸多问题,为了快速响应业务的变化,阿里巴巴决定内部自研推理引擎MNN。MNN在2019年5月初在Github开源。开源至今,受益于阿里巴巴内部的用户和开源社区用户的反馈,MNN逐渐成长为一个优秀的、成熟稳定的推理引擎。目前,在阿里巴巴内部,MNN是端上推理引擎的事实标准。
MNN主要解决的是现在端智能的两大痛点:1. 底层的硬件、操作系统碎片化 (CPU、GPU、NPU, Android/iOS, Mobile/IOT) 2. 机器学习的框架复杂(TFLite,PyTorch, ONNX, etc.)。为了能够在不同的硬件、操作系统里发挥最好的功能,MNN会在运行时根据运行环境寻找出最快的算子实现算法(我们称这个过程为“半自动搜索”)。关于半自动搜索的技术细节,我们在第二次直播中有深度解答:
http://mudu.tv/watch/4397479。
目前端上的深度学习引擎有许多家(Google有TFLite,Facebook有PyTorch,苹果有CoreML,百度有PaddleLite,腾讯有NCNN,小米有MACE,阿里巴巴有MNN),MNN提供了什么特殊的价值呢?为什么用户要选用MNN而不是别的呢?
第一:MNN 的性能是领先于业界的。2019年9月的数据:Arm CPU上MNN 的单线程推理性能大约是TFlite的2~4倍;4线程推理性能大约是 TFLite 的10~20倍。(更多具体实验数据,我们在第二次直播给出:
)
第二:MNN 的大小有优势。它的静态库约为 TFLite 的66.7% (MNN + OpenCL backend: 1.2M + 334K; TFLite + NNApi backend: 2.3M)。
第三:MNN 支持多种异构设备。CPU方面,MNN 支持了X86,ArmV7, V8。GPU 方面,MNN 支持了 OpenCL, OpenGL, Vulkan, Metal。NPU方面,MNN 支持了华为的 NPU ,并用在手淘的拍立淘场景中。
第四:MNN 的算子支持程度已经得到大幅的加强。MNN 在2019年12月大约增加了200个 OP 。
▐ MNN 的主要模块
MNN 的主要模块有:模型转换,模型量化工具和推理引擎本身。
► 模型转换
模型转换器如下图:
目前,MNN还没有支持从头开始训练一个模型的能力。也就是说,用户必须事先用其他的训练框架比如Tensorflow, PyTorch把模型训练好,然后再转换为MNN的模型格式,最终部署到端上。
它主要的工作流程是,先解析“源头”格式的模型(Caffe、TF、ONNX),进行一些与硬件无关的优化,例如图优化、算子融合、算子替换、布局调整等。得到初步优化的图之后,转换为MNN自己的格式。MNN的模型格式是一个自定义Schema的flatbuffer格式 [2]。
► 量化工具
模型转换好之后,可以使用 MNN 的量化工具对模型进行压缩。目前,MNN支持 post-training quantization(无训练量化)。后续 MNN 会支持 quantization-aware training(带训练量化),以获得更好的准确率和更低比特的压缩。
模型的量化工具如下图:
MNN的量化方案是自己实现的,它目前有ADMM和KL散度两种方案。也就是说,“源头”的预训练好的模型需要是浮点的。ADMM量化方案,是MNN根据达摩院的Paper “Extremely Low Bit Neural Network: Squeeze the Last Bit Out with ADMM” [3] 实现的。它与KL散度的区别在于:ADMM是基于数学优化的方法,只需要几十个数据点即可,但是计算较慢。而KL散度是基于概率统计的方法,需要较多的数据(500到1000个数据点),计算较快。实际操作上来说,对特征的量化,ADMM和KL散度没有巨大的差距;对权重的量化,推荐使用ADMM。
▐ MNN 未来展望
对于未来的发展,我们主要立足于两点来看:第一,解决现有问题;第二,把握未来的趋势,面向未来做技术布局。
解决现有问题方面:
MNN 的易用性还不够。这方面,我们会有一整套的易用性提升:开箱即用的工具箱;文档补齐;Demo 示例;预编译包等… 这些易用性提升的改变,我们预计在今年春节之前发布。
训练:很多时候,要获得一个用于某个应用场景的模型其实很简单:拿 MobileNet 做一下迁移学习,就可以达到很好的效果。MNN 未来会加入训练模型的能力,让这种迁移学习的场景可以直接通过 MNN 的 API 或者工具达成。
面向未来的技术布局方面:
MNN + NPU:NPU的运行速度快了 CPU 好几倍,而且能耗有优势。是未来的主流。而且在可预见的未来,NPU的碎片化比较严重。MNN目前支持了华为的海思NPU,以后会支持更多的 NPU ,并且会提供一个统一的 API ,降低碎片化。
MNN 小程序:小程序平台降低了外部客户把他们的软件写入手淘的门槛。以后,手淘里面的端智能能力,可以通过小程序透出给外部开发者,使用简单,功能强大。今年的双11,modiface 与我们合作,通过小程序使用 MNN ,巨大提升了运行速度(相比于 TFJS ),降低了内存使用。未来,更多的外部客户可以在他们的小程序里调用 MNN ,简单、高效地将机器学习带到小程序里。
模型压缩:前文也提到了 NLP 应用是未来的一大趋势。而 NLP 的模型普遍大于 CV 模型。在这个时候,大幅度地压缩模型,能够让之前只能在服务器运行的模型放到端上运行。所以未来的 MNN ,会提供更好的模型压缩。
结语
坊间传言,许多人在众多推理引擎中选择 MNN 的原因是它快。而 MNN 并没有那么易用。这些用户为了能够使用 MNN 将他们的模型部署到 app 中所做的事情,可谓翻山越岭。
2020年,我们希望 MNN 与用户们一起成长,能够真正成为好用、高效的机器学习引擎,帮助开发者把端智能玩进自己的 app 中。
References
[1]
https://en.wikipedia.org/wiki/Federated_learning#Technical_limitations[2]
https://github.com/alibaba/MNN/blob/master/schema/default/MNN.fbs[3]
https://arxiv.org/abs/1707.0987We are hiring
淘宝基础平台部-端智能团队欢迎移动端计算优化工程师和推理引擎架构师的加入。对新技术感兴趣,善于创新突破,渴望用新技术给用户带来创新体验的同学请联系我们。
简历投递至吕行:[email protected]