‍♀️ 编者按:本文是支付宝体会科技沙龙第 3 期-走进蚂蚁端智能技能回忆系列文章,作者是蚂蚁集团算法工程师世豪,介绍了 xNN 在端侧 AI 优化问题笼统及解决思路,以及面对“算力碎片化”为特色的 AI 芯片生态,考虑新一代端智能建模结构所需的中心要素,完结对终端设备算力的精细化发掘。

点击查看回忆视频 player.bilibili.com/player.html…

我今天共享的主题是 《xNN – 蚂蚁端侧深度学习结构》,接下来首要会简略介绍蚂蚁端智能的开展历程,引出咱们的第一代 AI 结构建造,咱们称之为叫轻量化建模。在轻量化建模的根底上,根据咱们对端侧 AI 的技能开展趋势判断和衍生出的技能应战,引申出咱们现在正在探究的第二代结构规划-可弹性建模。

布景介绍

蚂蚁端智能诉求可以追溯到 2017 年的支付宝新春扫福活动。2017 年是支付宝第一次引入 AR 实景扫福,经过扫描任意“福”字协助咱们去集搜集福卡。其时的福字识别模型挑选服务端服务布置的技能计划,为了在活动期间识别福字,需求调用许多的服务端布置资源来布置识别模型;另一方面,DL 在云端则意味着数据必须上传。即便不考虑核算压力,从网络延时、流量、隐私保护等视点,也给用户体会带来种种约束。因而,对适当多的运用来说,DL 模型前移到移动端布置可以看作是一种刚需。 在这个布景之下,支付宝开端了端侧 AI 的探究,并与 2017 年八月在支付宝APP 中初次上线 xNN 端侧推理引擎。在同一个时间段前后,咱们也看到业界许多公司都开端布局并落地端上 AI 相关才干,蚂蚁也是业界较早布局端智能技能方向的公司之一。 xNN 引擎上线率先经过图像识别才干支撑“AR 扫花识花”事务,并逐渐扩展了包含图像检测、文字识别、要害点回归等认知智能事务场景,及以查找引荐营销、安全风控为主的数据智能事务场景。一起,端侧 AI 才干也在线下 IoT 场景的支付宝刷脸、智能货柜等中广泛运用,并经过支付宝小程序、扫一扫等入口将部分成熟的 AI 才干开放到生态支撑。 在广泛的事务支撑背面,咱们需求首要界说端侧 AI 的一个中心技能课题。总结来讲端侧 AI 中心问题是模型优化的问题。咱们知道在服务端布置 AI 模型时,一般整个布置环境的资源无论从算力、存储资源来讲,都是相对来讲比较丰富的。但是反观终端移动端设备以及 IOT 设备,无论是算力仍是存储等方针上有若干数量级下的的苛刻约束。因而,中心技能应战在于怎样经过或许的模型优化技能手段来降低端上布置模型的功用、尺度、功耗等等。 作为终端 APP 运用开发团队,咱们把可以触及到的模型优化空间笼统为四层:

xNN:蚂蚁端侧深度学习框架

  • 模型层:经过规划终端友爱的模型结构及其相应的参数来完结在模型使命精度和核算杂乱度间的一个权衡。例如现在广泛运用的 MobileNets、ShuffleNets 系列的模型结构均属于这个层面上的优化。
  • 核算图层:经过对固化的推理 DAG 核算图进行算子调度、交融、拆解等手段,保证模型核算依靠联系不变的前提下,进步咱们推理效能。社区和学术界都会有相关的作业。类似 TorchScript、onnx、TVM-Relay 等作业均在这个维度有非常多的才干建造。
  • 算子层:这个维度的优化也是端侧推理引擎中心重视的部分,即能否经过更为高效的算法、kernel 完结来到达对硬件算力的运用。相关作业开源社区中各家端侧推理引擎,以及服务端 NVIDIA 的 cuDNN 等等加快 Library。
  • 设备层:硬件设备是咱们端侧推理所依靠的根底设施,硬件厂商经过供给高效的指令集、AI 专用芯片硬件加快来进步算力峰值。

在此根底上,蚂蚁端侧 AI 结构 xNN 定位于掩盖上述四层优化空间。xNN 方针在于构建可以被不同事务算法在研制阶段复用的端 AI 根底才干。从模型结构规划、训练功率优化、模型参数紧缩、端设备的布置,咱们期望构建端到端的技能才干来进步全体体会。在这样的定位之下,既需求对各个事务算法范畴异同有深化了解、了解其背面的中心诉求,一起也要紧跟整个业界的 AI 硬件开展趋势改变。xNN 团队也继续与华为、高通等各厂商保持严密的协作与沟通。

