关于开源框架:开源-2-年半除了性能优化我们啥也没做
性能优化是个非常宽泛的话题,它波及 CPU、内存、磁盘、网络等方面。MegEngine 作为一个训推一体的深度学习框架,也在继续一直摸索性能优化的最优解。 本篇整顿了 Bot 过往公布的相干文章,心愿能帮忙大家更好的了解和把握 MegEngine 应用技巧。 工欲善其事必先利其器学会使用性能评测工具提到性能优化,笔者认为性能优化人员的技术水平大略可被分为以下三类: “瞎着写“。这类技术水平的人员个别不会在意其余,遇事先上”三板斧“,如循环展开,向量化,指令重排。性能好往往也不知其所以然,性能不好也没有什么后续的优化思路。”摸着写”。这类技术水平的人员与第一类的一个显著的分水岭是学会使用性能评测工具,通过工具可能摸到程序的瓶颈在何处,而后进行对应的优化。”瞄着写“。这类人员有了量化分析程序性能的能力。当面临同一个程序的多种写法时,可能做到即便不实在实现程序,也能较为精准的算进去哪种写法性能更好。须要留神的是以上三类人员所用的技术是逐级蕴含的关系,例如第三类人员同样把握性能评测工具的应用办法和”三板斧“式的优化办法。正所谓工欲善其事必先利其器,其实只有达到第二类的程度,性能优化人员才初步具备独立优化能力,所以性能评测工具的把握至关重要。如果你对性能优化中一些基本概念还不够理解,且对以下问题也有雷同的疑难: 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 体系结构的了解水平的优良考题。 ...