前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >兼容并蓄——MNN异构计算设计与实践

兼容并蓄——MNN异构计算设计与实践

作者头像
软件绿色联盟
发布2022-03-31 13:04:32
1.1K0
发布2022-03-31 13:04:32
举报
文章被收录于专栏:软件绿色联盟动态

端上推理与异构计算

移动AI与端上推理已经不是一个新鲜话题,阿里巴巴开源自家轻量级的深度神经网络推理引擎MNN(Mobile Neural Network),用于在智能手机、IoT设备等端侧加载深度神经网络模型,进行推理预测。出于实时性、保护用户隐私、降低服务器负载的需求,算法工程师会将服务端上由PyTorch/ TensorFlow / Caffe 训练的模型,转成端上推理引擎MNN所使用的格式,调用MNN在移动端上进行推理,也就是在移动端上部署。

在部署环节中,制约算法工程师开发的因素主要是实时性,一般而言,在推理引擎不变的情况下,模型的运算量越大,准确率越高,实时性越差,算法工程师需要在运算量和准确率之间找一个平衡点。而如果推理引擎优化得更好,同样运算量的模型延时降低,算法工程师就有更多的选择空间。

端上推理引擎的主要任务,是在不同的资源受限的环境下使模型高效运行。移动端,也就是手机上有各种计算资源,它们出于不一样的需求而设计。最常用的就是CPU,通用处理器,它需要什么都能做,需要兼顾控制、计算与缓存。而在图形渲染的场景,我们需要逻辑控制简单,而重复计算能力强的芯片,于是就有了GPU,它牺牲了逻辑控制的部分,把大部分芯片面积给了计算。

近些年来随着摩尔定律的失效,CPU的算力提升渐渐接近瓶颈,而GPU则由于更高的画质方面的需求,厂商们把它做得越来越强。CPU和GPU是手机的标配,由于图像处理和视频处理的需求,有些手机上有DSP,由于端上推理的需求,近年来手机也渐渐地开始搭载了NPU。在不同的移动端上,只用同一种芯片进行计算,是无法实现模型的高效运行的,因此我们需要探索各类芯片的使用,也就是异构计算。

作为通用的端上推理引擎,MNN会被部署到各种各样的移动端设备上面,而移动端设备是多样的。从系统层面来说分IOS和Android,从芯片层面Android阵营又有高通、联发科、海思麒麟几家并立,即便是同一类芯片也有每代的版本差别。对于异构计算而言碎片化是非常大的挑战。

首先是兼容性问题,同一套代码可能在A手机上跑得好好的,而在B手机上就崩溃或者不能使用了。异构计算的使用需要标准,也就是一组API,这个标准在IOS和Android上面不一样,比如IOS上GPU的使用标准是Metal,而Android上面,由于历史原因,是OpenCL、OpenGL、Vulkan三套标准并存的局面,没有一套标准能覆盖所有设备。其次是性能问题,移动端上面由于功耗和面积的限制,像GPU之类的算力受到内存带宽的制约,不能充分发挥。此外中低端芯片往往会挑GPU的配置下手,这也导致其GPU的算力不如CPU。

MNN中异构计算实现方案

在讲MNN异构计算的实现方案之前,我们先来看模型推理的流程。模型推理是一种特珠的有向无环图计算过程,图中每个节点称为算子,计算的输入输出都是张量。在一般情况下,计算过程中图的结构与内存大小是保持不变的。最简单的异构计算设计是直接在算子层别引入加速,将算子的输入复制到执行端所需的内存上,异构计算完成后再复制回来,这样做会有较多的内存拷贝的损耗,移动端上一般会抵消异构计算本身的收益。

为了尽可能解决兼容性和性能的问题,利用模型推理过程中内存大小和图的结构不变的特性,我们将端上推理的计算过程分解为图计算调度、形状计算、资源准备、执行计算四步。

图计算调度是确定计算图执行顺序。形状计算是由每个算子去根据输入的大小计算输出的大小。这两步跟具体的硬件设备无关,我们将其抽离成Schedule和SizeComputer。资源准备与执行计算这个与硬件相关,我们封装了后端(Backend)这个接口去抽象。Backend包括三类接口函数,内存交互、内存申请与创建执行器。每个算子的执行器又包括onResize和onExecute两个接口,onResize 接口中作资源准备环节中除内存申请之外的工作,onExecute是在最后执行计算过程的调用的接口。通过这样的接口设计,我们尽可能地降低了各种硬件的适配成本,并且由于我们分离了资源准备和执行计算的过程,为后续将非计算的损耗降为一次性的工作奠定了基础。

