淘宝端智能演进和思考


今天分享内容包括三部分,第一是端智能整体趋势和淘宝应用现状,第二是淘宝在应用端智能过程中面临的问题和挑战,以及我们的应对和解决思路,我们构建了端到端的完整技术体系,第三是开源推理引擎 MNN 的最新情况。

01、端智能趋势和现状

端智能简单说就是在端侧做机器学习或者深度学习模型的推理运行及上层应用。端智能相比云端智能具有低延时,保护数据隐私,节省云端计算资源等优势。其实大家在日常生活中已经用到了很多端智能应用,比如手机上拍照的 AI 摄像,人脸解锁 FaceID ,以及短视频 App 中各种 AR 特效等。

那么,为什么会出现端智能,以及他底层演化逻辑是什么?首先这两年有一个明显趋势就是深度学习从实验室往产业落地方向演进,海量终端设备成为落地最佳载体,手机是覆盖用户最多的设备,很容易做到规模化应用。除了这个大的趋势,我们觉得影响端智能演进还有三个关键要素,分别是算力、算法和场景。



算力:手机的算力不断增长,每年 CPU/GPU 性能也有非常大的提升, NPU 更是已经成为标配,并且有数量级上性能提升。

算法:模型压缩技术不断成熟,其中量化已经非常成熟,基本可以实现不降低精度的情况下将模型缩小为 1/4 甚至更小,另外小模型的架构设计也越来越成熟,面向移动端的各种网络模型不断出现,面向移动终端有限资源的算法模型设计也逐步成熟。

场景:就手机本身来说,AI 成为手机的热点和卖点,像 AI 摄像,人脸解锁等已经成为手机的基础功能。从 App 应用场景来说,近来刷爆我们朋友圈的应用都是跟 AI 相关的,有 Face App ,垃圾分类识别,以及 Zao App 。目前有些软件更多的是使用云端 AI 能力,需要把人脸照片上传至服务端做换脸,容易出现数据隐私问题。如果用端 AI 来做,不用上传你人脸图片,很自然解决数据隐私问题,只是现在端上算力不够,做不到这样的应用。



我们可以预期的是,随着算力的增强,算法的成熟,基于端智能也会出现越来越多有趣、好玩的一些创新应用。

现在集团里越来越多的 APP 开始应用端智能,拿手淘来说,端智能已经成为我们的核心基础能力,助力业务发展的创新和突破。在阿里巴巴有 20 个以上的 APP 在使用端智能,拿手淘来说,我们已经上线了 10+个场景,有 25+ 个模型在跑,每天运行次数超过 500 亿次,在手淘搜索推荐等重要场景也在使用端智能做更加精准搜索推荐,今年双 11 也会大规模使用。

02、淘宝端智能体系建设

我们做了这么多应用,那在应用过程中到底碰到了哪些问题和挑战?



首先从 APP 使用端智能整个链路上面看,一般都会有数据采集,做数据清洗或者数据标注,然后做算法模型设计,接着在服务端模型训练,之后进行模型压缩和转化,其次在部署端上面做推理,最后产品落地去使用。整个链路较长,涉及云端和客户端,以及需要算法工程师和移动开发工程师配合才能完成相关应用落地。



我觉得端智能应用有三个大的挑战,第一:整体链路比较长,而且其中每个节点出现问题都会阻碍端智能应用落地,特别像 17 年算法模型在端侧推理部署运行成为瓶颈,所以我们开发 MNN 去解决这个问题。第二:算法和工程协同,需要算法工程师和移动工程师通力合作,但是两者存在天然的 gap 需要互相协同配合。第三:端侧环境复杂,碎片化的设备,系统,各种兼容性问题。针对这些问题,我们构建一套端到端的全链路部署方案,下面具体展开讲解。



这是我们的技术大图,主要有三部分组成:

  • 客户端引擎 & 框架 包括机器学习算法库,深度学习推理引擎 MNN,算法快速迭代的 Python VM 容器,以及上层的算法能力集合和行业解决方案。
  • 离线配套工具 包括模型转换,模型压缩工具,以及配套的性能测试,调试工具等。
  • 云端平台 包括模型转换和压缩服务,以及模型管理,部署,运维监控的各种系统。

