原文:知乎
文章发表于知乎专栏《移动端算法优化》
作者:高性能计算学院
Hi,大家好,我们是小米手机影像算法部门的算法加速团队,负责小米手机影像算法的优化和落地的工作,在过去几年内,我们在移动端影像算法优化方向投入了很多的精力和资源,在这个领域积累一定的经验,撰写这个移动端算法优化技术专栏,与大家分享和交流。
一、移动端算法优化背景
- 相比于服务器端和云端算法,移动端算法落地困难重重,主要原因有以下几点:
- 受限于芯片的封装面积、功耗、散热等因素,移动端处理器的性能远低于服务器端处理器的性能,除此之外,在移动端上还有内存、存储空间、网络带宽等居多限制。
- 越来越多的移动端影像算法应用的需求,同时对于影像算法的效果的要求也是越来越高,这又对移动端平台的计算能力提出了更高的要求。
- 移动端很多应用场景对于影像算法的实时性要求很高,以手机相机为例,拍照时间长、拍照卡顿、手机发烫这些问题会直接减低用户的使用体验。
- 而要解决上述提到的各种问题,实现算法的落地,是需要多方一起努力的:
- 在平台方面:移动平台的算力要持续提升,以高通芯片为例,从 855 到 865 再到 888,可以看到每代芯片在算力上都有很大的提升。
- 在算法方面:在确保效果的前提下尽量的简化算法的复杂度,这也是体现算法研发功底的地方。
- 在算法优化方面:要结合算法的特性和平台的计算资源对算法做代码级的优化以提升算法的性能,要做到选择最优的实现方法以及充分发挥硬件的计算能力。
- 在系统架构方面:要做更高维度的优化,合理的进行资源的调度和分配,优化算法处理流程,提升整体的性能。
二、移动端系统架构介绍
由此可见算法优化是移动端算法落地不可或缺的环节,是对算法的性能负责的,那么移动端算法优化到底是如何去做的呢?
以高通平台为例来说明,下面是高通骁龙 SOC 的架构图:
与计算处理相关的硬件资源包括如下
- CPU:对应上图中的① (Kryo subsystem),基于 ARM Cortex 架构的 64 位处理器,目前移动端的 CPU 处理器基本上都是基于 ARM 架构的,为应对多媒体密集的计算需求引入 Neon 指令集扩展,并且支持浮点运算,优点是开发简单、使用方便,可移植性好,缺点是计算能力偏弱,而且由于 CPU 资源竞争导致性能上存在很大的波动,功耗偏高,适用于逻辑控制模块,计算量不是很大或者不便于做矢量处理的模块,实现的时候一般采用 Neon (intrinsic 或者汇编) + 多线程的方式。
- GPU:对应上图中的③ (Multimedia subsystem) 中的 Qualcomm Adreno 部分,在 Android 手机的 GPU 领域主要是高通 Adreno 系列和 ARM Mali 系列两大类,GPU 的优点是并行线程多,支持向量化的处理,算力强,存在的缺点是功耗高,存在 UI 渲染资源竞争导致性能存在抖动,适用于适合计算密度高,逻辑简单的算法处理,实现的时候一般采用 OpenCL,OpenGL 或者 Vulkan 等方式。
- DSP:对应上图中的⑨ (Compute subsystem) ,DSP 是专有处理器,优点是计算能力很强,具有更大的 SIMD 指令位宽,更灵活的超长指令字设计,直接高效的内存访问模型,运行效率稳定,资源竞争少,功耗低,缺点是开发难度极大,算法中计算量大或者性能瓶颈模块往往需要采用 DSP来处理,一般采用 DSP 提供的专有指令 (intrinsic 或者汇编)来实现,如高通 hexagon DSP 中的 HVX 指令。
- NPU:对应上图中的⑫ (Qualcomm Neural Processing Unit),专门用于神经网络硬件加速的处理器,针对神经网络的特点专门设计了硬件结构和处理器指令,带来的好处是相比于 CPU 和 GPU,功耗会低很多,处理时间会有数量级上的提升,缺点是神经网络的设计依赖于 NPU 支持的算子操作,灵活性不高,模型推理的时候需要进行量化,在精度上会有一些影响。实现的时候一般采用 NPU 提供的推理框架,比如高通的 SNPE 和 QNN 。
三、移动端算法优化能力模型
移动端算法优化要做的事情就是利用移动平台上的 CPU、GPU、DSP 和 NPU 等计算资源,进行协同计算,实现算法的性能的提升和功耗的降低。
这是一个相当硬核的工作,对于算法优化工程师各方面的要求都很高,那具体都需要哪些技能呢?下图是我们提出的一个移动端算法优化工程师能力模型。
- 编程方面:优化写的是性能极致的代码,对于算法优化工程师的编程能力要求很高,不能仅仅满足于功能的实现,简洁,高效,优雅的代码才是我们的宗旨。
- 算法方面:优化的对象是算法,深刻的理解算法有助于算法的实现,同时也需要从各个优秀的开源算法库中学习好的实现方法和思路。
- 优化方面:优化工作最终落实到如何使用各个处理器提供的方法和指令来实现算法,需要对各个处理器的架构及指令集有深刻的理解和认识,这样才能写出高性能的实现和充分发挥硬件的计算能力。
当然移动端算法优化也是一件非常有意思的工作,我们会深入了解算法和处理器的各个细节,通过优化后算法的性能会有几倍、十几倍、几十倍甚至上百倍的提升,这会让人很有成就感。
四、我们的想法
通过前面的介绍可以看到算法优化既是移动端算法落地过程中一个非常关键的环节,也是一件非常有挑战性的工作,但是目前移动端算法优化面临一个很大问题 -- 缺少系统性资料及学习交流平台。
相对于 C/C++、Android开发及深度学习等领域,生态相对不够完善。因此移动端算法优化对于初学者或者刚进入这个领域的人而言非常不友好,即使是熟练的算法优化工程师,缺少交流和讨论也会限制进一步的提高。
目前我们在移动端算法优化积累了一定的经验,所以接下来我们打算以知乎为平台,对移动端算法优化技术做一个比较系统的介绍,希望越来越多的人能够参与进来,形成一个开放的交流讨论的平台,让移动端算法优化可以做得更好。
以上就是我们在“移动端算法优化概述”中想说明的全部内容,接下来我们会系统深入的介绍 CPU 优化技术、GPU 优化技术、HVX 优化技术以及深度学习相关的内容介绍,会涉及原理性的说明以及具体实例的讲解,
推荐阅读
更多嵌入式AI技术相关内容请关注嵌入式AI专栏。