使用thop和fvcore计算MACs和FLOPs
一、
计算量常使用乘加计算数衡量,英文为multiply-accumulate operations或multiply-add operations,因此常缩写为MACs, MACC或MADD。
由于乘加计算的底层是通过浮点运算实现的,因此还可使用浮点运算数来表示计算量。浮点计算数,英文为Float Operations,常缩写为FLOPs。
描述了数据过一遍这么复杂的网络需要多大的计算量,即使用该模型时所需的计算力。MAC描述了这个复杂的网络到底需要多少参数才能定义它,即存储该模型所需的存储空间。
模型的计算量直接决定模型的运行速度,常用的计算量统计指标是浮点运算数FLOPs, 对FLOPs指标的改进指标包括乘加运算 MACCs(multiply-accumulate operations),又被称为MADDs.
注意FLOPs与FLOPS的区别
FLOPs:注意s小写,是FLoating point OPerations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量模型的复杂度。针对神经网络模型的复杂度评价,应指的是FLOPs,而非FLOPS。
FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。比如nvidia官网上列举各个显卡的算力(Compute Capability)用的就是这个指标,如下图,不过图中是TeraFLOPS,前缀Tera表示量级:MM,2^12之意。
————————————————
版权声明:本文为CSDN博主「Dr鹏」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39833897/article/details/105807172
二、
使用thop和fvcore计算MACs和FLOPs
以
输入为(1,1,200,3)的张量
卷积取
nn.Conv2d(1, 64, kernel_size=(8, 1), stride=(2, 1), padding=(0, 0))
为例。
先计算输出的形状
公式为
H上为(200+0-8)/2+1=97
W上依然是3
所以输出的形状是(1,64,97,3)
卷积的本质是wx+b,
但是实际计算过程中,是直接w和x一一对应的乘起来,并且将结果都加起来
计算FLOPs时,一般会忽略b,而MACs并不会忽略b
所以对于一个卷积,对应的FLOPs为
97*3*(8*1)*64=148992
而对应的MACs为
97*3*(8*1)*64+97*3*64=167616
后一个97*3*64,就是对应b的数量
用代码计算的话,可以用thop计算MACs,fvcore.nn计算FLOPs
import torch import torch.nn as nn import torch.nn.functional as F from thop import profile from fvcore.nn import FlopCountAnalysis, parameter_count_table class net(torch.nn.Module): def __init__(self, image_channels=1, n_classes=6): super(net, self).__init__() self.cnn = nn.Sequential( nn.Conv2d(image_channels, 64, kernel_size=(8, 1), stride=(2, 1), padding=(0, 0)), ) def forward(self, x): cnn_x = self.cnn(x) return cnn_x model = net() x = torch.randn(1, 1, 200, 3) macs, params = profile(model, inputs=(x, )) # ,verbose=False print("MACs", macs) print("p", params) print("@@@@@@@@@@@@@@") flops = FlopCountAnalysis(model, x) print("FLOPs", flops.total()) print(parameter_count_table(model))
打印的结果为
[INFO] Register count_convNd() for <class 'torch.nn.modules.conv.Conv2d'>. [WARN] Cannot find rule for <class 'torch.nn.modules.container.Sequential'>. Treat it as zero Macs and zero Params. [WARN] Cannot find rule for <class '__main__.net'>. Treat it as zero Macs and zero Params. MACs 167616.0 p 576.0 @@@@@@@@@@@@@@ FLOPs 148992 | name | #elements or shape | |:----------------|:---------------------| | model | 0.6K | | cnn | 0.6K | | cnn.0 | 0.6K | | cnn.0.weight | (64, 1, 8, 1) | | cnn.0.bias | (64,) |
对应的WARN不用理会,因为这几个类本来就没有计算
————————————————
版权声明:本文为CSDN博主「Chauncey_Wang」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39518984/article/details/125081077
三、
FLOPS和FLOPs的区别:
FLOPS:注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。
FLOPs:注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度。
注意点:MACCs就是乘加次数,FLOPs就是乘与加的次数之和
点乘求和举例说明:
● y = w[0]*x[0] + w[1]*x[1] + w[2]*x[2] + ... + w[n-1]*x[n-1]
w[0]*x[0] + ... 认为是1个MACC,所以是n MACCs
上式乘加表达式中包含n个浮点乘法和n - 1浮点加法,所以是2n-1 FLOPS
一个 MACC差不多是两个FLOPS
注意点: 严格的说,上述公式中只有n-1个加法,比乘法数少一个。这里MACC的数量是一个近似值,就像Big-O符号是一个算法复杂性的近似值一样。
————————————————
版权声明:本文为CSDN博主「WTHunt」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_20880415/article/details/102822740
如果这篇文章帮助到了你,你可以请作者喝一杯咖啡