Fork me on GitHub

使用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

posted @ 2023-06-12 10:07  stardsd  阅读(1320)  评论(0编辑  收藏  举报