模型推理一文看懂winograd卷积加速算法(代码片段)

极智视界 极智视界     2023-01-02     205

关键词:

欢迎关注我的公众号 [极智视界],获取我的更多笔记分享

O_o>_<o_OO_o~_~o_O

  本文详细解释了 winograd 算法加速卷积的实现原理。

  前面已经写过几篇卷积加速相关的文章,感兴趣的同学可以查阅《【模型推理】一文看懂Img2Col卷积加速算法》、《【模型推理】一文看懂 Google TPU 脉动阵列加速卷积计算原理》、《【模型推理】谈谈为什么卷积加速更喜欢 NHWC Layout》。

  winograd 算法最早是 1980 年由 Shmuel Winograd 提出的《Fast Algorithms for Convolutional Neural Networks》,当时并没有引起太大的轰动。在 CVPR 2016 会议上,Lavin 等人提出了利用 winograd 加速卷积运算,于是 winograd 加速卷积优化在算法圈里火了一把。

  winograd 为什么能加速卷积运算呢,简单来说就是用更多的加法计算来减少乘法计算,从而降低计算量,且不像 FFT 那样会引入复数 (关于 FFT 加速卷积后面会再写一篇),但前提是,处理器中的乘法计算的时钟周期要大于加法计算的时钟周期。好了,下面开始。

1、winograd 加速一维卷积计算

  下面是一个比较经典的例子,假设我们的输入信号和卷积核是这样:

# 输入信号 
d = [d0, d1, d2, d3]T 

# 卷积核 
g = [g0, g1, g2]T

  那么整个的卷积过程可以转换成如下的矩阵乘形式:

  捋得清楚吗,怎么就转换到如上的矩阵乘了,下面解释一下,应该比较形象了。

  这个矩阵乘计算过程是这样的:

r0 = d0*g0 + d1*g1 + d2*g2   # 3次乘法+2次加法 

r1 = d1*g0 + d2*g1 + d3*g2   # 3次乘法+2次加法

  以上的计算过程总共需要 6 次乘法和 4 次加法。

  观察以上的计算过程,由于在卷积层的设计中,往往 stride < kernel_size 的,所以最后转换的矩阵乘中往往有规律的分布着大量的重复元素,比如这个一维卷积例子中矩阵乘输入矩阵第一行的 d1、d2 和 第二行中的 d1、d2。

  而 winograd 的做法是这样的:

  其中,

  如上的转换将原本需要 6 次乘法减少到了 4 次,看上去加法运算是增加的,但是 m1、m2、m3、m4 是可以提前计算好的,所以实际加法还是 4 次。以上的转换作者只给出了结论,并没有给出推导,下面我们进行一下反推。

  上面已经说过,如果我们直接进行矩阵乘,会得到 r0 = d0 x g0 + d1 x g1 + d2 x g2,r1 = d1 x g0 + d2 x g1 + d3 x g2 ,所以我们可以令:m1 + m2 + m3 = r0,m2 - m3 - m4 = r1。像这样:

  先观察,两个等式中 m1、m4 是没有重复出现的,我先令 m1 = d0 x g0,m4 = -d3 x g2,这样可以约掉 m1 和 m4,所以左边只剩两个变量,两个等式两个变量即可求出 m3、m4,所以这个时候的 m1、m2、m3、m4 是这样的:

  观察 m2 中包含了 d1、d2、g0、g1、g2,将其转换为两个多项式乘积形式,拆成 d 和 g 分开的形式,如下:

  同理,对 m3 也进行如上转换,完了之后现在的 m1、m2、m3、m4 是这样的:

  这个时候让我们回到最开始的等价关系,进行观察,要是我在 m2、m3 上同时加上一个值,对于式 (b) 来说是不变的(所以 m4 不用动),对于式 (a) 来说需要给 m1 减去两倍的这个值。

  观察现在的 m1、m2、m3、m4,当这个值是 (d2g0) / 2 时可以简化表达式,所以这样给上面等式进行等价变换后得到的 m1、m2、m3、m4 如下:

  继续如上操作,如果给 m2 加上一个值,同时给 m3 减去这个值,那么对于式 (a) 来说是不变的 (所以 m1 不用动),对于式 (b) 来说需要给 m4 减去两倍的这个值才能等价。同样观察现在的 m1、m2、m3、m4,当这个值为 (d1g2) / 2 时可以进一步简化表达式,接着作这样的变换后得到最终的 m1、m2、m3、m4,如下:

  开不开心,激不激动,我们经历了上述的推导之后终于得到了作者给你的结果。

  将上面的计算过程写成矩阵的形式为:

  其中:

  • g:表示卷积核;
  • d:表示输入信号;
  • G:表示卷积核变换矩阵,尺寸为 (m+r-1) x r
  • BT:表示输入变换矩阵,尺寸为 (m+r-1) x (m+r-1)
  • AT:输出变换矩阵,尺寸为 m x (m+r-1)

