在 CV 领域中,卷积计算是扩充像素的感受野的有效方法,模型大多数的计算量都是卷积操作贡献的。因此在 CV 模型的推理性能优化中,最重要的一项工作是对卷积的优化。MegEngine 在长期的工业界实践和反馈的基础上总结得出卷积优化的基本方法有:

  • 直接卷积计算优化

该方法的计算过程为逐通道进行卷积滑窗计算并累加,该优化方法对卷积的参数敏感,为了达到最优的性能,会根据各个卷积参数分别进行 kernel 优化,通用性弱,但是在 Depthwise 的卷积中却是最高效的方法。

  • FFT 卷积计算优化

根据卷积的性质,利用傅立叶变换可以将卷积转换为频域上的乘法,在频域上的计算对应乘法,再使用傅立叶变换逆变换,就可以得到卷积对应的计算结果。该方法使用高性能的傅立叶变换算法,如 FFT,可以实现卷积计算的优化,算法性能完全取决于傅立叶变换的性能以及相应卷积参数。

  • Im2col+matmul 卷积计算优化

由于卷积计算中有大量的乘加运算,和矩阵乘具有很多相似的特点,因此该方法使用 Im2col 的操作将卷积运算转化为矩阵运算,最后调用高性能的 Matmul 进行计算。该方法适应性强,支持各种卷积参数的优化,在通道数稍大的卷积中性能基本与 Matmul 持平,并且可以与其他优化方法形成互补。

  • Winograd 卷积计算优化

Winograd 方法是按照 Winograd 算法的原理将卷积运行进行转变,达到减少卷积运算中乘法的计算总量。其主要是通过将卷积中的乘法使用加法来替换,并把一部分替换出来的加法放到 weight 的提前处理中,从而达到加速卷积计算的目的。Winograd 算法的优化局限为在一些特定的常用卷积参数才支持。

由于 direct 卷积可以直接由公式得来,而 FFT 卷积对于当前业界用到的各种参数的卷积,其性能优势远没有其他优化方法明显,对于这两者本文不做详细展开。这里主要讲述 Im2col 和 Winograd 算法的实现以及优化方法。

Im2col+Matmul 优化

Im2col 算法简介

Im2col+Matmul 方法主要包括两个步骤:

  • 使用 Im2col 按照卷积核的需要将输入矩阵展开一个大的矩阵,矩阵的每一列表示卷积核需要的一个输入数据。

  • 使用上面转换的矩阵进行 Matmul 运算,得到的数据就是最终卷积计算的结果。

image.png

具体 Im2col 的步骤如上图所示:

  1. 将输入数据按照卷积窗进行展开并存储在矩阵的列中,多个输入通道的对应的窗展开之后将拼接成最终输出 Matrix 的一列。

  2. 以卷积的 stride 为步长展开后续的卷积窗并存在 Matrix 的下一列中。

完成 im2col 的操作之后会得到一个输入矩阵,卷积的 weights 也可以转换为一个矩阵,此时对 weights 的矩阵和 Im2col 的输出矩阵进行 Matmul 计算,就可以得到最终的卷积计算结果。

内容中包含的图片若涉及版权问题,请及时与我们联系删除