首页 > 其他分享 >使用thop和fvcore计算MACs和FLOPs

使用thop和fvcore计算MACs和FLOPs

时间:2023-06-12 10:24:10浏览次数:44  
标签:FLOPS MACs nn thop 64 计算 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

标签:FLOPS,MACs,nn,thop,64,计算,FLOPs
From: https://www.cnblogs.com/sddai/p/17474211.html

相关文章

  • Java 三方接口PHP写法;doHmacSHA2; 将字节数组转换成16进制字符串;Mac.getInstance;Hma
    先看一段Java代码,一个签名过程1packagecom.sixents.bss.filter;234importorg.apache.http.HttpEntity;5importorg.apache.http.NameValuePair;6importorg.apache.http.client.entity.UrlEncodedFormEntity;7importorg.apache.http.client.met......
  • windows环境下emacs的python简单配置
    首先参考了上一篇《emacs极简配置》,我的想法是打开兼容vim的viper到5级,然后一些基本的字体设定,然后如何执行python文件的一个全过程方法。1、先打开emacs,如果忘了怎么用了,看一下自带的教程,还是中文的,超级方便。2、学完后,键入C-xC-f并按~,这样就会打开默认的配置文件所在的目录......
  • use a script run by gromacs to analysis protein protein complex dynamic
    usinggromacstowriteascriptforprotein-proteincomplexmoleculerdynamicsfromforcefieldselectiontotrajectoryanalyzestepbystep,andgiveannotationtoeachlineGROMACSisapowerful moleculardynamicssoftwarepackage usedforsimulati......
  • view PDF in emacs
    toviewPDFinemacs.‘gs’ isahardrequirement.Itneedstoinstallghostscriptoutofemacs.edit.init.el,addthefollowingstatement:  (setqdoc-view-ghostscript-program"c:/ghostscriptpath/bin/gswin64.exe")restartEMACS.......
  • km4.0:getHmacSharingParameters
    接口定义:hardware/interfaces/keymaster/4.0/IKeymasterDevice.hal看返回值,最终目的是生成一个HmacSharingParameters对象/***StartthecreationofanHMACkey,......
  • Emacs portable 在windows系统中的设置
     虽然说在emacs主要是在linux和mac下使用,但总有人需要在windows上用。但是windows上默认的配置文件路径太长,且放在C盘。通过改变环境变量是最直接的办法。查阅文档(emac......
  • Emacs单文件配置
    编辑~/.emacs输入以下内容;;编码(set-language-info"UTF-8"'coding-priority'(utf-8gb18030gbkgb2312iso-2022-cnchinese-big5chinese-iso-8......
  • VerificationOperationsTest.HmacSigningKeyCannotVerify failed
    写在前面:一言难尽呐!VTS测试下来的结果,就是一眼看不到头的Fail。只能逐个分析,挨个解决了。Fail项:#./VtsHalKeymasterV4_0TargetTest--gtest_filter=PerInstance/Ver......
  • hmacSha256 php java结果不一样问题
    比如我们有个服务是PHP提供的,要求的签名方式hmacSha256取摘要,然后Base64编码转化成可见字符。PHP那边的源码是这样的$result=base64_encode(hash_hmac("SHA256"......
  • 为Emacs配置Solarized主题
    如何给Emacs配置solarized主题;首先要下载主题,网址:https://github.com/sellout/emacs-color-theme-solarized将文件夹拷贝到.emacs.d目录后,在init.el中添加:(add-to-list'c......