共计 4807 个字符,预计需要花费 13 分钟才能阅读完成。
简介
在人工智能技术不断深入倒退的明天,咱们对于计算的性能要求越来越高。传统的计算解决少数是基于云侧的,把所有图像、音频等数据通过网络传输到云核心进行解决后将后果反馈。然而随着数据的指数式增长,依附云侧的计算曾经浮现了诸多有余,例如数据处理的实时性、网络条件制约、数据安全等,因而端侧的推理则愈发重要。
在这样的背景下,网易有道 AI 团队自主设计研发了高性能端侧机器学习计算库——EMLL(Edge ML Library),并已在近日开源。
EMLL 为减速端侧 AI 推理而设计,提供基于端侧处理器的高性能机器学习计算库,反对 fp32、fp16、int8 等数据类型,已在网易有道词典笔、翻译王和超级词典等智能硬件产品的 NMT、ASR、OCR 引擎中利用,大幅提高计算性能,晋升用户体验。
开源地址:https://github.com/netease-yo…
一、端侧 AI
端侧 AI 具备以下劣势:
- 低延时
- 保证数据隐衷
- 不依赖网络
端侧 AI 挑战:
- 处理器算力无限,远低于云端计算能力,如何满足日益简单的端侧 AI 性能的需要至关重要
- 内存大小和带宽无限,对性能影响至关重要
ARM 处理器在智能设施中占主导地位,是端侧 AI 落地的支流平台。NPU、DSP、GPU 能够提供更高的计算能力,在端侧 AI 上有肯定的利用场景,但生态环境较差,间隔成熟还须要工夫。
端侧 AI 最耗时的计算为全连贯 (FC) 和卷积计算,底层外围计算为矩阵乘,底层计算库的性能对端侧 AI 是否落地起决定性作用。
二、ARM 第三方 BLAS 库
Eigen
线性代数运算的 C++ 模板库,矩阵的运算可间接用符号做。
OpenBLAS
由中科院计算所保护的一个开源的高性能 BLAS 库,基于 Kazushige Goto 的 GotoBLAS,反对 Fortran BLAS 和 CBLAS 接口调用。
ARM Compute Library
ARM 官网推出的计算库,反对 AI 的常见运算,其中矩阵乘法运算以模型推理层的模式封装,须要先初始化后能力调用。
表 1 - 各 ARM blas 库矩阵乘法特点:
惯例矩阵规模上的矩阵乘法进行了较好的优化,性能体现较好,而后在扁平矩阵上性能体现较差。端侧 AI 底层计算次要为扁平矩阵的乘法,第三方计算库性能体现较差,没有充分发挥硬件的性能,不利于 AI 利用在端侧平台上落地。
表 2 ARM cortex-A53 四核第三方库 GEMM 计算效率:
注:C(M, N) = A(M, K) * B(K, N),以上值取全行主序和全列主序的最好值,测试在雷同的矩阵上反复 128 次,计算效率由 GEMM 计算 FLOPS 值除以硬件实践 FLOPS 值得到。
三、EMLL 特点
高性能
EMLL 实现的矩阵乘法函数,为端侧人工智能中常见的扁平矩阵的计算做了专门的优化,为各常见 ARM 处理器做了特定的优化。对于 cortex-A7/A35/A53/A55/A76 处理器,本库依据它们的流水线特点,应用了汇编级别的优化。
EMLL 少数状况下绝对 Eigen、ARM compute Library 第三方库性能晋升显著,尤其在端侧 AI 罕用的扁平矩阵乘法中取得数倍的性能晋升。下图展现了端侧 AI 中局部典型矩阵尺寸状况下得单精度矩阵乘法的性能后果。
图 1 EMLL 矩阵乘法性能
易用性
EMLL 应用的函数接口在参数设计上力求简洁间接,矩阵乘法去掉了不罕用的 LD* 参数,矩阵和向量的传递通过指针和整数维度别离传递。本库不依赖第三方计算库。
扩展性
对于矩阵乘法和量化函数,EMLL 库提取了它们和架构无关的代码作为通用的宏,这些宏能够在反对新的 CPU 架构时大大节俭所需的代码量。
EMLL 性能优化办法
在端侧设施上优化计算库的性能,须要从访存效率和计算效率两个角度思考,上面以(浓密)矩阵乘法为例,介绍 EMLL 采纳的优化办法。
分块
矩阵乘法的计算过程中须要频繁地访存。当矩阵规模较大时,CPU 缓存容量不足以装下其全部内容,访存时就会频繁呈现缓存缺失,升高程序效率。此时,EMLL 会对矩阵乘法问题进行必要的拆解,把较大的矩阵切分成小块的矩阵,这就是分块的伎俩。通过切分,每个子工作只计算一小块矩阵对后果的奉献,只会密集拜访这个小块矩阵的区域,大大提高了缓存命中率。对于两个较大矩阵之间的乘法,EMLL 参照已有的优化工作 [1],通过多级的分块,充分利用 CPU 多级缓存,次要采纳如下两种切分形式:
图 2 分块办法
L1 – L3 代表不同矩阵块所利用的 CPU 缓存
CPU 的寄存器能够看成“速度最快的缓存”。为了充分利用寄存器,在上述分块的根底上,EMLL 进行了进一步拆分,右边的小矩阵拆成 m×k 的最小矩阵 a1,左边的小矩阵拆成 k×n 的最小矩阵 b1。计算这一对最小矩阵的乘法,如果间接用三重循环的形式,须要 2×m×n×k 次元素拜访,如果不利用寄存器,则都为访存操作;利用了寄存器,则只须要在乘法开始前把两个小矩阵放到寄存器中,后续的乘法就不再访存,使访存缩小到 (m + n) ×k 次。
综上,大尺度的分块能够进步 CPU 各级缓存的利用率,小尺度的分块能够利用 CPU 寄存器以缩小访存次数,两者对性能均有显著帮忙。
重排
上文提到,为了充分利用寄存器,子矩阵块的读取被划分为更小的小块 m×k 或 k×n (1 < m, n, k < 20),计算中一一读取这些小块。而通常状况下,矩阵在内存中的存储形式为行主序或列主序。无论哪种存储形式,按小块读取会存在很多跳跃拜访的状况。跳跃拜访对性能不利,这里列举三点:
- 耗费额定的缓存带宽:L2/L3 缓存与 L1 的数据交互以缓存行的模式进行。跳跃拜访 L2/L3 缓存的数据时,缓存行数据的利用率低,节约传输带宽。
- 无奈充分利用向量化的加载单元:很多反对 SIMD 的 CPU 上装备了向量化的加载单元,反对一条指令加载若干个地址间断的元素,若是跳跃拜访则没法利用此个性。
- 减少页表查问的开销:访存操作常波及虚拟地址向物理地址的转换,须要查问页表。一个页表的笼罩地址范畴无限。如果跳跃的步长过大,则需频繁查问新的页表。
在两个子矩阵块的乘法中,每个子矩阵块通常会被读取屡次,每次读取的程序能够雷同。B 的子矩阵块在与它相乘的 A 块的行数多于 m 时会被读屡次;A 的子矩阵块在与它相乘的 B 块的列数多于 n 时会被读屡次。EMLL 参照已有的优化工作 1,在计算开始前,将两个子矩阵块先按计算时的读取程序(即上一段所述按更小的小块读取)重新排列元素,这样计算时对两个子矩阵块的拜访全副变成了程序拜访,此即重排的优化办法。尽管计算前重新排列元素会有额定的开销,但计算过程中对矩阵块的屡次拜访被程序化后的收益更大,因而带来总体的性能晋升。
对于非凡尺寸的矩阵,重排的开销可能大于收益,须要选择性地重排或不重排[2]。当源矩阵 A 的行数 M 很少而源矩阵 B 较大时,B 的子块被反复读取的次数大大降低,对 B 的子块重排的收益大大降低,甚至开始低于开销。这种状况在端侧 AI 推理中十分广泛。EMLL 会判断 M 的大小,当 M 小于一个阈值时,对矩阵 B 不再重排,而是调整计算程序,对 B 的所有元素进行程序的一次读取。相似地,当源矩阵 B 的列数 N 显著偏小时,EMLL 对矩阵 A 不再重排,调整计算程序,对 A 的元素一次程序读完。通过对非凡尺寸矩阵的特地解决,EMLL 在这些尺寸上的性能显著超过了 Eigen 和 OpenBLAS 等开源库。
汇编优化
现今支流的 CPU 为了进步数据计算的效率,反对了“单指令多数据”(SIMD)的解决模式,即一条指令对多个数据进行雷同的操作。调用 SIMD 指令集,能够在不减少指令吞吐量的状况下,进步数据计算的吞吐量。ARM 平台提供了 NEON 指令集反对 SIMD 操作。
当 m = n = 4 而 k = 1 时,做最小矩阵小块之间的乘法并累加后果,如果应用标量计算,须要 16 次乘法和 16 次加法。NEON 指令集提供了播送模式的交融乘加操作,只需 4 条指令,即可实现雷同的工作,如下图所示。其余 m,n 和 k 的取值,大多也能够用 NEON 指令减速运算。NEON 指令能够通过汇编的形式显式调用,也可通过编译器提供的 intrinsics 函数调用,后者可读性更好但性能指标的不确定性更大。
端侧的中低端平台装备的处理器,为了节省成本和功耗,在执行外围通常砍掉了乱序执行的能力,而是严格依照指令在指令流中的程序来执行它们,如 ARM 的 cortex-A7, A35, A53, A55 等。局部型号的处理器能够在程序执行的前提下同时执行相邻的两条指令。对于这些处理器,指令之间如果存在数据依赖或者执行单元抵触,则指令的程序会对性能产生显著的影响,若谋求极致性能,须要在汇编级别重排相干的指令。对于存在数据依赖的两条指令(比方一个运算指令的输出依赖于另一个加载指令的后果),应尽可能地使它们远离,防止因依赖关系的期待造成流水线闲暇。
四、EMLL 性能
反对的计算函数
表 3 反对的计算函数:
反对的架构
armv7a, armv8a
反对的端侧操作系统
Linux, Android
五、利用案例
网易有道词典笔,是网易有道打磨的一款学习型智能硬件,凭借高效、精确查词和丰盛、权威内容,成为 AI 技术在学习畛域利用落地的优良产品。网易有道词典笔,具备“多行扫描翻译”性能,反对整段翻译的智能学习硬件。
网易有道超级词典打造高效的智能英语学习零碎,强化端侧性能,提供了拍照学英语、查词翻译、背单词、听力练习、对话翻译、语音助手等性能。
网易有道翻译王反对 43 种语言互译,畅游寰球 191 个国家和地区,反对 21 种语言在线、7 种语言端侧拍照翻译,指示牌、菜单等即拍即译。
网易有道词典笔、超级词典、翻译王均内嵌了网易有道自主研发的神经网络翻译 NMT、光学字符识别 OCR、语音辨认 ASR、语音合成 TTS 等业内当先的 AI 技术,并且反对离线性能。
网易有道自研端侧机器学习计算库已在网易有道词典笔、超级词典、翻译王等智能硬件产品中应用,带来以下益处:
- 端到端性能绝对于应用 eigen 库减速 1.3 到 2.43 倍,效果显著,大大降低了端侧推理引擎的提早。除了在有道智能硬件带来了较好的性能晋升,咱们在配置骁龙 855 的某款手机上也做了性能测试,端到端性能绝对于 eigen 晋升了 25%-55%,成果显著。
- 端侧推理引擎采纳 EMLL 之后,能够上线更大的 AI 模型,提高质量,并保障实时性,如端侧 NMT 品质 (BLEU) 晋升 2 个点,端侧 ASR 准确度晋升 4.73%。
- EMLL 能够保障在更低端芯片上实时性,如在 cortex-A7 上应用 Eigen 库无奈达到实时性,应用 EMLL 之后提早大幅升高,并保障实时性成果。EMLL 能够让智能硬件更多的芯片抉择,从而降低成本,进步市场竞争力。
表 4 测试平台:
图 3 端侧 NMT、ASR、OCR 在不同平台上应用 EMLL 和 eigen 端到端性能减速比
EMLL 高性能端侧机器学习计算库,曾经在网易有道多款智能硬件产品中理论利用并获得显著的成果,大幅晋升性能,给用户带来更好的产品体验。
将来,网易有道将继续保护和优化 EMLL,帮忙更多企业、科研机构等搭档晋升端侧 AI 计算能力。欢送各位开发者敌人应用并提出宝贵意见。
参考文献
[1] Eigen:http://eigen.tuxfamily.org/
[2]OpenBlas: https://github.com/xianyi/Ope…
[3]ARMComputeLibrary: https://github.com/ARM-softwa…
[4] Goto K., et al. Anatomy of High-Performance Matrix Multiplication[J]. ACM Trans. Math. Softw., 2008, 34(3), 12:1-12:25.
[5] Frison G., et al. The BLAS API of BLASFEO: optimizing performance for small matrices[J]. ACM Trans. Math. Softw., 2020, 46(2), 15:1-15:36.
开源地址:https://github.com/netease-yo…