-
-
模型计算力(flops)和参数(parameters)
-
https://zhuanlan.zhihu.com/p/144938518
提纲:
Ø 参数量
Ø FLOPS\FLOPs\GFLOPs
Ø 浮点运算和参数量的区别
Ø 不能绝对的用FLOPs作为速度衡量的原因——MAC\并行度\平台
参数量:
CNN:
一个卷积核的参数 = k*k*Cin+1
一个卷积层的参数 = (一个卷积核的参数)*卷积核数目=k*k*Cin*Cout+Cout
FLOPS:
注意:全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
FLOPs:
注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
但是关于FLOPs的公式花样百出,不过大致形式都差不多,没有找到特别统一的说法。
CNN的FLOPs:
- (1) 知乎:
Ci、Co表示输入和输出通道,K卷积核大小,HW是输出的feature map大小。其中括号中的式子这样理解:
左边是乘法运算量,右边是加法运算量,因为n个数字要加n-1次,所以有个-1.这里忽略了bais如果算上bais需要把-1去掉。
- (2) nvida论文:
论文里应该是把n个累加直接当成加n次,还算上了个bais
- (3)torchstat库
简单用代码实验了下,如下图:
Flops:44,158,464 = 222*222*(3*3*3+1)*32
params:896 = 3*3*3*32
推算了下它的公式FLOPs = H*W*(K*K*Cin+1)*Cout (又是不一样的!)
FullyConnect的FLOPs:
I输入神经元数目,O输出神经元个数。同理,考虑bais没有-1
GFLOPs:
这其实是一个单位,1GLOPs=10亿次浮点运算。是Paper里比较流行的单位。
浮点运算量和参数量的区别:
浮点运算量是实际运算过程中的加减乘除计算过程中的计算次数,描述计算力;
参数量只是指的模型大小,和输入的图片大小无关,描述需要内存
不能只用FLOPs作为网络速度的指标。
FLOPs没有考虑几个对速度有相当大影响的重要因素——MAC\并行度\平台
- 1.MAC(Memory Access Cost)
比如:MAC(内存访问成本),计算机在进行计算时候要加载到缓存中,然后再计算,这个加载过程是需要时间的。其中,分组卷积(group convolution)是对MAC消耗比较多的操作(例如AlexNet多GPU)。
k*k普通卷积(不算bais)的FLOPs和MAC:
FLOPs = 2*h2*w2*k*k*c1*c2
MAC=输入+输出+权重参数=h1*w1*c1+h2*w2*c2+c1*c2*k*k
普通卷积和分组卷积的参数量:
1*1卷积普通卷积:
结论:FLOPs一定时,当且仅当c1=c2,MAC越小。
1*1分组卷积:
结论:B不变,g越大MAC越大
- 2.并行度
第二个对速度有相当大影响的重要因素就是模型的并行度。
在相同的FLOPs下,具有高并行度的模型可能比具有低并行度的另一个模型快得多。如果网络的并行度较高,那么速度就会有显著的提升。
-
3.计算平台的不同
不同的运行平台,得到的FLOPs也不相同。有的平台会对操作进行优化,比如:cudnn加强了对3×3conv计算的优化。这样一来,不同平台的FLOPs大小确实没有什么说服力。
Ref:
https://arxiv.org/abs/1611.06440v2
https://www.zhihu.com/question/65305385/answer/451060549
分享一个FLOPs计算神器——
https://www.jianshu.com/p/b1ceaa7effa8
https://zhuanlan.zhihu.com/p/67009992
https://www.e-learn.cn/topic/3471595
https://github.com/Captain1986/CaptainBlackboard/blob/master/D%230023-CNN
模型计算量估计/D%230023.md
https://blog.csdn.net/weixin_39833897/article/details/105807172
C