关于开源框架:开源-2-年半除了性能优化我们啥也没做

3次阅读

共计 4218 个字符,预计需要花费 11 分钟才能阅读完成。

性能优化是个非常宽泛的话题,它波及 CPU、内存、磁盘、网络等方面。MegEngine 作为一个训推一体的深度学习框架,也在继续一直摸索性能优化的最优解。

本篇整顿了 Bot 过往公布的相干文章,心愿能帮忙大家更好的了解和把握 MegEngine 应用技巧。

工欲善其事必先利其器

学会使用性能评测工具

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

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

须要留神的是以上三类人员所用的技术是逐级蕴含的关系,例如第三类人员同样把握性能评测工具的应用办法和”三板斧“式的优化办法。正所谓工欲善其事必先利其器,其实只有达到第二类的程度,性能优化人员才初步具备独立优化能力,所以性能评测工具的把握至关重要。如果你对性能优化中一些基本概念还不够理解,且对以下问题也有雷同的疑难:

  • Python 及 C/C++ 拓展程序的常见的优化指标有哪些;
  • 常见工具的能力范畴和局限是什么,给定一个优化指标咱们应该如何抉择工具;
  • 各种工具的应用办法和后果的可视化办法;

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

学会根本的性能优化方法论

学会了使用性能评测工具之后,还须要理解根本的性能优化方法论,而后就根本具备独立优化能力了。性能优化很多时候就是 一直迭代 的过程:

以 ARM Cortex a55 上的 GaussianBlur 优化为例,一起看《ARM 算子性能优化上手指南》

作为深度学习框架,模型训练速度很重要

解决系统算子工夫占比高的问题

家喻户晓,很多深度学习模型中都有相似 element-wise 的散碎操作。例如加减乘除算术运算和神经网络中的激活函数,以及 BatchNormalization 在模型推理的时候个别也被优化成一系列的 element-wise 操作。

这些散碎的操作具备计算访存比低的特点,即其计算量较低然而访存量较高,是一种典型的内存受限 (memory bound) 的操作。算子交融 (kernel fusion) 是针对内存受限的算子的常见优化伎俩。然而这些散碎算子的计算模式泛滥,这些计算模式互相组合将会是指数级别的,依附手工写代码进行针对性优化是不事实的。MegEngine 通过引入 JIT 和主动代码生成技术解决计算模式组合爆炸的问题,从而享受到 kernel fusion 带来的性能收益,详见《JIT in MegEngine》。

晋升多机多卡训练效率

从 2080Ti 这一代显卡开始,所有的民用游戏卡都勾销了 P2P copy,导致训练速度显著的变慢。针对这种状况下的单机多卡训练,MegEngine《利用共享内存实现比 NCCL 更快的汇合通信》算法,对多个不同的网络训练绝对于 NCCL 有 3% 到 10% 的减速成果。

MegEngine v1.5 版本,能够手动切换汇合通信后端为 shm(默认是 nccl),只须要改一个参数。

gm = GradManager() 
gm.attach(model.parameters(), callbacks=[dist.make_allreduce_cb("sum", backend="shm")]) 
# 目前只实现了单机版本,多机暂不反对

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

云侧

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 上的测试速度为:

无关 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 优化办法(传统图优化)的推理工夫体现对比方下图:

全局图优化能解决哪些问题?如何应用?以及底层技术原理解析。能够看:《全局图优化:晋升 MegEngine 模型推理性能的又一神器》

【很重要的补充阐明】

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

据他们说:以上提到的技术点,相对不是开源至今所有的重点工作;还有更多性能优化工作,只是没有被整顿成文章而已。

所以,欢送大家留言本人感兴趣的内容方向,在线催更~~

GitHub:MegEngine 旷视天元(欢送 star~

Gitee:MegEngine/MegEngine

MegEngine 官网:MegEngine- 深度学习,简略开发

欢送退出 MegEngine 技术交换 QQ 群:1029741705

正文完
 0