2、winograd 加速二维卷积计算

  将一维卷积的变换扩展到二维卷积,同样用矩阵形式表示为:

  其中,g为 r x r 的卷积核,d 为 (m + r -1) x (m + r -1) 的图像块,此时为 F(2 x 2,3 x 3)。

  二维卷积可先参考这个《【模型推理】一文看懂Img2Col卷积加速算法》将卷积过程进行 img2col 展开成矩阵乘的形式,示意图如下:

  将如上的矩阵乘过程进行分块:

  即可以表示成如下形式:

  怎么样,熟不熟悉,是不是跟前面一维卷积的形式一毛一样。所以 winograd 对于二维卷积的优化就像套娃一样,你把它一层层拨开就能看到一维卷积的优化姿势了。


3、winograd 优化小结

  在 winograd 卷积加速算法中,对于一维卷积,当输出为 m,卷积核长为 r,对应的乘法计算次数为 m+r-1 次;将一维卷积扩展到二维,如果输出维度是 m x n,卷积核维度为 r x s,则需要的乘法次数是 (m+r-1) x (n+s-1)。对一个矩阵大小为 4 x 4 的输入,卷积核大小为 3 x 3,对应的输出为 2 x 2,正常计算的情况下,使用 im2col 加速方法的乘法次数为 2 x 2 x 3 x 3 = 36 次,而当使用 winograd 时,对应的乘法次数为 (2+3−1) x (2+3−1) =16,可以看到乘法次数明显减少,从而加速效果会更加明显。

  winograd 算法通过减少乘法次数来实现提速,但是加法的数量会相应增加,同时需要额外的转换计算以及存储转换矩阵,随着卷积核 (kernel) 和 分块 (tile,对于大尺寸 feature map,会将 feature map 切分成一个个等大小有重叠的 tile,在每个 tile 上面进行 winograd 卷积) 的尺寸增大,就需要考虑加法、转换计算 和 存储 的代价,而且 tile 越大,转换矩阵越大,计算精度的损失会进一步增加,所以一般 winograd 只适用于较小的卷积核和 tile(对大尺寸的卷积核,可使用 FFT 进行加速)。


  好了收工,不知道你理解了没,欢迎讨论~



扫描下方二维码即可关注我的微信公众号【极智视界】,获取更多AI经验分享,让我们用极致+极客的心态来迎接AI !

一文看懂img2col卷积加速算法

本文转自【模型推理】一文看懂Img2Col卷积加速算法直接卷积计算​直接卷积计算一定是很直接的,也是大多数人学习卷积神经网络时所直观了解的卷积计算方式。直接卷积是按照卷积层的计算特性进行计算,卷积核中的... 查看详情

一文看懂img2col卷积加速算法

本文转自【模型推理】一文看懂Img2Col卷积加速算法直接卷积计算​直接卷积计算一定是很直接的,也是大多数人学习卷积神经网络时所直观了解的卷积计算方式。直接卷积是按照卷积层的计算特性进行计算,卷积核中的... 查看详情

