人工智能技术这几年非常的火爆。神经网络算法可以在传统算法的极限上进一步突破,成为了各个算法领域做到顶级水平后继续研究升级的首要路径。目前大多数的神经网络主要还是应用在服务端。当然,大多数人还是看好这些高级的算法能跑到移动端上面。但是个人认为移动端有三个问题是必须解决的:一个是算力问题,目前移动端能堆积的算力不像服务端那么灵活,算力较小;一个是功耗问题,大量的算力,必然导致功耗太高,手机发热,电池不够用等问题;还有一个是模型太大,动不动几十兆,假设一个应用场景需要一个模型,内置上百兆的模型不可行,下载上百兆也不方便。不过还是很感谢很多技术开发人员在这方面的努力。就比如各个大厂都在深度开发端侧推理框架。
作者:Keepin
授权转自https://zhuanlan.zhihu.com/p/114254288
一、什么是推理框架
通常神经网络算法从研发到应用有两大环节,第一环节是设计并训练模型;第二环节是把模型部署到产品上。推理通常认为是部署到产品后框架所需要实现的运算。一个模型输入一个给定的数据得出一个数据,类似于推理得到了一个结果。不过上述说道的第一环节,其实也涉及到推理,只不过训练的时候推理只是其中的一小部分而已。一般训练包括推理+数据集+损失函数。能够执行这个推理过程的软件封装可以认为是一个推理框架。
二、开源的移动端推理框架
目前开源的移动端推理框架还是很多的,有腾讯主导的ncnn,小米旗下的mace,谷歌的TensorFlow-lite(简称tflite),Facebook的caffe2,百度的paddle-lite,阿里巴巴的mnn,arm中国的tengine,arm的computelibrary,【苹果的CoreML,闭源的】等等。
三、实现了gpu推理功能的移动端推理框架
上述几个主流的推理框架除了caffe2移动端推理框架暂时还没看到实现GPU推理外,其余框架均已支持GPU前向推理。不过需要说明的是tengine的规划是使用arm的computelibrary里面的gpu推理实现,所以略有重叠。
四、各个移动端推理框架GPU编程实现方法
1、腾讯的ncnn:使用vulkan,支持跨平台ios,android。不过ios需要通过第三方的SDK才能使用vulkan。苹果自己开发了一套metal的gpu编程API。以后ios上什么opencl,opengles,vulkan都不再是官方原生支持的GPU编程api了。
2、阿里的mnn:使用opencl,opengles,vulkan,metal四种GPU编程API开发了这个推理框架。据说很多公司开始把mnn纳入到公司内部的推理框架进行二次开发,估计更全面的GPU编程API支持是其一个最大优势。
3、小米的mace:mace是基于opencl开发的,mace框架出来得比较早,当然没有比arm的computelibrary早。很多框架的GPU推理实现都或多或少的参考了computeLibrary。
4、谷歌的tflite:使用opengles的compute shader实现了安卓版本的GPU推理,对于IOS版本则是使用metal开发。
5、百度的paddle-lite:使用vulkan开发安卓版本的GPU推理,使用metal开发IOS版本的GPU推理
6、arm中国的tengine:tengine使用的是arm compute library框架作为底层GPU实现,据了解tengine在cpu端的优化下了很大功夫,当然作为ARM旗下的推理框架,自然对arm的架构和ISA指令更加了解。
7、arm compute library:这个框架是使用opencl和opengles来实现GPU推理的。该框架做得比较早。是armnn的底层推理实现。因为arm独特的ip授权模式,armnn是为了让半导体公司能直接打通安卓的android-nn框架。
8、闭源的苹果coreML。没怎么研究,但是可以大胆假设,一定是使用metal做GPU调用的。
9、闭源的高通SNPE。snpe是高通开发的一个推理框架,支持GPU推理,之前尝试分析过,一些调试数据看,内部必然存在opencl实现。
当然,这些框架为了兼容性,都实现了CPU的推理功能。毕竟cpu推理兼容性更好,特别是现阶段几乎所有的手机端都是采用ARM的cpu。因此使用cpu的推理方案兼容性会更好。
五、为什么GPU能做神经网络加速
一方面是GPU对通用计算支持力度越来越大;另一方面是现阶段的模型主要以cnn为主,cnn最终就是卷积运算,而cnn的运算恰好是支持并行计算的算法,当然还有很多层也是支持并行运算的;此外,GPU可以分担CPU的负载。
不过,个人觉得有点小遗憾,现阶段在GPU端的推理主要以浮点推理为主,CPU的推理则是以定点推理为主。希望能尽快看到GPU用定点推理的框架。
六、GPU推理框架是否有可能被npu替代
个人认为最终是要被替代的,理由有:一个时GPU主要以浮点运算,功耗极高,有相关资料显示,浮点单元使用的晶体管数量是定点单元使用的晶体管的6倍之多;另一个是AI算法这么火,早晚是要有专用的ASIC专用模块的。再来看看SOC芯片厂商的做法:
1、英伟达的GPU在桌面端称霸AI,但是内置的tensor core性能是GPU的好几倍;
2、高通则是选择了DSP进行扩展,增加一些AI性能,例如HTA单元;
3、arm开始发力npu,虽然有点迟,但是依然在2019年年底亮相;
4、华为海思麒麟芯片据说最先使用寒武纪npu核,后来自研了达芬奇系列的npu;
5、联发科也自研了APU系列AI加速模块;
6、英特尔更是收购了两家做AI加速模块的公司;
7、amd现在阶段在开发miopen做生态,npu到没看到太大进展。
七、现阶段GPU推理框架还是要继续研发
现阶段,虽然android-nn持续发展,但是个人认为android-nn对模型的保护力度太小,估计很多公司宁愿选择自研或者使用第三框架进行二次开发也不会轻易使用android-nn框架。随着半导体公司在移动端终端方案引入AI加速模块(NPU/APU/HTA),各个芯片厂商也提供了一套推理框架,可以说现在的移动端推理框架实在是太多了。如何选用,各种各样的推理框架,光是评估都得花较多时间。不过话说回来,框架多了,投入的人才也就多了,反而能促进各个框架的进一步优化。至少得保证软件的兼容性直到npu替代GPU与及旧款的缺乏npu的手机机型全部退役。
推荐专栏文章
- TensorFlow Lite的 GPU 委托代理(Delegate)是什么,怎么加速模型推理
- 端侧推理引擎Tengine初识:安卓平台交叉编译并跑通MobileNetV1
- 整合mxnet和MNN的嵌入式部署流程
更多嵌入式AI算法部署等请关注极术嵌入式AI专栏。