功能优化是个非常广泛的论题,它触及 CPU、内存、磁盘、网络等方面。MegEngine 作为一个训推一体的深度学习结构,也在继续不断探究功能优化的最优解。

本篇整理了 Bot 过往发布的相关文章,期望能协助咱们更好的了解和把握 MegEngine 使用技巧。

工欲善其事必先利其器

学会使用功能评测东西

提到功能优化,笔者以为功能优化人员的技能水平大概可被分为以下三类:

  1. “瞎着写“。这类技能水平的人员一般不会在意其他,遇事先上”三板斧“,如循环展开,向量化,指令重排。功能好往往也不知其所以然,功能欠好也没有什么后续的优化思路。
  2. ”摸着写”。这类技能水平的人员与第一类的一个显著的分水岭是学会使用功能评测东西,通过东西能够摸到程序的瓶颈在何处,然后进行对应的优化。
  3. ”瞄着写“。这类人员有了量化剖析程序功能的才能。当面对同一个程序的多种写法时,能够做到即便不真实完成程序,也能较为精准的算出来哪种写法功能更好。

需求留意的是以上三类人员所用的技能是逐级包括的联络,例如第三类人员同样把握功能评测东西的使用办法和”三板斧“式的优化办法。正所谓工欲善其事必先利其器,其实只有达到第二类的水平,功能优化人员才初步具有独立优化才能,所以功能评测东西的把握至关重要。假如你对功能优化中一些根本概念还不够了解,且对以下问题也有相同的疑问:

  • Python 及 C/C++ 拓宽程序的常见的优化方针有哪些;
  • 常见东西的才能规模和限制是什么,给定一个优化方针咱们应该怎么挑选东西;
  • 各种东西的使用办法和结果的可视化办法;

《profiling 与功能优化总结》将会是一个很好的总结性材料。

学会根本的功能优化办法论

学会了使用功能评测东西之后,还需求了解根本的功能优化办法论,然后就根本具有独立优化才能了。功能优化许多时分就是不断迭代的过程:

开源 2 年半,除了性能优化我们啥也没做

以ARM Cortex a55 上的 GaussianBlur 优化为例,一同看《ARM 算子功能优化上手攻略》

作为深度学习结构,模型练习速度很重要

处理琐细算子时刻占比高的问题

众所周知,许多深度学习模型中都有类似 element-wise 的散碎操作。例如加减乘除算术运算和神经网络中的激活函数,以及 BatchNormalization 在模型推理的时分一般也被优化成一系列的 element-wise 操作。

这些散碎的操作具有核算访存比低的特色,即其核算量较低可是访存量较高,是一种典型的内存受限(memory bound)的操作。算子融合(kernel fusion)是针对内存受限的算子的常见优化手段。可是这些散碎算子的核算方式很多,这些核算方式相互组合将会是指数级别的,依托手工写代码进行针对性优化是不现实的。MegEngine 通过引进 JIT 和自动代码生成技能处理核算方式组合爆破的问题,然后享受到 kernel fusion 带来的功能收益,详见《JIT in MegEngine》。

作为一个训推一体的结构,推理速度同样重要

云侧

GPU CUDA 矩阵乘法

单精度矩阵乘法(SGEMM)几乎是每一位学习 CUDA 的同学绕不开的事例,这个经典的核算密集型事例能够很好地展现 GPU 编程中常用的优化技巧,而能否写出高效率的 SGEMM Kernel,也是反映一位 CUDA 程序员对 GPU 体系结构的了解程度的优异考题。

在《CUDA 矩阵乘法终极优化攻略》一文中,详细介绍了 CUDA SGEMM 的优化手段,合适仔细阅读过《CUDA C++ Programming Guide》、具有必定 CUDA 编程根底的同学阅读。

TensorCore 卷积算子完成

2020 年 5 月 Nvidia 发布了新一代的 GPU 架构安培(Ampere)。其中和深度学习联络最亲近的莫过于功能微弱的第三代的 TensorCore ,新一代的 TensorCore 支撑了更为丰富的 DL(Deep Learning)数据类型,包括了新的 TesorFloat-32(TF32),Bfloat16(BF16)核算单元以及 INT8, INT4 和 INT1 的核算单元,这些核算单元为 DL 推理提供了全面的支撑。为了发挥这些核算单元的才能,以往会由资深的 HPC 工程师手写 GPU 汇编完成的卷积、矩阵乘算子来挖掘硬件的才能。可是凭仗人力手工优化算子的办法已经没有办法应对如此多的数据类型,因而关于 DL 使用的优化渐渐地越来越依赖一些自动化的东西,例如面向深度学习范畴的编译器。在这样的趋势下,Nvidia 开发了线性代数模板库 CUTLASS ,笼统了一系列高功能的根本组件,能够用于生成各种数据类型,各种核算单元的卷积、矩阵乘算子。

