品质、信誉、安全 —— 耀世娱乐平台
您当前的位置: 首页>新闻资讯
  Business

耀世平台新闻

新闻资讯

耀世平台商办注册登记加速还能不掉点!广度导出MegEngine4bits定量开放源码同时实现

来源:147采集 作者:耀世娱乐 发布时间: 2022-09-23 7 次浏览

随着广度自学的产业发展,其应用领域情景也愈发的广为与多样化。那些多元化的情景常常会对前述的布署提出更为订制化的管制。比如,自动驾驶电动汽车对消化系统辨识的精确度明确要求的确比人脸辨识鸟类进行分类的精确度明确要求更为苛刻,因为两者的应用领域情景和严重错误预估增添的不良后果迥然不同。那些订制化增添的差别,对前述布署的数学模型在精确度、速率、内部空间挤占上有更具体文本的明确要求。在很多情景中由于布署的电子设备INS13ZD较弱、缓存较细,引致对数学模型的速率和内部空间挤占具备严格明确要求,而经过定量的数学模型具备速率快、内部空间挤占小的优点,不可否认能满足用户这种市场需求。

因此定量数学模型被广为使用在逻辑推理侧,定量也成为了一个重要且非常活耀的研究应用领域领域。上周,MegEngine 开放源码了 4 bits 的定量的有关文本,通过 MegEngine 4 bits 定量同时实现的 ResNet-50 数学模型在 ImageNet 数据K568的精确度表现与 8 bits 定量数学模型相差不大,因此速率是 TensorRT-v7 8 bits ResNet-50 数学模型的逻辑推理速率的 1.3 倍。此次课堂教学为 MegEngine 累积了 4 bits 定量的有关实战经验。同时,MegEngine 决定将 4 bits 定量的有关标识符开放源码,为大家提供可参照的完备计划,促进在更低BCC逻辑推理应用领域领域的积极探索与产业发展。

大背景

广度自学应用领域领域的数学模型定量是将输出从已连续或其他非常大的值集束缚到离散集的过程。定量具备下列三点竞争优势:

  • 在存储内部空间上,相对 FLOAT 的 32 bits 的大小不一,定量值挤占的内部空间更小。

  • 在操控性上,各种类型排序电子设备对定量值的排序资源要低于 FLOAT 的排序资源。

本文中提到的 n bits 定量,就是将 FP32 的数据束缚到 n bits 表示的整型数据的过程。定量依据数据的映射特征可以分为线性定量和非线性定量,MegEngine 中采用的是线性定量,使用的定量公式和反定量公式如下:

其中,Q是定量方法,r是真实获取的输出FLOAT值,S是FLOAT类型的缩放因子,Z是INT类型零点。

图2 4 bits 对称线性定量

图1 4 bits 非对称线性定量

如图 1 所示,MegEngine 用数据类型 UINT4 表示 4 bits 的非对称线性定量,定量值的取值范围为[0,15];当 Z 取 0 时即为对称线性定量,此时 4bits 定量值的取值范围为[-8, 7],在 MegEngine 中用数据类型 INT4 表示,如图 2 所示。

目前 8 bits 定量数学模型在一些情景下被业界广为运用,我们想去了解 4 bits 定量数学模型的落地的可能性。这要解决两个问题:一方面,4 bits 定量数学模型的精确度要如何保证;另一方面,4 bits 定量数学模型的速率能提升多少。要解答这两个问题,需要算法研究员和工程开发人员的通力协作进行验证。整件事情投入高,收益不明确。我们想找到开放源码标识符,快速从原理层面对这两个问题有个判断,但经过调研发现目前并没有 4 bits 定量有关开放源码文本可供研究参照。所以,MegEngine 决定开发 4 bits 定量并解答这两方面的问题。

缓解精确度下降