模型推理谈谈为什么卷积加速更喜欢nhwclayout(代码片段)

 本文主要讨论一下为什么卷积加速更加喜欢NHWC的数据排布。 我目前接触过的数据排布类型(主要针对卷积)有NCHW(pytorch、caffe),NHWC(Tensorflow,也是TVMGPU和寒武纪MLUCore上更喜欢的dataLayout),CHW(TensorRT里不考虑动态batch... 查看详情

一文带你读懂非结构化稀疏模型压缩和推理优化技术

...面的快速转变。一个完备的深度学习落地流程包括:模型设计、模型训练与调优、模型压缩、推理部署,最终成为在各种设备上快速、精准运行的人工智能系统。考虑到终端设备计算能力的限制,如何将研发产出的大... 查看详情

一文带你读懂非结构化稀疏模型压缩和推理优化技术

...面的快速转变。一个完备的深度学习落地流程包括:模型设计、模型训练与调优、模型压缩、推理部署,最终成为在各种设备上快速、精准运行的人工智能系统。考虑到终端设备计算能力的限制,如何将研发产出的大... 查看详情

megengineinference卷积优化之im2col和winograd优化

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

神经网络推理加速:合并卷积和bn层运算原理及实验(代码片段)

1. 为什么要合并BN层在训练深度网络模型时,BN(BatchNormalization)层能够加速网络收敛,并且能够控制过拟合,一般放在卷积层之后。BN层将数据归一化后,能够有效解决梯度消失与梯度爆炸问题。虽然BN层... 查看详情

一文看懂决策树

...决分类问题的算法,决策树算法采用树形结构,使用层层推理来实现最终的分类。决策树由下面几种元素构成:根节点:包含样本的全集内部节点:对应特征属性测试叶节点:代表决策的结果 预测时,在树的内部 查看详情

神经网络推理加速:合并卷积和bn层运算原理及实验(代码片段)

1. 为什么要合并BN层在训练深度网络模型时,BN(BatchNormalization)层能够加速网络收敛,并且能够控制过拟合,一般放在卷积层之后。BN层将数据归一化后,能够有效解决梯度消失与梯度爆炸问题。虽然BN层... 查看详情

两行代码自动压缩vit模型!模型体积减小3.9倍,推理加速7.1倍

Transformer模型及其变体,因其更优的注意力机制能力和长时依赖等特性,已成为自然语言处理(NLP)、语音识别(ASR)、计算机视觉(CV)等领域的主流序列建模结构。根据PaperWithCode网站ObjectDetectiononCOCOtest-dev专栏数据,检测... 查看详情

模型推理谈谈为什么量化能加速推理(代码片段)

... o_O O_o ~_~ o_O 本文主要讨论一下为什么量化能加速模型推理。 前面已经写过几篇关于模型量化相关的文章:《【模型推理】谈谈几种量化策略:MinMax、KLD、ADMM、EQ》、《【模型推理】谈谈模型量化组织方式》、... 查看详情

模型推理加速系列06:基于resnet18加速方案评测(代码片段)

...称重师:卖麻辣烫的小男孩。今天这篇文章以resnet18模型为例,对比Pytorch、ONNX、TorchScript、TensorRT模型格式在不同硬件(包括CPU和GPU)上的inference性能。由于此前TorchScript模型在AMDCPU上的评测结果是负向效果(远慢于Pytorch)ÿ... 查看详情

模型推理加速系列bert加速方案对比torchscriptvs.onnx(代码片段)

文章目录简介基于ONNX导出ONNX模型示例代码基于TorchScriptJITTorchScript示例代码推理速度评测CPUGPU附录简介本文以BERT-base的为例,介绍2种常用的推理加速方案:ONNX和TorchScript,并实测对比这两种加速方案与原始Pytorch模型... 查看详情

模型推理谈谈caffe的conv算子(代码片段)

 欢迎关注我的公众号[极智视界],获取我的更多笔记分享 O_o >_< o_O O_o ~_~ o_O 本文主要聊一下caffe框架中的conv算子。 caffe中的卷积主要有两种实现:一种是img2col+gemm+bias,另一种是调用cudnn_conv&#x... 查看详情

基于zynq的cnn图像识别算法的优化与实现

...相应的权重值和偏置值,即训练阶段。二是根据网络模型实现卷积神经网络,并做硬件加速,提升卷积神经网络运算的速率,即推理阶段。  卷积神经网络训练 4.1.1卷积神经网络模型搭建 本文采用的Flowers Recogn... 查看详情

模型推理加速系列07:以bert为例全面评测各种推理加速方案(代码片段)

...李白风格创作的,仅供欣赏。前文以CV领域中的resnet18模型为例综合评测各种推理加速方 查看详情

模型推理加速系列07:以bert为例全面评测各种推理加速方案(代码片段)

...李白风格创作的,仅供欣赏。前文以CV领域中的resnet18模型为例综合评测各种推理加速方 查看详情

一文看懂nlp预训练模型前世今生

...#xff0c;联系删除转载于:量子位搞出了全球最大预训练模型的悟道团队,现在来手把手地教你怎么弄懂预训练这一概念了。刚刚,清华唐杰教授联合悟道团队发布了一篇有关预训练模型的综述:整篇论文超过40 查看详情