移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较

一直以来,随着深度学习的快速发展,复杂而庞大的模型需要在计算力强大的计算设备上才可以展示其强大的能力,如GPU,深度学习运行在移动和嵌入式设备中,它赋予了这些设备在终端本地运行机器学习模型的能力,从而不再需要向云端服务器发送数据。这样一来,不但节省了网络流量、减少了时间开销,而且还充分帮助用户保护自己的隐私和敏感信息

,而在没有强大计算机资源支持的情况下,怎样才能大规模部署深度学习算法成为可能。因此博主会通过本文来系统介绍下目前已经成功落地的深度学习框架。

揭秘支付宝中的深度学习引擎:xNN

移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较

支付宝App中的深度学习引擎——xNN。xNN通过模型计算框架两个方面的优化,解决了深度学习在移动端落地的一系列问题。

xNN的模型压缩工具(xqueeze) 在业务模型上实现了近50倍的压缩比, 使得在包预算极为有限的移动App中大规模部署深度学习算法成为可能。xNN的计算性能经过算法和指令两个层面的深度优化,极大地降低了移动端DL的机型门槛。

我们对支付宝APP做****,发现一些native library :

1. amnet-http 是 http 协议相关的一些东西,不是http协议的实现,里面用到了 Google 的Brotli 压缩格式Facebook 的ZSTD 压缩算法,看来Ali采用了业界比较成熟的一些压缩方法直接用到支付宝上了。这个库叫amnet,猜测应该是 Ali’s mnet意思, mnet是别人家的东西,Ali改了改。

2. amnet-mmtp, mmtp应该是另外一个Protocol了,没看错的话就是MPEG Media Transport Protocol。另外还有amnet-mng, mng貌似是manager的缩写,用来管理的吧。

3. APSE 不知道是不是AliPay Security的缩写,其实这里感觉大部分内容都是mbedtls 的,主要是SSL/TLS相关内容。既然跟SE(安全)相关,肯定少不了加密,这里确实能找到很多加密算法的常数。

4. Openssl,微信里也有,OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法、常用的**和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。支付宝作为一款支付工具,在安全方面肯定做了很多的加强!
OpenSSL被曝出现严重安全漏洞后,发现多数通过SSL协议加密的网站使用名为OpenSSL的开源软件包。OpenSSL漏洞不仅影响以https开头的网站,黑客还可利用此漏洞直接对个人电脑发起“心脏出血”(Heartbleed)攻击。据分析,Windows上有大量软件使用了存在漏洞的OpenSSL代码库,可能被黑客攻击抓取用户电脑上的内存数据。

5. Protocol Buffers:这是Google的,要使得模型在客户端本地,开发者必须要在桌面设备上提前训练好一个模型,各种类型的数据都需要使用 Protocol Buffers(简称 ProtoBuff)来定义数据结构,有了这些 ProtoBuff 代码,你就可以使用工具来生成对应的 C 和 Python 或者其它语言的代码,方便装载、保存和使用数据。

6. sigAlgorithm,名字很直白,签名算法。

7. silk,Skype的音频库,微软大方开源给大家用了,对商业使用也很友好,随便用。

8. XNN,Caffe, MXNET 深度学习的库:看来支付宝中有好几种DL框架。


 深度学习——云端还是移动端?

近来,深度学习(DL)在图像识别、语音识别、自然语言处理等诸多领域都取得了突破性进展。DL通常给人以计算复杂、模型庞大的印象——从Siri语音助手到各种聊天机器人、再到支付宝“扫五福”,移动端收集数据+云端加工处理似乎成为一种常识。然而对很多应用来说,这种模式其实只是无奈之选。

去年春节的“扫五福”活动中,为了识别手写“福”字,支付宝多媒体团队调动了近千台服务器用于部署图像识别模型。可是如此规模的集群也没能抵挡住全国人民集五福的万丈热情。为了防止云端计算能力超载,活动中后期不得不启动了降级预案——用计算量小但精度也较低的传统视觉算法替代了DL模型。降级虽然不妨碍大伙继续热火朝天地收集福卡,但对用户体验无疑是有一定影响的,比如一些不可言说的汉字也被误判成了“福”字。

xNN主要特性一览

xNN为DL模型提供了从压缩到部署、再到运行时的统计监控这一全生命周期的解决方案。xNN环境由开发后台和部署前台两部分组成。

移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较


开发后台以xqueeze工具链为核心,支持多种训练框架。业务可以使用xqueeze压缩、优化自己的DL模型,得到尺寸大幅减小、运行速度显著加快的模型版本。压缩后的模型据使用场景部署:高频模型安装包内置低频模型按需下发的形式部署到移动端。

部署前台:xNN还通过一个jsapi提供了直接对接H5应用的能力——通过DL模型的动态下发和H5,能够实现完全的动态化,从而在客户端不发版的情况下完成算法+逻辑的同时更新。

xNN的部署框架原生兼容Caffe,业务可以在不做转换的情况下直接在移动端运行已有的Caffe模型,以快速评估效果。而经过压缩的私有格式模型更小、更快。在Tensorflow和Keras平台上训练的模型也能够在原有的环境上进行压缩,然后转换为xNN支持的格式部署到移动端(tensorflow和keras有自己的模型压缩工具,可以看我的上一篇博文中有介绍:TensorFlow Lite入门)。不同于core ML,xNN理论上支持安卓和iOS上的所有机型。

xqueeze模型如何压缩

