作者:查看Megengine建筑师-Yu Xiongxiong,Chen Qiyou
在简历字段中,卷积计算是扩展像素以使人感到野生的有效方法。模型的大部分计算量都是由卷积操作贡献的。因此,CV模型的推理性能优化的最重要工作是卷积的优化。信念优化的基本方法是根据长期进行的。工业实践和反馈基于长期工业实践和反馈。
该方法的计算过程是通过通道通过卷积滑动窗口来计算和累积的。这种优化方法对卷积的参数敏感。为了实现最佳性能,将根据每个卷积参数进行内核优化。这是深度卷积中最有效的方法。
根据卷积的性质,可以将傅立叶变换转换为频域中的乘法,计算频域中的相应乘法,然后使用傅立叶变换逆变器变换以获得与卷积相对应的计算结果。使用高性能傅立叶变换算法,例如FFT,可以通过卷积计算进行优化。算法性能完全取决于傅立叶变换的性能和相应的卷积参数。
因为卷积计算中有大量的乘法操作,并且矩阵乘法具有许多相似的特征,因此该方法使用IM2COL操作将卷积操作转换为矩阵操作,最后将高表现矩阵调用以进行计算。具有强大的适应性,支持各种卷积参数的优化。性能基本上与通道中卷积量的MATMUL基本相同,并且可以通过其他优化方法相互补充。
Winogram方法是根据Winogram算法的原理转换卷积操作,以减少卷积计算中乘法方法的计算。它主要由卷积中的乘法使用,并添加一部分的一部分。替换放置在重量的早期处理中,以实现加速卷积计算的目的。绞合图算法的优化由一些常用的卷积参数支持。
因为直接卷积可以通过公式直接获得,而FFT卷积的卷积是行业中使用的各种参数,因此其性能优势远非其他优化方法,并且它们并未详细介绍这两者。IM2COL和Winogram算法的实现和优化方法。
IM2COL+MATMUL方法主要包括两个步骤:
特定IM2COL的步骤如上图所示:
上面介绍的过程是原始IM2COL+MATMUL的过程。实际处理器在执行过程中的性能不是最好的。主要原因是:
如上所述,在IM2COL之后,消耗的内存将超过CPU的能力。为了使数据的这一部分存储在缓存中,IM2COL+MATMUL的整个过程需要将其分为块。IM2COL+MATMUL仅是一对一一对一的一对一。分别进行操作,因此内存过多,这会导致高速缓存超过CPU缓存后。
块优化如上图所示:IM2COL一次仅计算block_size大小的数据,并且从fh*fw*iC*block_size获得的数据可以保存在cache.efter IM2COL获取数据中,IT直接为其计算它,并将计算结果写入与block_size相对应的输出张量,对应于sub -block处的卷积的计算结果。计算划分后,将计算下一个block_size,直到整个输入计算为直到整个输入计算为完全的。
结合MATMUL的相关优化知识,在计算MATMUL A*B = C计算时,该块IM2COL获得的数据被认为是B矩阵。将安排A矩阵并存储在L2上。基于基于b -matrix的列和基于矩阵的线基于最多的存储器块,并且基于内层的C矩阵,可以通过L1,L2和A矩阵的大小。以下是块优化性能的测试结果。可以看出,块优化可以有效地减少存储和使用,还可以提高操作员的计算性能。
当实际上同时执行IM2COL进程中多个窗口的开发时,实际上是内存的内存过程和数据的中继过程。随后的MATMUL的包装操作是相关的,并通过中断优化,以减少过程中内存的读数和编写数量。
如上图所示,IM2COL+MATMUL的算法实现了IM2COL和MATMUL的融合的优化,可以减少数据的读取和写入操作。由于保险丝过程和卷积参数是直接相关的,不同的卷积参数将对应于不同的融合核,因此它们不是通用的。总的来说,我们将使用先前的IM2COL+MATMUL方法。此外,某些通用 - 用途卷积,例如:内核= 3x3,步幅= 2等。由于参数是固定的,因此可以执行上述融合优化。确保大多数常见的卷积特性。
在集成卷积后进行性能测试,如相应的计算和吞吐量所示:
可以看出,在大多数情况下,卷积在整合后将有明显的性能改善。
Winogram算法可以优化卷积计算的乘法计算的体积。乘法计算的优化原理可以参考相关论文。我不会在这里引入太多。尽管winogram可以优化乘法的计算,但它将增加添加的计算,并优化这些添加的存在可以进一步改善这些添加的内容。如果可以在重量的预处理早期计算一些其他计算,则可以在权重的早期计算一些其他计算。。
如下图所示,Winogram卷积算法的基本步骤主要包括:
在这些主要步骤中,如何转换温图,如何相关以及如何输出转换?以Winography F(2x2,3x3)为例,这些过程将详细描述。
如上图所示,上部是权重的转换,下部是特征列表的转换。这包括winography和selayout的过程。
对于重量的转换,首先通过通过winography转换矩阵G和GT,然后将3x3重量的3x3重量转换为4x4的矩阵,然后将相同位置的点转换为矩阵中相同位置的点(如位置1的蓝点所示,在图中).oc的矩阵最终形成4x4 = 16转换权重矩阵。
为了转换功能列表,首先根据4x4瓷砖切割输入功能,然后通过B和BT将每个瓷砖转换为4x4的矩阵。矩阵B和BT是与特征列表相对应的winograph变换矩阵,然后进行了类似于weight.Releayout的处理,转换为16 nr_tiles*ic的特征矩阵。
如上图所示,在上述转换之后,将两批矩阵用作矩阵,获得16个NR_TILES*OC矩阵,然后将同一位置的16点转换为NR_TILES*OC 4x4矩阵,然后使用输出winocraph转换矩阵A AND A的Aand将这些4x4矩阵转换为2x2的输出矩阵,最后将这些矩阵写回输出矩阵,以获取Winogram卷积的最终结果。
根据上述酿造算法,鉴于模型中的权重数据,在整个推断时,常数不会再改变。因此,我们可以在真实推理之前转换模型。重新转换开销,尤其是当IC和OC大的情况下,体重转换的开销非常大,因此预先提前的PREMTS转换对于巧合的优化尤为重要。下图是重量转变的何时而不是提前转换体重绩效:
从上图可以看出,巧合中的体重转换时间很大,而且重量的提前转化可以带来很多性能优势。
以上酿酒算法将有以下缺点:
对于这些问题,您可以进一步优化Winogram算法的整个计算过程。这些优化主要包括:
阻止整个输入特征映射后,只需一次计算单独块的NR图块,以确保每个批次矩阵的输入数据(转换后的权重数据除外)存储在L1 CACHE中,没有任何缓存将不会缓存不出现。不适,矩阵乘以时不需要包装。
以下是块优化之前和之后的速度比较。可以看出,块优化大大提高了性能。
有很多方法可以优化CPU推断卷积的优化。在这里,我们主要在IM2COL+MATMUL卷积中介绍一些进一步优化的技术手段,并在Winographic中引入一些更优化的技术手段。通过这些方法,可以进一步加速卷积计算的性能,因此asaccelter逐渐加速了整个模型的推理性能。如下图所示,打开了float32的经典网络后,Snapdragon 855上的测试速度:
有关特定的优化细节,您可以将Megengine的代码结合起来以实施研究。欢迎大家提出宝贵的意见。
原始:https://juejin.cn/post/7112354784622936077