保证 4 bits 定量数学模型的精确度是重中之重,如果数学模型精确度无法满足用户市场需求,则 4 bits 定量的开发将毫无意义。为了避免精确度的大幅下降,MegEngine 采取的举措是输出和输出采用非对称定量 UINT4,weights 采用对称定量 INT4,bias 采用 FP32。接下来,从排序公式的推演上,来看这样设计的合理性:

FP32 原始排序一次卷积输出结果的公式:

结合公式 [1]、[2] 推导的 4 bits 定量的公式:

优化之后的公式:

在上述公式中,ZI、ZW 是否等于 0,表明输出/输出和 weights 采用 INT4 还是 UINT4。因此在该公式中,除了Q(Ii) 的值需要逻辑推理时确定,其余值均可在逻辑推理前获得。所以,依据数据的排序优点,将这个公式分为了三个部分,分别用三种颜色表示:

  • 黑色表示无论输出/输出以及 weights 数据类型如何选择,一定有的排序量。因为无法避免,所以不用考虑这部分的数据优点。

  • 蓝色表示可以在逻辑推理前排序好的数据。

  • 红色表示必须在逻辑推理时才能排序的数据。

逻辑推理前可以排序好的这部分数据可以提前排序并融合进 bias 中加入后续排序,所以 bias 必须用 FP32 数据类型表示,否则精确度会大大降低。

至于输出/输出以及 weights 的数据类型选择,结合上述公式可以推导得出:

  • 全用 INT4 时,即ZI、ZW 均等于 0, 排序量最小,只有黑色部分公式。

  • 输出/输出用 UINT4,weights 用 INT4,即ZI 不等于 0,ZW 等于 0 时,会增加蓝色公式部分的排序量,但是这个部分是可以提前运算好的,对整体排序时间影响不大。

  • weights 用 UINT4,即ZW 不等于 0 时, 会增加红色公式部分的排序量,会对整体的排序时间增添非常大影响。

由于 ResNet-50 数学模型 conv_relu 算子中的 relu 操作,输出/输出层的数据比较符合非对称的优点,采用非对称定量能更好地保留数据信息减少精确度损失,所以输出/输出应该选择 UINT4,排除了上面三种计划中的第一种。第三种计划排序量会大很多,但是对精确度的收益并不明显。所以,最终选择输出和输出采用非对称定量 UINT4,weights 采用对称定量INT4的计划。

缓解精确度下降

提升数学模型操控性并非一个简单的因为排序电子设备的 4 bits INS13ZD大于 8 bits INS13ZD,所以易知......的推导,排序电子设备 4 bits INS13ZD大于 8 bits INS13ZD是已知的,但是需要一些方法将这部分的INS13ZD兑现,INS13ZD需要合适的算子释放出来,其次,4 bits 定量所追求的也并非在某个算子的操控性上超过 8 bits 定量,而是在数学模型层次超越 8 bits 定量。考虑到ResNet-50 数学模型以及卷积算子非常具备代表性,我们最终决定用 ResNet-50 数学模型作为基准测试数学模型。经过对数学模型的分析,发现 ResNet-50 数学模型的操控性瓶颈主要集中在两个方面:

  • 小算子比如 relu、add 较多,那些细琐算子增添的启动以及带宽上的开销非常大。

  • conv 排序非常多,挤占了全图 80% 以上的运算时间。

为解决这两方面的瓶颈,MegEngine 做了下列两个方面的优化工作:图层次的算子融合以及算子层次的优化。

算子融合优化

MegEngine 通过对排序图进行扫描匹配,并将匹配到的图结构替换为优化后的图结构。ResNet-50 数学模型所用的两种 pass 转换如下图所示:

图3 两种Pass优化方法

图 3 中的大方块表示图中各种算子,小方块表示那些算子的读/写数据操作以及启动开销。从图中可以看到经过算子融合的优化可以有效减少算子的读/写数据的操作以及启动开销。

将这两个 pass 应用领域于原始的 ResNet-50 的结构,就可以得到优化后的图。