基于我们的后端抽象,我们可以将不同硬件的实现分拆为一个一个的Backends,根据不同的手机按需加载,比如Pixel2上的GPU标准不支持OpenCL,只支持Vulkan,我们就让它加载MNN-Vulkan,而小米6可以用OpenCL,我们就加载MNN-OpenCL,这样可以使MNN在保持轻量性的同时,支持更多的硬件。

加载完一个模型,在进行推理之前,MNN要做调度和预推理两个额外的准备过程,调度过程决定这个模型的算子的执行顺序以及运行硬件,预推理则进行资源准备。在预推理过程中,会调用Backend创建算子,响应形变的资源准备相关的接口。在推理过程中,则调用执行计算的接口,这样,我们就将资源相关的损耗全部移到了初始化阶段,在推理过程是纯运算就非常快。

GPU计算实现与性能优化

由于GPU是泛用性,仅次于CPU,且有软件标准使用的硬件,MNN在异构计算的实践上着重做好GPU的利用。移动端GPU的使用主要有四套标准:OpenGL、OpenCL、Vulkan和 Metal,没有一种标准能覆盖所有手机,幸运的是它们使用方法是大同小异的。

计算方面,GPU并发的逻辑是两个层次的并发,先把一个大的任务拆解为若干个WorkGroup,再将每个WorkGroup拆解为若干个实例。WorkGroup之内对应着GPU单核内计算单元的并发,而WorkGroup之间可能是串行,也可能是由GPU多核并行,WorkGroup的大小设置是影响GPU并发效率的关键。在每个实例,也就是小方块之内,运行的是GPU的Shade代码,这个根据不同的标准各异,Metal是 .metal,OpenCL是 .cl,OpenGL 和 Vulkan 是 glsl。

API的使用方面,大的流程是相同的,主要可分为内存准备、内核准备与计算调度,区别在于抽象层级不同。内存方面,OpenCL只能访问到 Image / Buffer 高层的接口,而 Vulkan 可以访问更底层的Memory接口,有利于做内存管理优化。内核方面,OpenCL 的二进制形式无法保持兼容性,一般只能基于code形式编译,而Vulkan和Metal可以二进制形式加载,减少启动时间。

计算调度方面,OpenCL 只能调用高层级的EnqueueNDR Kernel接口,这个接口实际上做了很多事情,包括创建描述集、命令缓冲、编码、提交等,而Vulkan、Metal抽象层级更低。在我们Backend抽象接口设计下,Vulkan、Metal可以发挥自己的优势,进一步减少非计算耗时。

针对不同设备的GPU,其优化策略是相似的,主要会从三个方面进行优化:内存、并发、内核。内存指的是在GPU计算之中读取的内存量与内存访问效率,对应的优化策略包括但不限于这三点:1.在计算精度允许的情况下选用Fp16作为中间数据存储格式,这样相对原始Float类型可以减少一半的访问量;2.根据GPU的型号选择使用Image或是Buffer,有些GPU针对Image有特殊的缓存优化,利用它可以提高内存访问效率; 3.根据算法选择合适的内存布局,减少运算所需的内存读写量。并发是指任务的划分,包括整体并发数(Global Size)和局部并发数(Local Size),这要求我们选择适宜并行的算法,并且根据GPU型号确认局部并发数大小。内核是指着色器语言等的编写,这要求我们选择时钟周期较少的函数、减少条件分支等。移动端上,内存优化的收益一般是最大的。

基于后端设计,MNN拥有数量最多的后端实现,且支持的Op数是业界最多的。像 TFlite、Mace、NCNN之类只能支持额外的一两个后端,不能像MNN那样方便扩展。由于我们GPU计算上的一系列优化,从右边延时图可以看出,MNN相比于其他框架延时最低,性能是业界领先的。

演进路线

尽管我们在异构计算上做了一系列的工作,也取得业界领先的成绩,但在实际应用中,仍然有很多需要改善的地方,比如易用性、性能等。

在接口层面,我们一方面会做流程方面的优化,将数据前后处理与MNN中的异构计算结合,提升整体性能;另一方面,会研发自动调度能力,做到上游开发对硬件无感知。

在实现层面,我们会进一步做GPU的算子实现与性能优化,在此基础上,沉淀类似于Halide的IR能力,支持自动调参,在不同的设备上都跑得最快。另外会跟内部团队和厂商合作,提供 FPGA 和 NPU 的使用能力。

·END·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件绿色联盟 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于生成式AI,自动驾驶,深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档