MegEngine 在 CUTLASS 的根底上进行了二次开发,能够高效地开发新的高功能的算子,快速地迁移到新的 GPU 架构。一文看懂 《MegEngine CUDA 渠道的底层卷积算子的完成原理》。文中还有对 Nvidia CUTLASS 的 Implicit GEMM 卷积文档进行解读和弥补。

端 & 芯侧

CPU 卷积常见优化手段

卷积核算优化作为CV 模型推理功能优化中最重要的一项作业,CPU 上 Inference 中有关卷积的优化有许多的途径。

MegEngine 通过完成 Im2col+matmul 卷积以及 Winograd 卷积中的一些进一步优化的技能手段,进一步加快了卷积核算的功能,然后加快整个模型的 Inference 功能。

如在 Float32 的经典网络敞开相关优化后,在骁龙 855 上的测试速度为:

开源 2 年半,除了性能优化我们啥也没做

有关 Im2col 和 Winograd 算法的完成以及优化办法,见《MegEngine Inference 卷积优化之 Im2col 和 winograd 优化》

从数字信号范畴获得的启发

在数字信号和数字图画范畴, 对频域的研讨是一个重要分支。 咱们日常“加工”的图画都是像素级,被称为是图画的空域数据。空域数据表征咱们“可读”的细节。假如咱们将同一张图画视为信号,进行频谱剖析,能够得到图画的频域数据。完成图画空域和频域转换的东西,就是傅立叶改换。因为图画数据在空间上是离散的,咱们使用傅立叶改换的离散方式 DFT(Discrete Fourier Transform)及其逆改换 IDFT(Inverse Discrete Fourier Transform)。Cooley-Tuckey 在 DFT 的根底上,开发了更快的算法 FFT(Fast Fourier Transform)。

DFT/FFT 在深度学习范畴也有延伸使用。 比如利用 FFT 能够降低卷积核算量的特色,FFT_Conv 算法也成为常见的深度学习卷积算法。

适配移动端 CPU 的场景

理论优化时,咱们总会挑选更好的设备去核算理论上限。但在实践使用时,算力较弱的移动设备,怎么承载模型推理的运算?

一般以为,让模型运转于 GPU 上会比运转于 CPU 上具有较大的优势,获得可观的功能提高。这通常是真实状况,可是,在工程实践中咱们也发现,关于某些模型维度较小的模型,在移动设备上,GPU 运转并没有带来功能的提高,并且还额定引进了兼容性的问题。所以,在某些使用场景下,咱们需求以 CPU 为运转载体,尝试各种办法,以提高模型推理功能。

在《根据 MegEngine 移动端 CPU 的深度学习模型推理功能优化》一文中,作者总结了自己在工程实践中,根据 MegEngine 推理引擎,发现的 2 有效的优化办法“NCHW44 和 Record”的原理及使用办法做了详细说明。

假如你在 MegEngine 的使用过程中也有自己共同的技巧,欢迎联络 Bot(微信号:megengine-bot)投稿,还有多种社区周边相送哦~

比较于功能,易用性也不可或缺

Fast-Run 算子自动挑选结构

为处理实践生产条件下,用户的 NN 网络千差万别的状况。在同一类数学核算中,开发者们会开发多种高效的算法,分别适用于不同的参数,以确保网络的功能。接下来开发者们需求处理一个新问题,当核算参数确定今后,怎么让最快的算法履行该核算。

大部分结构靠先验的经历挑选算法,MegEngine 亦总结有优异的先验经历值,完成核算时自动挑选算法。可是依托经历不能确保必定挑选了最快的算法。许多实践场景中,用户期望网络有最极致的功能。为此,MegEngine 设计了专门的流程 – Fast Run,能够为每个核算自动挑选最快的算法,然后确保整个网络的运转时刻最短。

原理及使用办法见《Fast Run:提高 MegEngine 模型推理功能的神奇功能》

大局图优化自动挑选张量排布格局

为了在不同的使用场景上都能表现出不错的功能,MegEngine 中的张量(Tensor)具有不同的排布格局(Format),不同存储格局在不同的输入数据和不同硬件渠道上的功能也不相同。大局图优化从整个模型的角度决议计划模型的哪一部分转换成哪种存储格局能使得整个模型的功能最优,避免给用户带来冗杂的挑选和权衡然后导致额定的心智担负。同 Fast Run 一样,大局图优化也是可挑选敞开的优化选项。

在 int8 模型上,通过大局图优化和 MegEngine 原 Format 优化办法(传统图优化)的推理时刻表现对比如下图:

开源 2 年半,除了性能优化我们啥也没做

大局图优化能处理哪些问题?怎么使用?以及底层技能原了解析。能够看:《大局图优化:提高 MegEngine 模型推理功能的又一神器》

【很重要的弥补说明】

在 Bot 把这篇内容给技能同学看的时分,被投诉:以偏概全!

据他们说:以上提到的技能点,肯定不是开源至今所有的重点作业;还有更多功能优化作业,只是没有被整理成文章罢了。

所以,欢迎咱们留言自己感兴趣的内容方向,在线催更~~