xNN 结构 1.0:轻量化建模

首要跟咱们共享咱们在前期所建造的第一代结构的全体规划思路:轻量化建模。 轻量化建模和干流的模型优化的思路相对共同。咱们根据方才所界说的四个层级的优化主体逐层建造相应的才干,全体上形成一个自上而下的逐层优化。在这个进程中,咱们沉积了四个方面的技能才干:结构查找,模型紧缩,模型转化,核算引擎。通四个维度逐层向下优化,咱们期望可以为咱们内部不同的事务算法需求供给层次化的解决计划。接下来我会对这四个模块全体做一个简略的介绍。

xNN:蚂蚁端侧深度学习框架

首要是模型紧缩和结构查找,这两个技能模块是与端模型算法研制进程严密相关,且需求与算法同学深度协同的一些技能才干。

模型紧缩:

早在 xNN 核算引擎初次上线时,咱们便配套布局建造了模型紧缩的中心技能。它包含了模型的剪枝,参数的量化,以及数据编码。

  • 剪枝(Pruning):模型剪枝可以简略的分为三个维度。(1)通道剪枝(Channel Pruning)尽管可以有效的降低模型的尺度以及核算的功用,但在实践的运用进程中调整通道间的紧缩份额往往需求许多调参。(2)模版化剪枝(Pattern Pruning)及突触剪枝(Synapse Pruning):这种方法通可以在引擎侧规划特别的稀少核算 kernel 来完结加快,但往往依靠较高的压比率才干取得较好的加快作用。因而想要把这个才干充沛的使用起来,往往依靠较大的优化精力投入。全体来看,咱们认为剪枝相关的技能在逐渐的被结构查找(NAS)的方法所去代替,并逐渐将更多的技能资源搬迁至 NAS 方向的建造中。
  • 量化(Quantization):量化是广泛运用于咱们实践的事务场景中的一项模型紧缩技能。它一方面可以协助咱们紧缩模型尺度以减小模型下发的流量耗费和设备端存储耗费,比如说咱们可以用量化的方法对查找引荐模型中的 Embedding 的词表做模型的紧缩;另一方面,咱们也可以用量化的方法去做加快。因为许多硬件厂商所供给的指令集都支撑了 INT8 量化加快指令。所以量化是一个投入产出性价比较高的模型紧缩手段。
  • 编码(Coding):使用数据编码方法来进一步的减小模型的尺度,是在 xNN 引擎上线第一个模型时便引入的中心才干。咱们可以简略的经过稀少的表达存储方法往来不断做一个信息的存储;与此一起,xNN 规划了有效的编码算法,经过对AI的数据散布来完结更高的紧缩比率来迫临信息熵的极限。

结构查找:

网络结构查找(Network Architecture Search, NAS)正在 xNN 体系中逐渐取代许多单点模型紧缩才干。因为上述的紧缩算法往往会依靠于算法研制同学优化经历和重复测验迭代才干取得较优的作用,那么经过自动化的方法往来不断代替人工的优化和查找,对研制的效能协助很大。 在这个布景下,咱们也继续跟进并沉积了非常多的才干。比如说咱们经过 Black-box Optimization 完结自动化的超参查找,比如经过 Differiential NAS 这种可微的方法,或者是经过 one-shot NAS 的方法往来不断做模型紧缩。这些计划都广泛运用在咱们的事务场景中,并取得了很不错的实践作用,绝大多数场景都进一步超过了以往经过专家经历深度调优的模型方针。

模型转化:

这个阶段首要的作业是把咱们干流的深度学习训练结构所产出的模型转化为实践布置的 xNN 模型格局。整个的转化触及的各种图优化的进程对相关范畴同学都比较了解,咱们不做过多的介绍。 在此根底之上,围绕着蚂蚁事务中实践需求,也逐渐建造了非常多的增量功用。例如模型串联的需求,咱们做真实的做端智能的事务落地,会发现往往一个事务所需求的端智能的算法一般并不是由一个单一的模型就可以解决的,往往是由多个 AI 模型经过必定的算法逻辑串联而成。因而有没有办法把多个AI模型有效的串联到一个模型之中?假如可以,那咱们可以极大的削减算法研制同学和实践的工程布置同学之间的对接本钱,以及整个开发的生命周期。 因而咱们在编译阶段供给了相关的东西:模型串联东西协助把一些包含循环分支;动态化东西可以完结引擎功用、资源调度逻辑的动态发布;另外包含模型保护东西、端侧训练东西等等相关的一些才干,都伴随着事务的开展逐渐建造和完善起来。

