一文讲解thop库计算FLOPs问题

news2024/11/15 1:42:05

问题

计算模型的FLOPs及参数大小

FLOPS是处理器性能的衡量指标,是“每秒所执行的浮点运算次数”的缩写。

FLOPs是算法复杂度的衡量指标,是“浮点运算次数”的缩写,s代表的是复数。

一般使用thop库来计算,GitHub: https://github.com/Lyken17/pytorch-OpCounter

from thop import profile

from thop import clever_format

input = torch.randn(1, 3, 512, 512)

model = Model() 

flops, params = profile(model, inputs=(input, )) 

flops, params = clever_format([flops, params], "%.3f") 

但官网的Readme中详细写出了是用来计算MACs,而不是FLOPs的

from torchvision.models import resnet50

from thop import profile

model = resnet50()

input = torch.randn(1, 3, 224, 224)

macs, params = profile(model, inputs=(input, ))

MACs(Multiply-Accumulates)和 FLOPs(Floating-Point Operations)都是用来度量深度学习模型的计算量的指标。它们都可以用来衡量模型的计算复杂度,但是它们的具体定义略有不同。

MACs 是模型中所有乘加运算(即一个乘法和一个加法)的总数,因此,它可以衡量模型的计算性能和效率。通常,MACs 用于评估卷积神经网络(CNN)和其他基于矩阵乘法的模型,如循环神经网络(RNN)和自注意力模型(transformer)等。在实践中,MACs 被广泛用于模型的优化和压缩。

FLOPs 表示模型中所有浮点运算的总数,包括加、减、乘、除等运算。FLOPs 可以衡量模型的浮点运算量和计算成本。通常,FLOPs 用于评估基于全连接层的模型,如 MLP(多层感知器)和基于线性变换的模型,如语言模型和传统的机器学习模型。

MACs 和 FLOPs 之间没有固定的对应关系,因为它们的定义和应用范围略有不同。然而,在某些情况下,它们之间存在一定的相关性。例如,对于一个基于卷积神经网络的模型,可以通过计算 MACs 和 FLOPs 的比值来大致估计模型的运行时间。因为卷积操作中大多数乘法和加法都是浮点数,所以这个比值通常在 1-2 之间。然而,对于其他类型的模型,这个比值可能会有很大的差异,因此,需要根据具体情况来选择使用 MACs 还是 FLOPs 进行模型评估。

当我们使用yolov5官方模型时,训练时会打印模型的参数及FLOPs

在yolov5源码中,模型的FLOPs是这样计算的

调用thop库中的profile计算FLOPs

try:  # FLOPs

    from thop import profile

    stride = max(int(model.stride.max()), 32) if hasattr(model, 'stride') else 32

    # input

    # img = torch.zeros((1, model.yaml.get('ch', 3), stride * 8, stride * 8), device=next(model.parameters()).device)  # 帮助理解如何计算FLOPs的尝试

    img = torch.zeros((1, model.yaml.get('ch', 3), stride, stride), device=next(model.parameters()).device)  # input

    flops = profile(deepcopy(model), inputs=(img,), verbose=False)[0] / 1E9 * 2  # stride GFLOPs

    img_size = img_size if isinstance(img_size, list) else [img_size, img_size]  # expand if int/float

    fs = ', %.1f GFLOPs' % (flops * img_size[0] / stride * img_size[1] / stride)  # 640x640 GFLOPs

主要是这一句:

 flops = profile(deepcopy(model), inputs=(img,), verbose=False)[0] / 1E9 * 2  # stride GFLOPs

因为GFLOPs 指的是每秒十亿次浮点运算(Giga Floating Point Operations per Second)GFLOPs和FLOPs是1e9关系,后面乘以2则认为FLOPs是MACs的2倍

是不是我们乘以2就可以了

目前大家推荐使用torchstat 库来计算FLOPs

from torchstat import stat

导入模型,输入一张输入图片的尺寸