图4 Pass优化在ResNet-50数学模型中的应用领域

从图 4 可以看到,通过对 ResNet-50 数学模型的网络结构的优化,add 和 relu 那些排序强度较细的算子已经被 conv 这种排序强度大的算子所吸收,减少了小算子增添的启动以及读写上的开销。

conv 算子优化

经过算子融合优化后,可以看到 ResNet-50 数学模型调用的算子主要是各种 conv fuse 的算子,如 Conv_Relu、Conv_Add_Relu,那些算子的主体部分都是 conv,所以主要的优化也都落实在了 conv 算子优化上。

conv 采用 implicit gemm 算法并通过 mma 指令调度 tensor core 进行排序加速。顾名思义,implicit gemm就是将 conv 运算转换为矩阵乘的一种算法,是对 img2col 的算法的改进,传统的 img2col 算法如下:

图5 img2col示意图

从图 5 中可以看到,img2col 是将输出 shape 为(N,IC,IH,IW),卷积核 shape 为(OC,IC,FH,FW)的卷积运算变为 shape 分别为(OC,ICFHFW)和(ICFHFW,NOHOW)的两个矩阵的乘法运算。implict geem 的整体运算逻辑与 img2col 相同,其区别在于 img2col 会显式地完成图 6 中数据的卷积排布到矩阵排布的转换,需要额外开辟一块矩阵大小不一的内部空间用以存储转换后的矩阵,implict gemm 的转换则是隐式的,没有这部分内部空间开销,在 implicit gemm 算法中并没有开辟额外的内部空间存储卷积核矩阵(OCxICFHFW)和输出矩阵(ICFHFWxNOHOW),而是在分块后,每个 block 会按照上图中的对应逻辑,在 global memory 到 shared memory 的加载过程中完成从数据的原始卷积排布到 block 所需的矩阵分块排布的转换。

针对 4 bits 的 implict gemm 的优化主要参照 cutlass 的优化计划,并在此基础上加入了 output 重排的优化。由于篇幅问题,本节仅讲解 output 重排的优化,想要了解更多技术细节,建议参照阅读之前的文章以及开放源码标识符。

先分析 output 目前的排布情况,implict geem 的排序最终都落实在了 mma 指令上,而 mma 指令输出的排布与 warp 中 32 个线程的关系如下:

图6 mma输出排布示意图

如图 6 中所示,在一次 mma 指令运算中,一个 warp 的 32 个线程负责 64 个运算结果,且那些结果都存储在寄存器上。每个线程负责 8x8 的结果矩阵同一行内已连续的两个运算结果,每四个线程负责同一行的 8 个运算结果。

结合 implict geem 的结果矩阵 OCxNOHOW(由 OCxICFHFW 和 ICFHFWxNOHOW 乘积得到),在MegEngine 4 bits 定量的卷积算子设计中,一个 warp 的 32 个线程和输出的排布关系如下:

图7 warp输出排布示意图

一个 warp 负责 64x64 大小不一的输出矩阵,该矩阵由 8x8 个 mma 的 8x8 输出矩阵组成,输出和线程的排布关系如图所示,黄色部分表示线程 0 所拥有的数据。图 7 中的所有数据都在寄存器上,算子的最后一步操作,也就是将那些数据写回到 global memory 上并按照 NCHW64 的方式进行排布。

一眼看上去,那些数据的排布都是间隔开的,虽然横坐标上的数据已连续,但对写回到 global memory 并按照 NCHW64 排布而言,并没有什么帮助。直接的写回方式是将那些寄存器上的数据进行压缩,先将 8 个32 bits的数据转换为 8 个4 bits 的数据,再将这 8 个 4 bits 的数据放到一个 32 bits 大小不一的内部空间,然后写回到 global memory,这种处理方式将面临几个问题:

  • 每个线程中的数据都不已连续,增大了数据处理难度,那些额外的处理排序可能会引致操控性下降。

  • 需要在纵向的 8 个线程间交换数据,会有同步的开销。