下面将会具体展开讲解推理引擎,开箱即用算法集,行业解决方案三块内容。



首先来看下推理引擎 MNN 的技术挑战,第一碎片化,网络模型,训练框架,终端设备都是碎片化的。第二资源受限,终端设备不像服务端,他的内存,算力比较有限。第三高性能,像人脸检测等实时性要求比较高,所以在资源受限情况下还需要做到高性能,这也是巨大的挑战。



推理引擎,就是找到一种方案实现不同模型在不同设备上最高效的运行。这里有三种不同设计思路。

一种是类似 TVM 的自动化搜索方案,考虑模型的特征,比如卷积核大小,考虑部署设备的硬件特效,比如内存,算力,然后结合两者找到一种最高效的运行方式。这种方式性能高,但成本也高,因为需要离线为每一种设备做遍历调优,找到最高效的运行方式,比如手淘覆盖的手机比较多,所以成本非常高。

第二种方式是纯手工优化,主要是针对特定的卷积核大小做优化,比如 3x3 卷积,所以专门优化的网络模型性能比较好,没优化过的性能会差一些,另外未考虑硬件特性,所以整体性能一般,成本也较高,因为需要遍历情况比较多。

第三种方式就是我们 MNN 采用的方案,我自己叫半动搜索优化,通过 NC4HW4 内存布局将不同卷积核做对齐做统一矩阵计算优化,再根据硬件特性调度做选择最优方式运行,我们现在更多是基于规则,后续演化考虑做在线调优。整体来说性能比较好,成本也比较低。



这是 MNN 整体架构图,左边离线部分包含模型转换和模型压缩,将各种训练框架模型转换成 MNN 的模型;右边是线推理部分,MNN 目前支持 CPU,以及 GPU 对应的 OpenCL,Vulkan 等 backend 。

以图上为例, Pixel 2 手机支持 CPU ARM 和 Vulkan backend ,小米 6 支持 CPU ARM,OpenCL , Vulkan backend ,Mate20 支持 ARM82 架构的 CPU backend,以及 OpenCL , Vulkan backend 。

在预推理环节,我们根据模型结构信息,以及设备的硬件信息 找到一种最快运行方式。比如 Pixel 2 上使用 CPU 和 Vulkan 运行,小米 6 使用 CPU 和 OpenCL 运行,Mate 20 上使用 ARM82 指令和 OpenCL 运行。这是粗粒度的 CPU 和 GPU 运行方式选择,更细一点比如同样 CPU 运行,我们有 winogrand,strassion 矩阵计算算法会根据模型和硬件特性选择不同分块,这样实现最快运行。



MNN 很早基于 iDST 量化算法支持了模型压缩能力,但是之前的量化工具的产品化做的不是特别好,过去几个月我们重点优化了量化工具,尽量做到简单易用。目前无训练的量化工具我们已经发布,一行命令就可以简单实现量化,精度下降 1% 以内,文件大小减少到原来的 1/4 ,推理速度提升 30~70% 。另外,我们正在研发带训练能力的量化方案,这里实现跟业界方案不太不一样,我们为了解决碎片化的训练框架的问题,现在是直接在 MNN 上添加训练能力,这样可以使用 MNN 模型做 Finetune 训练。



前面介绍了推理引擎 MNN ,主要解决算法模型端侧运行问题。但是移动开发对算法模型其实不是很懂,以人脸为例,他更希望有个人脸 API 给我调用一下使用,所以我们做了开箱即用算法集合,里面有人脸,人体姿态,物体识别等内容。

但是后来我们发现即使有了人脸特征点,要做一个 AR 人脸特效这样的应用还是有很大的成本。所以我们又做了一个 AR 特效解决方案,可以简单方便做一个 AR 贴纸特效。

具体来说,通过一个 IDE 编辑器做所见即所得的特效编辑,然后导出一个资源文件包,对应端上有个渲染 SDK 解析资源文件做特效还原。但从业务场景来说,手淘毕竟不是一个短视频 App , AR 贴纸对业务价值有限,所以我们目前 AR 方案更多是结合美妆行业,家居行业等做商品相关的 AR 应用,提升用户购物体验。



