一文讲解thop库计算FLOPs问题

2023-11-15

问题

计算模型的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博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一文讲解thop库计算FLOPs问题 的相关文章

随机推荐

  • Visual Studio Code结合Git与GitHub的完整步骤

    一 Visual Studio Code安装 官网下载地址 https code visualstudio com Visual Studio Code是一个精简版的迷你Visual Studio 并且可以跨平台 Windows Mac L
  • centos7.6安装mysql

    卸载mariadb 解决安装mysql与mariadb冲突问题 卸载干净mariadb 何妨徐行的博客 CSDN博客 安装rpm包前可能需要的命令 yum install openssl devel用于管理rpm包的工具 yum insta
  • 雪崩 计算机组成原理,计算机组成原理复习资料(学习课件整理版可自学使用).doc...

    一 本课程在计算机系统中的位置 一 课程目标 1 结构与原理掌握 建立计算机系统的整机概念 掌握计算机各部件的组成原理与技术 了解计算机系统组成与结构的新技术 2 分析与计算能力 掌握对组成与结构进行性能分析的方法 通过量化计算 加深对组成
  • 李沐动手学深度学习V2-目标检测SSD

    一 目标检测SSD 单发多框检测 1 介绍 SSD模型主要由基础网络组成 其后是几个多尺度特征块 基本网络用于从输入图像中提取特征 因此它可以使用深度卷积神经网络 单发多框检测论文中选用了在分类层之前截断的VGG 现在也常用ResNet替代
  • css中hover变大效果

    html代码 div img src img 11 jpg alt div css代码
  • 轻试Nginx的负载均衡

    看到网上的负载均衡 一直都没有怎么看过 也不理解 今天从网上学着点在windows下用Nginx来试试 我的os是windows xp 用的web服务器时IIS5 1 用了两台同在一个局域网的电脑 分别装有IIS 作为web服务器 地址为1
  • Linux如何查找杀死僵死进程

    最近工作过程中 发现好几台服务器出现僵死进程 如图 用下面的命令找出僵死进程 ps A o stat ppid pid cmd grep e Zz 命令注解 A 参数列出所有进程 o 自定义输出字段 我们设定显示字段为 stat 状态 pp
  • 数组随机排序的两种实现方法

    1 利用数组中的sort 方法 arr arr sort gt Math random 0 5 2 Fisher Yates Shuffle 复杂度为O n 从后向前遍历 不断将当前元素与随机位置的元素 除去已遍历的部分 进行交换 func
  • 海尔对话 Unity:作为数字转型的高阶形态,数字孪生发展前景不可逆

    来源 数字化企业 作为信息化发展到一定程度的必然结果 数字孪生正成为人类解构 描述和认识真实世界和虚拟世界的新型工具 从发展态势来看 数字孪生不仅是全新信息技术发展的新焦点 也是各国实现数字化转型的新抓手 还是众多工业企业业务布局的新方向
  • 第4章 微服务框架主体搭建

    mini商城第4章 微服务框架主体搭建 一 课题 框架搭建 二 回顾 1 整体业务功能分析 2 根据业务需求设计表结构及字段 三 目标 1 版本控制器的搭建使用 2 能独立自主的搭建微服务框架 3 学会考虑一些公共的工具组件 4 网关模块的
  • 树莓派初始使用相关问题及解决方法

    1 SSH连接 网线连接电脑 在无线图标上右键 打开 网络和internet设置 更改适配器设置 在WLAN上面右键 选择属性 共享 勾上 在cmd里面 可以输入 ping raspberrypi local 若显示不是ip 则ping 4
  • opencv3/C++ 机器学习-最邻近算法KNN识别字符

    如图 有如下字母表 现尝试采用最邻近算法KNN 取前10列字符作为训练数据 然后识别字母表中的字符 创建训练数据 首先通过获取前10列字符的轮廓外接矩形 将字符裁剪出作为训练样本建立图库 include
  • 【R语言】富集分析可视化代码(整理版)

    前面几期 干货预警 原来基因功能富集分析这么简单 R语言 基因GO KEGG功能富集结果可视化 保姆级教程 和 R语言 基因GO KEGG功能富集分析 超级简单的保姆级教程 分别介绍了如何使用DAVID在线分析工具对基因进行GO KEGG功
  • 谷歌开源项目Chromium的源码获取与项目构建(Win7+vs10/vs13)

    从12年那会儿开始获取源码和构建chromium项目都是按照那时候的官方要求用win7 vs2010 相对来说也比较简单 按照步骤来也很快能编译出来 1 官网的编译配置介绍 http www chromium org developers
  • uniapp实现抽奖功能

    效果 代码
  • Android AES加密算法工具类

    1 AES加密工具类 本篇文章使用PKCS5Padding加密方式 package com example aesdemo import java io UnsupportedEncodingException import javax c
  • 位(bit)与字节(byte)16进制值表现形式之间的转换

    小白近很长时间未更新 是因为换工作了 目前行业是涉及到硬件的的工作 今日因工作需要 学习到了位 bit 与字节 byte 16进制值表现形式之间的转换 故此记录一下 下面的内容为位 bit 与字节 byte 16进制值表现形式之间的快速计算
  • tensorflow.js 实现 官网mnist 代码时出现error Command failed with exit code 1且网页无法连接

    按官网的方法只需要四步就可以复现mnist https js tensorflow org tutorials mnist html git clone https github com tensorflow tfjs examples c
  • 一遍看懂面试算法——二叉树

    目录 二叉树的种类 满二叉树 完全二叉树 二叉搜索树 平衡二叉搜索树 二叉树的存储方式 二叉树的遍历方式 二叉树的递归遍历 二叉树的迭代遍历 前序遍历 迭代法 中序遍历 迭代法 后序遍历 迭代法 总结 二叉树的统一迭代法 二叉树层序遍历 以
  • 一文讲解thop库计算FLOPs问题

    问题 计算模型的FLOPs及参数大小 FLOPS是处理器性能的衡量指标 是 每秒所执行的浮点运算次数 的缩写 FLOPs是算法复杂度的衡量指标 是 浮点运算次数 的缩写 s代表的是复数 一般使用thop库来计算 GitHub https g