这无疑是一个开销比非常大的处理方式,为了解决写回数据增添的操控性问题,MegEngine 采用了下列处理方式:

注意到 NCHW64 的排布方式,每 64 个 OC 是已连续的,尝试将矩阵旋转一下,想象这是一个 NOHOWxOC 的矩阵,那么 T0、T1、T2、T3 四个线程所负责的数据在 OC 维度上是已连续的,它们对的 OC 维度分别是

T0{0,1; 8,9;16,17;24,25;32,33;40,41;48,49;56,57}、

T1{2,3;10,11;18,19;26,27;34,35;42,43;50,51;58,59}......

可以看到,现在是四个线程负责 64 个已连续的输出,那么只要这四个线程交换数据再压缩、写回即可。相比于之前 8 个线程间数据交换和写回,现在的处理方式更为简单,内部偏移排序与同步开销会更少。所以同时实现output转置是一种切实可行的优化方法。这也体现了 NCHW64 的排布方式使得 4 bits 类型的数据在传输过程能被已连续访存,充分利用硬件资源的特点。

但是线程间交换数据的开销在output转置处理中依然没有被彻底解决。如果可以得到

T0{0,1;2,3;4,5;6,7;8,9;10,11;12,13;14,15}、

T1{16,17;18,19;20,21;22,23;24,25;26,27;28,29;30,31}......

这样的输出OC 维度和线程对应关系。那么就只需要在线程内部进行数据打包和写回,因此 16 个4 bits 的数据正好挤占 2 个32 bits 大小不一的内部空间,非常规整。要同时实现这个效果也是非常简单的:对 AxB=C 的矩阵乘法,要同时实现 C 矩阵的列顺序变换,只需要对 B 矩阵进行对应的列顺序变换即可,如下图所示:

图8 矩阵乘积的列变换

从图 可以看出,将乘积矩阵 AxB=C 中的 B 矩阵的第1列和第5列进行对调,结果矩阵 C 对应的列的运算结果也会发生同步的对调。利用这一特点,可以在 conv 算子运算前,将 weights 的列进行重排序,使得最终输出OC 维度在对应的相同线程中保持已连续,T0{0,1;2,3;4,5;6,7;8,9;10,11;12,13;14,15}...

所以总结一下 output 重排的策略,其实就三点:

  • 将 OCxICFHFW 和 ICFHFWxNOHOW 的矩阵乘,变为 NOHOWxICFHFW 和 ICFHFWxOC 的矩阵乘,同时实现output 结果的转置,确保在 OC 维度上的数据已连续,配合 NCHW64 的排布方式,便于将数据从寄存器上写回到 global memory 上。

  • 通过对 ICFHFWxOC 矩阵的 OC 进行重新排序,同时实现 output 矩阵 NOHOWxOC 的 OC 维度和线程的对应关系更为合理,确保线程内部的数据已连续性,避免线程间数据交换的开销。

总结 & 展望

本次开放源码提供了和 TensorRT(TRT) ResNet-50 8 bits 定量数学模型在 ImageNet 数据K568速率以及精确度对比结果:

图9 速率对比
图10 精确度对比

通过在 ResNet50 上的测试可以看到,MegEngine 的 INT4 计划可以比 fp32 逻辑推理速率提升 5.65 倍至多,相比于现在业内较为常用的 INT8 计划也仍然可以提升 1.3 倍的速率。在速率大幅提升的同时,uint4*int4 的计划尽可能的保证了精确度,精确度下降能够控制在 top1 -0.3% 左右。

本文耀世平台编辑发布,转载请注明出处

友情链接

扫一扫下载APP

QQ:88888888  公司地址:牙买加
Copyright © 2018-2019 耀世娱乐平台版权所有      耀世娱乐主管24小时在线!注册、代理咨询主管