小米MACE开源项目实践与思考
作者:何亮亮
来源:《软件和集成电路》2019年第04期
作者:何亮亮
来源:《软件和集成电路》2019年第04期
人工神经网络,作为人工智能与机器学习的一个重要分支,最早可以追溯到19世纪40年代。人工神经网络的历史,在过去的几十年中,经历了起起伏伏。
直到2006年,随着深度学习这一概念的提出,人工神经网络的研究再次进入了活跃期,并且引领了这一波人工智能的理论研究和创业热潮。这一波深度学习的高速发展,除了诸如残差网络、Drouout等新的理论的提出,更多的是依靠大数据和工程上的推动。
首先,互联网的发展、ImageNet等数据集以及众包平台的建立,为深度学习提供了必需的数据。其次,支持通用并行计算的高性能GPU使得深层网络的训练成为可能。最后,也是更重要的,是深度学习框架的推出和成熟。
回想一下,在10多年前深度学习复兴之前,计算机视觉、自然语言处理等领域的研究人员,要么采用现成的工具,受限于仅能调整少部分元参数,往往只是通过变换特征提取等方式
进行创新,要么为了验证全新的模型,需要重新造轮子,编写冗长的C++或者Matlab代码,研究效率极其低下,这两者无疑给新理论的创新带来了巨大的阻碍。
而现在,随着Theano、Caffe、Torch、TensorFlow等众多的深度学习框架的推出,算法研究人员,能够通过编写简单的脚本,即可轻松实现复杂的自定义网络,开发并验证自己的模型。
MACE的推出
根據CBA(Cloud-BigData-AI)战略,笔者所在的小米人工智能与云平台部门在2016年开始,逐步加大了对AI领域的投入。AI也逐步赋能公司的多项产品,其中,小米作为一家以手机和IoT智能设备为主的公司,设备端的AI能力是至关重要的。
随着深度学习领域的发展,在图像、NLP和语音领域,传统方法也逐渐被深度学习方法所取代。
然而,AI的落地过程并非是一帆风顺的。成熟的深度学习框架有很多,算法工程师也很容易使用它们开发出有效的AI模型,但是,如何把训练好的模型放到设备上高效运行,却不
是一件简单的事情。
2017年年中,算法团队在相机的单镜头人像模式方面取得了突破性的进展,能够通过算法,使得单镜头能够达到双镜头的效果,通过后期图像处理,从而实现媲美单反镜头的景深效果。
接下来亟待解决的问题是,如何使该项技术能够尽快地落地到手机上,这项重任便落在我们团队身上。
我们首先考察了现有流行的开源框架,诸如TensorFlow、Caffe等,这些框架最初主要面向的是算法研究人员,重点优化的方向是服务端的模型训练,后续也支持了服务器端的模型推理部署。
所以,最初的设计,以及后续的优化,都是针对服务器环境,没有考虑到嵌入式设备内存资源紧缺、计算能力有限,以及功耗敏感等问题。
此外,这些针对服务器端的开源框架,在最重要的算子部分,主要优化对象是X86 CPU和英伟达的GPU,对ARM体系结构上的优化非常有限。当时,也有一些优秀的、专门针对嵌
入式ARM优化的推理框架,比如国内的ncnn,但也有很大局限,这些框架仅仅对ARM CPU进行了专门优化,远远不能达到逐帧实时计算的要求。
同时,我们注意到嵌入式设备,尤其是中高端的手机设备,其芯片采用了SoC的形式,整个芯片,除了CPU,还有更强大的GPU和DSP等异构计算单元,而对于图像视频类的卷积神经网络,其模型计算复杂度高,依靠CPU计算还远远不能满足性能指标,如何充分利用这些异构计算单元的算力,是一个成熟的移动端深度学习推理框架必须具备的能力。
开源的框架不能满足要求,我们把视线转移到了芯片厂商提供的专有软件框架上。当时,目标机型是高通的芯片,所以,我们重点考察了SNPE。我们对比了SNPE与TensorFlow和Caffe等开源的框架,发现SNPE采用GPU或者DSP计算,在速度上大大优于这些基于CPU方案的开源框架,并且能够满足实时逐帧的计算。
所以,我们决定采用SNPE来部署我们的模型,但随着项目的推进,我们遇到了一些棘手的问题。
由于当时SNPE发布不久,还处于早期阶段,缺少模型必需的一些算子,同时自定义算子功能不成熟。
另外,SNPE在内存使用上缺少优化,没有考虑不同层之间的缓存复用,导致程序内存占用过大。
同时,由于SNPE采用的是动态库的形式,很容易被hook进行反向工程,无法做到安全的模型加密和保护。
为了满足需求,我们跟高通公司进行了紧密的沟通,但是,由于跨公司沟通环节的复杂性,以及看待问题视角和优先级的不同,虽然高通给予了我们很多优先级的支持,但我们的需求迟迟没有得到很好的满足。
随着时间的推移,项目准时落地的风险越来越大,为了能对底层框架有更好的把控,我们决定在通过变通方式使用SNPE的同时,开发我们自己的框架,于是MACE(Mobile AI Compute Engine)在2017年8月底正式立项。
最初技术方案有两个选择,一个是基于现有开源框架进行修改,另一个是从头自己实现。
经过分析,我们认为,移动端的推理框架是最核心的异构计算的运行以及底层的算子,
而这块在开源框架中完全缺失。
实际上,框架本身实现难度不高,并且现有的框架非常臃肿,为了能够适应移动端,需要进行大量的删减,反而不如重新实现容易。
最终,我们决定采用第二种方式。接下来的一个月,项目进展非常顺利,代码框架迅速搭建起来,并且实现了支持NEON的CPU,能够成功运行MobileNet。但很快现实给了我们巨大的打击,评测显示速度只能达到TensorFlow Mobile速度的1/4,当时正好恰逢国庆节,但团队心情却比较低落。很快,我们完成了MACE的GPU运行,并且实现了1×1的卷积算子,速度相比CPU有所提升,但仍然不理想。
由于在CNN网络里面,卷积操作是决定性的瓶颈,所以,接下来重点工作便是对卷积操作进行优化,于是团队便分头行动,对CPU和GPU的卷积算子分别优化。在GPU方面,由于现有的开源实现很少且性能表现太差,无参考意义。
我们系统钻研了并行计算优化领域的通用优化方法,参考了高通的OpenCL优化指南,尝试了不同的内存布局和计算方式,最终使得1×1卷积有了几倍的提升,达到了SNPE相近
的性能。卷积取得性能突破之后,事情就成功了多半,接下来便是算子的完备,很快自研的MACE框架就能成功运行AI人像模型,相对于最开始的版本,取得了近10倍的性能提升,性能基本接近产品的要求。
接着,随着产品集成和系统测试工作的进行,除了进一步优化算子速度,我们还做了几项效果显著的改进,包括Winograd卷积优化、算子融合、内存复用、模型加密、启动优化、卡顿优化等,使得用户体验大大提升。
同时,MACE在CPU的性能优化上也取得了突破性进展,在我们的模型上,浮点计算速度达到了TensorFlow的2倍。
2017年年底,离产品代码冻结时间已经很近,同时进行的SNPE集成仍然不顺利,经过对比,在AI人像这个项目上,MACE在各项指标上均优于SNPE,并且在快速迭代,所以我们最终决定在产品上上线MACE,至此,MACE项目取得了阶段性的成功。
随着第一款产品的落地,MACE项目重心转移到了功能的完善和业务支持上,在后续的几个月中,MACE增加了DSP的支持、比特量化支持等重要特性。
MACE的开源
在小米自己的AI落地过程中,我们深深体会到,在手机上落地AI应用绝非易事,而小米之外的应用开发者面临同样的问题。
对于一款手机而言,手机厂商提供的功能毕竟是有限的,一个手机的生态需要广大的开发者共同参与,才能为用户带来更优异的体验。
我们从其他渠道了解到,一些实力雄厚的开发者,例如,算法提供商商汤、旷世等企业,均有自研的推理框架,并且性能优异,但是出于商业利益的考量,他们也不对外共享。
谷歌作为安卓阵营的引领者,推出了Android NNAPI接口,希望能统一移动端的NN接口,然而,这一努力进展缓慢、无法落地,而谷歌在TensorFlow以及TensorFlow Lite上面,对异构硬件的支持,进展迟缓,远远落后于苹果的生态。而芯片厂商,诸如高通和联发科,由于各自的商业考量,技术方案比较封闭,对普通App开发者不够友好。
出于这些原因,开发者面临的现状就是只能采用一些基于CPU的方案来进行开发,这在一些计算密集的CNN模型上非常吃力。
同时,公司CEO雷军和时任人工智能与云平台总经理的崔宝秋博士对开源非常支持,尤其是崔博士在开源领域有着多年的经验,在他们的建议下,我们决定让MACE项目对外开源,这一决定,在现在看来无疑是非常正确的决定。项目在2018年8月底,正式开源后,得到了社区的广泛关注。
开源战略与意义
对于一个企业,尤其是新兴企业来说,开源有着非常重要的意义。恰当的采纳开源软件,可以大大降低公司的研发成本,对外贡献或者参与开源项目,可以提升公司的技术品牌。
以MACE项目来说,具体可以体现在如下几个方面。
第一,对外贡献代码,尤其是自己主导的项目,可以大大提升研发人员的成就感,从而提升士气和开发效率。
第二,软件开源可以促使程序员写代码时更注重代码质量,这可大大降低项目的生存周期的管理成本。
第三,随着开源项目的用户逐渐积累,会有更多的外部开发者进行不同形式的贡献,这对两家企业都是互惠互利的事情,从本质上来讲,这是更大范围的社会资源共享。
第四,任何一门基础技术,都会经历初期探索、发展繁荣、成熟标准化的过程,而开源将是大大推进这一进程的重要力量。
>并行计算框架
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论