xNN-xqueeze的模型压缩流程如下图之(a)所示,包括神经元剪枝(Neuron Pruning)突触剪枝(Synapse Pruning)量化(quantization)网络结构变换(network transform)自适应Huffman编码(adaptive Huffman)、共5个步骤。

其中,前三步理论上是有损的,而使用xqueeze对网络权重压缩超参进行finetune(微调),能够将精度的下降保持在可控甚至可忽略的程度。后两步则完全不影响网络的输出精度整个流程不仅会减小模型的尺寸,还通过网络的稀疏化和结构优化,显著提高前向预测的速度

移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较

在压缩的经典方案DeepCompression的基础上,xqueeze 进一步扩充了Neuron pruning和Network Transform的能力。其中,Neuron Pruning能够逐次裁剪掉“不重要”的神经元和与之对应的权重参数。通过Neuron Pruning和Synapse Pruning的结合,在模型精度和压缩比之间达成更好的平衡。xqueeze还具有network transform——在网络的宏观层面进行优化的能力,Network Transform脚本扫描整个网络,诊断出可优化的点,包括在有条件的情况下自动地进行层(layer) 的组合与等效替换。此外,xqueeze通过自适应地使用Huffman编码,有效提升不同稀疏程度的模型之压缩比。

如下图所示,对于业务分类模型,使用xqueeze工具链能够实现45.5倍的压缩,在同等程度的精度损失下,压缩率超越经典方案达60%。

xNN计算性能优化

xNN的性能优化不局限于底层,而是通过与xqueeze工具链的配合,在算法指令两个层面同步发力,为更为深入的优化创造空间。
如下图所示,在算法层,xqueeze的剪枝在压缩模型尺寸的同时,也促进了网络的稀疏化——即催生出大量的零值权重。相应地,xNN在指令层实现了稀疏运算模块,在卷积和全连接计算中,自动忽略这些零值权重,减小计算开销,提升速度。又如之前已经提到的,在xqueeze的Network Transform阶段,会对网络进行宏观层面的优化,包括将相邻的层进行结果上等效的组合与替换,来减少计算的冗余度和提高访问存储器的效率, 要充分发挥network transform的效能,也离不开指令层实现的支持。

移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较

在指令层,xNN通过智能调配各个内核的负载,提升多线程环境下的性能。xNN在设计中不仅关注计算资源,还充分考虑了访问存储器的开销,通过精细化地调度数据的读写来提升cache的命中率。最为重要的是,所有核心计算模块均由某位芯片行业出身的指令集架构专家一条一条汇编代码手写而成,这是很牛逼的。

在以SqueezeNet为基础的业务分类模型上,xNN在Qualcomm 820 CPU上能够输出29.4 FPS的前向预测帧率,在苹果A10 CPU (iPhone 7)上的帧率则达到52.6 FPS,比CPU与GPU并用的Core ML还要更快。

业务落地

xNN的最新版本在确保精度的前提下,尺寸已压缩到100KB以下。Android平台上,全功能xNN的SDK包增量仅200KB出头,若根据特定应用做裁剪,将能够轻松减小到100多KB。

挑战

随着手机处理器性能的提升和模型轻量化技术的发展,移动端DL正在变得越来越可行,并得到了广泛的关注。苹果和谷歌已经分别宣布了各自操作系统上的DL框架Core MLTensorflow Lite,这无疑将极大地促进移动端DL的发展。但是,尤其对于支付宝这样的国民App来说,仍然存在一些严峻的挑战是无法通过直接套用厂商方案来解决的。

  1. 机型跨度大:支付宝App拥有数亿受众群体,在其中落地的业务必须对尽可能多的用户、尽可能多的机型提供优质的体验。对支付宝来说,参考Core ML只将功能开放给少数高端机型的做法是不合适的。因而无论在运行速度和内存占用等性能指标、还是在兼容性上,支付宝的移动端DL都必须做到极致,才能最大幅度地降低使用门槛。
  2. 包尺寸要求严:支付宝App集成了众多的业务功能,安装包资源非常紧张,一个新模型要集成进安装包往往意味着需要下线其他的功能。而即便通过动态下发的形式进行部署,DL模型的大小也会强烈影响用户的体验。随着移动端智能化程度的不断提升,直接在端上运行的DL应用必然会越来越多,这以当前单个模型大小就动辄数十、数百M的尺寸来看几乎是不可想象的。同时,移动端DL引擎本身的SDK也需要尽可能地瘦身。

小米深度学习框架—MACE

在2018年 月 28 日,第十三届开源中国开源世界高峰论坛上,小米首席架构师、人工智能与云平台副总裁崔宝秋在《小米 AI 时代的开源》的主题演讲中,代表小米正式发布了小米移动端深度学习框架 —— MACE。

移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较


移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较


移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较

目前tensorflow已支持GPU加速,但是tensorflow Lite还未支持,GPU加速,好在谷歌强大的生态环境,默认情况下TensorFlow Lite使用的是CPU来进行解算,如果你需要使用Android 8.1推出的硬件加速API,则需要确保它运行在受支持的设备上。

移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较

如果对小米的MACE感兴趣,可以查看其项目地址:

移动端深度框架 TensorFlow Lite 、小米MACE和 支付宝xNN 比较

总结:目前来看,苹果和谷歌已经较早开源其DL框架Core ML和Tensorflow Lite,至于开发者们喜欢用哪个可以自己根据兴趣和选业务进行选择。

可参考我的上篇博文Tensorflow Lite

参考:阿里技术年度精选集