说完 AR 特效方案,再看一个大数据相关的解决方案。在原有的大数据体系里面,客户端更多是一个数据采集的角色,服务端做大数据计算和挖掘,然后做例如个性化推荐的应用。

但是随着端算力增强,端上可以跑机器学习和深度学习模型,我们做了端侧的数据特征计算框架,支持做数据特征提取,模型计算等工作。其中一个应用就是情景计算,利用端侧多维度的数据,可以准确刻画使用手淘的情景信息,比如你是在走路还是坐车,还是躺在床上。

另外,根据你在页面的停留时长,浏览轨迹可以识别你对商品的喜好程度,从而做更加精准的推荐。目前这块已经在手淘的搜索推荐广泛使用,并且取得了不错的效果。



接下来具体看几个在手淘这边的典型应用场景,第一个是拍立淘,拍立淘是一个以图搜商品的服务,原来是直接拍照上传云端做识别,这样整体耗时比较长,服务端成本比较高。现在已经把越来越多的部分放到端侧来做,比如物体检测,分割等放到端上来做,然后再上传云端做识别召回,相比原来有更好的用户体验,也节省了服务端成本。



这是一些其他典型应用,第一个是基于用户实时意图识别做交互式搜索推荐,第二个是 AR 试妆,第三个闲鱼做的一个智能发布,第四个是我们在智能硬件的若干应用。

03、MNN开源进展和应用



接下来讲下 MNN 开源相关的情况,下面是 MNN 的发展历程,我们 17 年 10 月正式启动,经历 18 年双十一洗礼,今年双十一有更大规模的应用。

这里有几个数字,每天 MNN 在手淘推理次数远大于 2 亿次, Crash 占比 <0.1% , 业界应用 >20 个, issue 修复 260 。所以可以说, MNN 是经过多场景海量计算验证的,它的稳定性和可靠性值得信赖。



MNN 的核心特点是通用性,轻量性,高性能,易用性

目前无论是性能,设备支持,训练框架支持,OP 支持等方面我们都是业界领先。



MNN 的易用性也是我们非常重视的一个点,Python 是算法工程师友好的语言,所以我们构建了 Python 工具链,方便算法同学测试和验证。目前我们提供模型转换,模型压缩,模型结构可视化,以及支持 OP 列表查询的工具,下面是具体安装命令,pip install MNN ,然后可以选择对应的工具使用,右侧是模型结构显示的一个示例。



MNN 开源以后,现在已经成为阿里巴巴的官方推荐项目,也很高兴看到业界同学用 MNN 来做车牌识别,物体检测,车辆检测等各种应用,特别还有同学写了很多介绍和使用文档。这里一并表示感谢,也希望更多的同学能够参与进来。

▼开源地址:https://github.com/alibaba/MNN



关于 MNN 后续演进有三点内容想特别和大家分享。

  • App 视角 这是由我们出生决定的,我们服务于手淘这样的超级 App,他需要支持 iOS 和 Android 两个生态,以及支持各种低端机和低版本系统,所以需要我们解决各种碎片化设备和系统兼容问题。业界很少像 MNN 一样在超过 200 款设备上运行,并且支持业务规模化应用。
  • 性能极致 手淘有像人脸,搜索推荐等各种实时业务场景,以及需要覆盖中低端机的诉求,迫使我们做极致的性能优化,这样才能很好的支持业务。
  • 开源开放 前面说的我们在几百种设备运行,各种中低端机以及系统兼容适配,业务规模化应用,这些经验积累都沉淀到 MNN 里面开源给业界,确实业界也没有一个这方便做的特别好,希望能够给大家有所帮助。

最后,我们的愿景是期待能和大家一起打造功能完善,性能极致,简单易用的端侧推理引擎,并且能够在行业中获得广泛应用。



本文作者:吕承飞(吕行)

原文链接

更多技术干货敬请关注云栖社区知乎机构号:阿里云云栖社区 - 知乎

本文为云栖社区原创内容,未经允许不得转载。

发布于 2019-10-12 10:58