核算引擎:

终究一块是核算引擎,这个也是咱们一般所称的端侧 AI 核算相关的一个中心模块。核算引擎在咱们 APP 的开发者的视角上来讲,咱们更多的是聚集于怎样寻觅高效的 kernel 完结,在访存密集型和核算密集型的核算使命上去做合理的优化和调整。在整个建造进程中,咱们针对不同的布置渠道,会有不同的差异化的一个优化战略。比如说在 CPU 和 GPU 上,咱们可以经过自己去完结定制化的高效 kernel 完结,来到达更优的作用。因而咱们会在这些渠道上去使用咱们的专家经历,针对中心算子做深度的优化,并会逐渐的以更自动化的算子编译的方法去做演进。 面对现在逐渐开展起来的 NPU 等 AI 芯片,咱们 APP 开发者往往不太可以具有非常深化底层的优化方法。因而这一块咱们会和各个芯片及硬件厂商会做较多协同,以期可以使用最大化的使用到端侧 AI 芯片的硬件加快算力。 以上是咱们在轻量化建模这个技能建造阶段下几个中心模块相关的简略介绍,下面是相关技能在事务场景中的作用评估,咱们首要重视在模型功用、模型尺度及精度表现。

轻量化建模总结 – 优化表现

xNN:蚂蚁端侧深度学习框架

  • 功用:xNN 核算引擎的功用继续对标业界多个优秀的开源引擎结构,一起咱们也围绕着自己的场景做定制油画,比如在定点 kernel 配合定点紧缩算法的定制计划可以在许多定点场景下,可以到达更具有竞争力的功用表现。
  • 尺度:模型尺度极大的影响到了模型下发的成功率,以及在端侧存储约束。咱们在实践的事务场景中,经过刚刚介绍的各种紧缩优化才干,线上模型遍及在百 KB 的量级。
  • 精度:模型紧缩往往会影响原始模型的精度,咱们也在继续重视和并在如量化算法上面的一些技能创新,并继续保持着在定点优化上面的优势。

以上是咱们整个对 xNN 轻量化建模阶段作业的简略总结。当然轻量化建模这件事情是需求继续优化投入的课题,咱们也会继续的在不同的中心技能点上去深度打磨。

端智能面对的问题及应战

端 AI 全体开展趋势及诉求

在构建 xNN 轻量化建模技能的进程中,咱们继续重视到整个端智能范畴的开展趋势。咱们去看当下的端智能范畴,和四五年前去刚开端做端智能的时分比较,现已有了一些适当大的改变。咱们会把全体端 AI 的一个开展诉求和趋势总结为下面三个视点:

  1. 从场景视点:咱们看到即便是在公司内部现已有越来越多样化的事务场景期望测验端智能来提高整个事务的一个作用。研制场景、研制人数及模型出产数量都比较于两三年前会有数倍数的添加。
  2. 从 AI 算法视点:这是一个蓬勃开展和高速演进范畴。比较开端的 DNN、CNN 网络结构,咱们看到了如 RNN、LSTM、Transformer 等新的网络结构规划的演进。这意味着端智能技能侧需求继续的了解以支撑好新的算法架构相关所发生的需求。
  3. 从 AI 芯片视点:在四五年前开端做端侧 AI 时仍是以 CPU 为主的算力支撑。但今天咱们再看终端算力环境,干流的旗舰机型往往都标配了像 NPU 的 AI 硬件加快器。这意味着关于支付宝这样的国民级 APP,咱们需求掩盖的用户的手机算力会从 GFlops 到 TFlocps、 3 到 5 个数量级的改变,算力的碎片化严重也意味着咱们很难到达共同性的事务表达。

范畴内技能的开展也带来短端侧 AI 中心诉求的改变。早期咱们会投入较多的资源来使用端智能才干完结事务价值。今天在越来越多的场景和算法研制现已证明了它的价值的根底之上,咱们要考虑的是怎样构建咱们的技能才干,让更多的事务可以高效的接入,并让已有的事务可以完结更为极致的优化。 这其间在重视算法研制布置功率的根底之上,一个中心的应战是算力的碎片化的问题。怎样把咱们端上现在现已有的更高的算力使用起来。是要去深化去探讨的问题。