stat(model, (3, 224, 224))

在这里插入图片描述

会输出FLOPs,其实和

flops, params = profile(model, inputs=(input, ))

计算出来的差不多,偏小一点

结论

flops, params = profile(model, inputs=(input, ))

这个命令够用了

Ref:

  1. https://github.com/Lyken17/pytorch-OpCounter

神经网络学习小记录72——Parameters参数量、FLOPs浮点运算次数、FPS每秒传输帧数等计算量衡量指标解析_Bubbliiiing的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++ 那些事 笔记

GitHub - Light-City/CPlusPlusThings: C那些事 1. ① extern extern关键字,C语言extern关键字用法详解 如果全局变量不在文件的开头定义,其有效的作用范围只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量,则应该在…

45个写规范代码的小技巧

目录 1、规范命名 2、规范代码格式 3、写好代码注释 4、try catch 内部代码抽成一个方法 5、方法别太长 6、抽取重复代码 7、多用return 8、if条件表达式不要太复杂 9、优雅地参数校验 10、统一返回值 11、统一异常处理 12、尽量不传递null值 13、尽量不返回null值…

BN、SyncBN、IN、LN、GN学习记录

1 BatchNormBN的原理BN是计算机视觉最常用的标准化方法,它沿着N、H、W维度对输入特征图求均值和方差,随后再利用均值和方差来归一化特征图。计算过程如下图所示,1)沿着通道维度计算其他维度的均值;2)沿着通…

numpy入门

目录: numpy数据类型numpy维度numpy常用操作 numpy数据类型 numpy的数据类型是numpy.ndarray,它不同于python的array.array,ndarray可以处理多维数据。ndarray的常见属性有dtype,shape,size等,在进行一些…

接口自动化测试框架-Python+Requests+Yaml

零代码极限封装的【接口自动化测试框架】,目前已经完全能够实现真正的零代码落地并在企业中推广。其中用到的最核心的封装技术如下:核心技术1.热加载封装,是全网最早应用于自动化测试框架的封装技术。2.Requests统一请求封装3.接口关联封装以及接口关联封…

微服务03 分布式搜索引擎 elasticsearch ELK kibana RestAPI RestClient

分布式搜索引擎01-- elasticsearch基础0.学习目标1.初识elasticsearch1.1.了解ES1.1.1.elasticsearch的作用elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容例如:在GitHub搜索代码…

【Python】带你进入字典的世界

如约而至,紧接着上一期文章,小编将会陆续把全套的Python笔记将依次发放给大家,便于大家学习Python、期末备考、巩固基础等(这几期是公众号小插曲,后期发放编程技术的话主要还是会围绕Java来展开~感谢大家支持)字典字典是Python内置…

鸿翼企业网盘 激活企业协作办公

信息化的发展,使企业网盘成为了许多企业必备的“数字基础设施”。鸿翼企业网盘,让网盘不仅是数据存储的“仓库”,更是数据利用的“中枢”,以网盘为载体,激活企业“协作力”。 企业网盘起初是为了解决企业内数据统一存储…

基于SpringBoot+MyBaits_Vue+ElementUi构建项目

基于SpringBootMyBaits_VueElementUi构建项目 1.Spring Boot 后台搭建 1.1.项目初始化 前期准备:maven,jdk(1.8),idea 1.1.1.下载地址 Spring官方提供了Springboot自定义配置地址,可依照相关选项搭建所…

6.4 实战:实现 Web API 版本控制

第6章 构建 RESTful 服务 6.1 RESTful 简介 6.2 构建 RESTful 应用接口 6.3 使用 Swagger 生成 Web API 文档 6.4 实战:实现 Web API 版本控制 6.4 实战:实现 Web API 版本控制 如果业务需求变更,Web API 功能发生变化时应该如何处理呢&…

易错:List中的add方法添加对象时出现重复的问题

错误&#xff1a; 用list存储User对象信息&#xff0c;当存储多个对象时&#xff0c;发现存储的数据都是一样的 之前代码&#xff1a; User user new User();List<User> list new ArrayList<>();for (int i 0; i < 5; i) {user.setName("Tom"i);…

drf-yasg —— Django REST Framework 文档生成

drf-yasg —— Django REST Framework 文档生成 drf-yasg 安装及全局配置 安装以及这个官方文档非常详细的描述了&#xff0c;我就不多说了。 配置好并运行 Django 项目以后&#xff0c;就可以使用浏览器访问 /swagger/ 和 /redoc/ &#xff08;链接取决于你的 urls 的配置&am…

看见统计——第五章 统计推断:贝叶斯学派

看见统计——第五章 统计推断&#xff1a;贝叶斯学派 引言 推理的频率学派认为&#xff0c;概率在本质上是与频率联系在一起的。这种解释实际上是很自然的。按照频率学派的说法&#xff0c;一枚公平的硬币出现人头的概率是1/2。简单地说&#xff0c;在同一个硬币的无限次独立…

打造一款日志分析工具

一、简介 作为一名安全从业者&#xff0c;网络安全事件的应急响应工作是必不可少的&#xff0c;那么在应急支撑时&#xff0c;针对大量的日志数据便需要借助自动化工具实现快速的归类检测&#xff0c;并提取出所需的关键日志数据。本篇文章主要通过利用python语言编写一款web日…

自带超多工具,好用又免费,这3款手机浏览器你用过了吗

手机浏览器是我们手机中必备的一款软件APP&#xff0c;一款好用的浏览器&#xff0c;可以帮助我们提高工作效率&#xff0c;节省时间。对于懒癌患者来说&#xff0c;手机上安装各种各种的app很麻烦&#xff0c;下面给大家介绍自带超多的工具&#xff0c;好用且免费的浏览器&…

SpringCloud网关Zuul和GateWay区别

getway和zuul没有进行参数调优的时候&#xff0c;getway的性能会远高于zuul。 分析&#xff0c;在空负载的时候&#xff0c;SpringCloud Gateway比zuul 1 性能高50%左右&#xff0c;在模拟处理50ms业务后&#xff0c;&#xff0c;SpringCloud Gateway比zuul 1 性能高9倍左右。 …

嵌入式Qt 开发一个视频播放器

上篇文章&#xff1a;嵌入式 Qt开发一个音乐播放器&#xff0c;使用Qt制作了一个音乐播放器&#xff0c;并在OK3568开发板上进行了运行测试&#xff0c;实际测试效果还不错。 本篇继续来实现一个Qt视频播放器软件&#xff0c;可以实现视频列表的显示与选择播放等&#xff0c;先…

【干货】如何用低代码帮助企业实施OKR?

近年来受疫情的影响&#xff0c;许多企业都开始使用 OKR来进行目标管理。OKR是一套让企业持续保持活力的有效管理工具&#xff0c;能够帮助企业实现目标、激励员工、增加团队凝聚力、减少组织内耗&#xff0c;从而进一步实现创新。但是在实际布局中&#xff0c;很多企业在使用 …

基础面试题 :大端、小端及转换方式

理解网络中大端和小端往往是一道基础面试题 &#xff0c;这里作为记录和整理&#xff0c;希望能帮到大家 目录 前言 一、字节序 二、什么小端顺序 三、什么大端顺序 四、处理器体系所属网络字节顺序 五、大小端转换 1、大端整形转换为小端 2、小端转换为小端 3、…

知乎x-zse-96 参数补环境

本文精工学习参考 目标链接 aHR0cHM6Ly93d3cuemhpaHUuY29tL3NlYXJjaD90eXBlPWNvbnRlbnQmcT1weXRob24接口分析 参数x-zse-93&#xff1a;相当于版本号 参数x-zse-96&#xff1a;看起来需要破解 参数x-zst-81&#xff1a;请求发现可以置空 综上所述x-zse-96才需要逆向。 参数…