轻量化建模:算力资源使用率低

咱们从算力资源使用率的视点来看一下轻量化建模首要的运用方法。在以往,轻量化建模期望产出极致轻量的一单一的模型。它其实意味着是什么呢?咱们要么放弃低端机的用户掩盖,要么咱们献身了高端机用户的体会。下面这张图是一个比较直观的比如。

xNN:蚂蚁端侧深度学习框架

咱们从 AI benchmark 网站上抽取部分高通渠道随着年份迭代的芯片算力的添加。咱们可以看到假如以重视机型掩盖为例,使得这个模型在不同的手机上都可以被它的算力所支撑,到达一个实时的体会作用。但也就意味着,关于许多新的干流机型,它分明有更高的算力,分明可以用更大模型来到达更好的体会,但却不可以做到。

怎样最大化 算力资源使用率?

因而咱们去考虑怎样最大化资源算力的一个使用率呢?那咱们考虑假如咱们可以在感知到要布置的具体设备时,能否定制化的够构建这个设备最优的模型。全体来看,咱们假如能经过多个模型做布置,就可以完结对全体算力使用率的提高。这是咱们最开端的动机,在这个动机之下,引出了咱们现在正在做的第二代 xNN 结构,并称之为可弹性建模。

xNN 2.0 可弹性建模

轻量化建模 -> 可弹性建模

比较于第一代的结构,咱们首要评论下这两个思路实质的技能差异是什么。在以往咱们追求一个单模型,期望在许多的或许的模型结构中去寻觅到一个最优解,因而在这个进程中,咱们的技能建造思路。一直围绕着对整个优化的途径上极致提高每一个优化东西的功用,来完结一个逐渐的迫临最优解的方法。

xNN:蚂蚁端侧深度学习框架

但是假如咱们想要把这样的形式运用在多模型的研制出产进程中,会存在许多问题。单模型的研制形式需求许多的人力资源的投入来做端到端的调优门槛,假如把这套形式复制到出产多个模型,意味着整个研制本钱会有O(N)的线性杂乱度的提高。因而咱们期望一种新的研制布置方法,他可以有高效的出产多个模型。意味着咱们每次的出产进程不是单一的出产最优的模型,而是出产一组在不同布置设备上别离最优的一个最优模型组的调集,即一个在多方针优化下的帕雷托前沿模型解几许。假如咱们可以完结这一步,也就意味着来说咱们可以一次性的产出一批模型,而这些模型可以别离针对咱们所要布置的设备来寻觅到它最优的模型结构。 根据这样一个可弹性建模的思路,咱们进一步考虑怎样出产高质量的、靠近实践出产环境所需的多模型。咱们认为多模型之间它不应该是一个无序的存在,它应该是在某些方面具有了必定的弹性性的。也便是说我或许在某方针上经过调整某一些中心的因子就可以完结。比如说咱们期望在不同的设备上具有功用上的改变。我调整这些因子就可以完结不同模型的产出,来到达功用上差异化。只要这些有序的弹性因子的发掘,才干有继续指导咱们做更高效的模型研制布置。所以可弹性建模其间的中心是可弹性变换因子的概念。

中心应战:算法研制门槛高

影响多模型方针的中心因子是不是一个相对清晰、确认的答案呢?很明显它是否定的。学术界的论文往往根据许多抱负假设、署理方针来做问题的建模,但是当地搬迁到实践工业场景中,问题就会变得适当杂乱,关于一个模型研制同学来讲的门槛是适当高的。 这里我会举两个实践的比如,也是咱们在实践的事务支撑进程中非常有体感的一些比如。比如说方才咱们说到了便是端侧 AI 算力的差异化,算力的改变可以经过核算精度的表达往来不断弹性。比如说高通的一些新款的设备现已可以支撑到 INT4 等混合精度的表达。 假如作为一个算法研制同学,想要把这个才干运用起来,完结不同功用的表达。那它整个进程中或许会遇到什么阻碍呢?咱们会发现,首要咱们需求底层的布置设备具有这样的一个才干,这本身便是设备差异极大的;一起向上整个的推理引擎侧要可以非常好的兼容设备的才干;一起咱们在整个模型编译的进程中,对设备所依靠的核算图表达做定制优化;咱们也依靠定点量化算法上去做一些新的规划;终究咱们更需求在整个的模型结构上对设备的功用有相应的了解,才干规划出设备友爱的模型结构。也就意味着,假如我想要真实的把推理表达精度的因子广泛运用起来的话,需求从上到下的一个各个层面上的协同,只要有充沛的协同,才可以把这个才干发掘到最大化。 另一个比如咱们从算法的视角来看,上文也说到了整个 AI 算法范畴也是在高速的开展的,许多使命都被 Transformer-based 模型结构刷到了一个更高的一个精度。咱们在自己的事务场景中会发现假如不针对 Transformer 结构做针对的优化,作用是不尽如人意的。那咱们再深化的去看这里边为什么呢?例如咱们去看 Transformer 里边的 MHSA 中心结构,想要把这个结构给充沛的运用起来:在做结构查找时咱们要考虑怎样针对这么多头注意力机制去查找可变的参数;一起考虑 MHSA 是否有可以全定点紧缩算法来到达落地时的功用加快;考虑咱们的硬件厂商所供给编译东西,是不是可以友爱的兼容 Transformer 结构等等;另一方面,假如咱们去自己去完结相关 kernel,咱们以往的完结有没有真实重视到这些结构所需求的一些中心算子。只要把这些东西全部的综合的考虑来看,咱们才干得到一个定论,说 Transformer 是不是更适合在某一款具体的 CPU/GPU/NPU 上去履行。否则,任何一环有了缺失,都会影响到终究定论的判断,进一步影响到算法研制作用天花板。 因而,假如咱们从算法研制的视角来看,想要让算法同学去了解这中间的每一环的范畴常识及技能依靠,本钱是适当高的。但假如咱们可以以因子的视角把这些影响因子所关联的各个层级的技能栈充沛的打通,并以一种高效的方法供给给到咱们的算法同学,完结面向不同设备的多模型建模,便是咱们期望建造的可弹性建模。

可弹性建模 – 接入体会

可弹性建模,是 xNN 面向下一代建模的建造思路。咱们期望做到的是什么呢?便是在以往单模型的算法研制的代码根底之上,仅仅经过少量的代码修改,就可以完结多模型建模的搬迁。举例来看,比如说咱们想要去构建多个模型以掩盖从 10ms 到 50ms 的规划方针,咱们只需求在原先的模型界说根底之上,添加一行语法糖去描绘 latency 方针的弹性范围。接下来,使用咱们所沉积的可弹性因子、或者是算法同学自研的自己的一些优化战略,将原先的静态模型结构变换为一个可弹性的查找空间描绘,终究使用结构的空间-算法解耦规划,运用适宜的查找算法完结终究模型的出产。

xNN:蚂蚁端侧深度学习框架
以这样的简洁的接入体会,咱们就可以在原先单模型研制脚本的根底之上,以一个相对低的接入门槛完结从单模型到多模型的扩展。 总结来看的话,咱们探究的可弹性建模期望围绕三个方针:

xNN:蚂蚁端侧深度学习框架

(1)对内咱们期望可以沉积那些中心的因子来完结跨场景的技能复用;(2)可弹性建模的结构需求时间考虑做跨层协同优化的规划,来提高模型端到端优化作用的天花板;(3)咱们一直要回归到咱们的用户-算法研制同学,只要让算法研制同学以最低的本钱来完结这个方针,咱们才可以把这个技能真实的转化到咱们的事务之中去。所以便是方才所说到的整个的研制界面。咱们经过一个更友爱的规划来紧紧的透出咱们事务所期望的弹性的方针和空间,便可以完结整个建模作业。这是咱们期望可以在未来的一段时间内继续去建造和优化的才干,来提高咱们整个事务的作用。 终究我简略跟咱们做一个总结,咱们首要从三个方面共享了 xNN 团队在技能建造中的考虑和沉积:首要是第一代才干建造轻量化建模中的结构查找、模型紧缩、模型转化、推理引擎,它也是咱们当下和未来也会继续去优化的;其次,咱们根据现在事务场景、AI 算法高速开展及端侧 AI 算力碎片化问题,界说了新的技能应战;终究咱们测验着去建造咱们第二阶段的可弹性建模才干。经过一个低门槛的、设备感知的多模型研制结构,进一步提高咱们对端 AI 算力的发掘。