计算GMAC和GFLOPS

news2024/10/7 16:22:43

GMAC 代表“Giga Multiply-Add Operations per Second”(每秒千兆乘法累加运算),是用于衡量深度学习模型计算效率的指标。它表示每秒在模型中执行的乘法累加运算的数量,以每秒十亿 (giga) 表示。

乘法累加 (MAC) 运算是许多数学计算中的基本运算,包括矩阵乘法、卷积和深度学习中常用的其他张量运算。每个 MAC 操作都涉及将两个数字相乘并将结果添加到累加器。

可以使用以下公式计算 GMAC 指标:

 GMAC =(乘法累加运算次数)/(10⁹)

乘加运算的数量通常通过分析网络架构和模型参数的维度来确定,例如权重和偏差。

通过 GMAC 指标,研究人员和从业者可以就模型选择、硬件要求和优化策略做出明智的决策,以实现高效且有效的深度学习计算。

GFLOPS 代表“每秒千兆浮点运算”,是用于衡量计算机系统或特定运算的计算性能的指标。它表示每秒执行的浮点运算次数,也是以每秒十亿 (giga) 表示。

浮点运算包括涉及以 IEEE 754 浮点格式表示的实数的算术计算。这些运算通常包括加法、减法、乘法、除法和其他数学运算。

GFLOPS 通常用于高性能计算 (HPC) 和基准测试,特别是在需要繁重计算任务的领域,例如科学模拟、数据分析和深度学习。

计算 GFLOPS公式如下:

 GFLOPS =(浮点运算次数)/(以秒为单位的运行时间)/ (10⁹)

GFLOPS 是比较不同计算机系统、处理器或特定操作的计算性能的有用指标。它有助于评估执行浮点计算的硬件或算法的速度和效率。GFLOPS 是衡量理论峰值性能的指标,可能无法反映实际场景中实现的实际性能,因为它没有考虑内存访问、并行化和其他系统限制等因素。

GMAC 和 GFLOPS 之间的关系

 1 GFLOP = 2 GMAC

如果我们想计算这两个指标,手动写代码的话会比较麻烦,但是Python已经有现成的库让我们使用:

ptflops 库就可以计算 GMAC 和 GFLOPs

 pip install ptflops

使用也非常简单:

 importtorchvision.modelsasmodels
 importtorch
 fromptflopsimportget_model_complexity_info
 importre
 
 #Model thats already available
 net=models.densenet161()
 macs, params=get_model_complexity_info(net, (3, 224, 224), as_strings=True,
 print_per_layer_stat=True, verbose=True)
 # Extract the numerical value
 flops=eval(re.findall(r'([\d.]+)', macs)[0])*2
 # Extract the unit
 flops_unit=re.findall(r'([A-Za-z]+)', macs)[0][0]
 
 print('Computational complexity: {:<8}'.format(macs))
 print('Computational complexity: {} {}Flops'.format(flops, flops_unit))
 print('Number of parameters: {:<8}'.format(params))

结果如下:

 Computational complexity: 7.82 GMac
 Computational complexity: 15.64 GFlops
 Number of parameters: 28.68 M

我们可以自定义一个模型来看看结果是否正确:

 importos
 importtorch
 fromtorchimportnn
 
 classNeuralNetwork(nn.Module):
     def__init__(self):
         super().__init__()
         self.flatten=nn.Flatten()
         self.linear_relu_stack=nn.Sequential(
             nn.Linear(28*28, 512),
             nn.ReLU(),
             nn.Linear(512, 512),
             nn.ReLU(),
             nn.Linear(512, 10),
         )
 
     defforward(self, x):
         x=self.flatten(x)
         logits=self.linear_relu_stack(x)
         returnlogits
     
 custom_net=NeuralNetwork()
 
 macs, params=get_model_complexity_info(custom_net, (28, 28), as_strings=True,
                                         print_per_layer_stat=True, verbose=True)
 # Extract the numerical value
 flops=eval(re.findall(r'([\d.]+)', macs)[0])*2
 
 # Extract the unit
 flops_unit=re.findall(r'([A-Za-z]+)', macs)[0][0]
 print('Computational complexity: {:<8}'.format(macs))
 print('Computational complexity: {} {}Flops'.format(flops, flops_unit))
 print('Number of parameters: {:<8}'.format(params))

结果如下:

 Computational complexity: 670.73 KMac
 Computational complexity: 1341.46 KFlops
 Number of parameters: 669.71 k

我们来尝试手动计算下GMAC,为了演示方便我们只写全连接层的代码,因为比较简单。计算GMAC的关键是遍历模型的权重参数,并根据权重参数的形状计算乘法和加法操作的数量。对于全连接层的权重,GMAC的计算公式为

(输入维度 x 输出维度) x 2

。根据模型的结构,将每个线性层的权重参数形状相乘并累加得到总的GMAC值。

 importtorch
 importtorch.nnasnn
 
 defcompute_gmac(model):
     gmac_count=0
     forparaminmodel.parameters():
         shape=param.shape
         iflen(shape) ==2:  # 全连接层的权重
             gmac_count+=shape[0] *shape[1] *2
     gmac_count=gmac_count/1e9  # 转换为十亿为单位
     returngmac_count

根据上面给定的模型,计算GMAC的结果如下:

 0.66972288

GMAC的结果是以十亿为单位,所以跟我们上面用类库计算的结果相差不大。最后再说一下,计算卷积的GMAC稍微有些复杂,公式为

((输入通道 x 卷积核高度 x 卷积核宽度) x 输出通道) x 2

,这里给一个简单的代码,不一定完全正确,供参考

 defcompute_gmac(model):
     gmac_count=0
     forparaminmodel.parameters():
         shape=param.shape
         iflen(shape) ==2:  # 全连接层的权重
             gmac_count+=shape[0] *shape[1] *2
         eliflen(shape) ==4:  # 卷积层的权重
             gmac_count+=shape[0] *shape[1] *shape[2] *shape[3] *2
     gmac_count=gmac_count/1e9  # 转换为十亿为单位
     returngmac_count

https://avoid.overfit.cn/post/338fd20f0d014afabe273aaca4b05408

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

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

相关文章

opencv_c++学习(十七)

一、边缘检测 左侧上面的曲线表示的是像素从左到右的变化&#xff0c;下面的曲线是上面曲线求导而得。 Sobel边缘检测算子&#xff1a; Sobel(InputArray src, outputArray dst,int ddepth, int dx, int dy, int ksize 3, double scale 1, double delta 0, int borderType …

AI 图像编辑技术 DragGAN 问世,用户可以通过拖拽改变汽车大小或人物表情等

&#x1f680; AI 图像编辑技术 DragGAN 问世&#xff0c;用户可以通过拖拽改变汽车大小或人物表情等 近日&#xff0c;马克斯・普朗克计算机科学研究所研究者们推出了一种控制GAN的新方法DragGAN&#xff0c;用户可以通过拖拽改变汽车大小或人物表情等。 DragGAN类似于Photo…

顶层策划打开互联网市场大门

大家好&#xff01;我是小鱼。随着市面上越来越多的中小企业老板进入互联网市场&#xff0c;对软件开发的技术和要求也逐渐高了起来。单纯做一个商城已经远远不满足客户的需求了。那么客户他到底需要什么? 小编总结了一下&#xff0c;第一客户需要一个完整的系统体系&#xff…

类和对象 - 下(C++)

目录 构造函数补充 构造函数体赋值 初始化列表 explicit关键字 Static成员 概念 特性 友元 友元函数 友元类 内部类 匿名对象 编译器对拷贝对象的优化 理解类和对象 构造函数补充 构造函数体赋值 构造函数&#xff1a; 我们知道 构造函数本质就是在对象创建的同时对其进行初始…

【Android】配置不同的开发和生产环境

目录 前言 配置build.gradle&#xff08;Module级别&#xff09; 创建对应环境的目录 切换不同环境 ​编辑选择打包的环境 前言 在web开发中不同的环境对应的配置不一样&#xff0c;比如开发环境的url是这样&#xff0c;测试环境的url是那样的&#xff0c;在app中也会涉…

双轮平衡车实现自平衡功能

1. 功能说明 在双轮小车上安装一个六轴陀螺仪传感器&#xff0c;本文示例将实现双轮小车自主平衡功能。 2. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大家参考&#xff1a; 主控板 Basra主控板&#xff08;兼容Arduino Uno&#xff09; 扩展板 Big…

基于网络的思维导图WiseMapping

在退烧了一天半之后&#xff0c;老苏的抗原终于变两道杠了。之前还总怀疑自己是无症状&#xff0c;大意了&#xff0c;被新冠给查缺补漏了 &#x1f602; 什么是 WiseMapping &#xff1f; WiseMapping 是一款基于网络的免费思维导图产品。该项目的目标是提供可由企业、教育和学…

Java面试知识点(全)-分布式和微服务-dubbo面试知识点

Dubbo是什么&#xff1f; Dubbo是阿里巴巴开源的基于 Java 的高性能 RPC 分布式服务框架&#xff0c;现已成为 Apache 基金会孵化项目。 面试官问你如果这个都不清楚&#xff0c;那下面的就没必要问了。 官网&#xff1a;http://dubbo.apache.org 为什么要用Dubbo&#xff1f…

内存泄漏之DispatcherTimer

https://www.jianshu.com/p/7e9ecb383bd0 我们经常会在程序中使用DispatcherTimer&#xff0c;但是如果一不小心就会发生内存泄漏&#xff0c;请看下面的Demo&#xff1a; 内存泄漏代码 我创建了一个简单的窗口Example1.xaml&#xff1a; <Window x:Class"MemoryLea…

Keep your Eyes on the Lane Real-time Attention-guided Lane Detection 论文精读

关注车道&#xff1a;实时注意力引导车道线检测 摘要 现代车道线检测方法在复杂的现实世界场景中取得了显著的性能&#xff0c;但许多方法在保持实时效率方面存在问题&#xff0c;这对自动驾驶汽车很重要。在这项工作中&#xff0c;我们提出了LaneATT&#xff1a;一种基于锚点…

【降维打击】T分布随机近邻嵌入(T-SNE)Python实践

近几天看到论文里面有T分布随机近邻嵌入&#xff08;T-distributed stochastic neighbor embedding, T-SNE&#xff09;这种可视化方法&#xff0c;以前好像也看到过&#xff0c;但没有系统了解过&#xff0c;现有时间正好实践记录一下。 1. T-SNE简介 T-SNE是一种降维方法&am…

搭建监控日志系统

在微服务或者集群架构中&#xff0c;一次请求的调用会跨多个服务&#xff08;web&#xff0c;mysql&#xff0c;feign等&#xff09;、多个模块&#xff08;用户模块&#xff0c;商品模块等&#xff09;、多个容器&#xff08;用户模块可能有多个实例&#xff09;&#xff0c;这…

【科普】干货!带你从0了解移动机器人(二)—— 移动机器人硬件组成

移动机器人是一个多功能于一体的综合系统&#xff0c;内容涵盖了传感器技术、自动化技术、信息处理、电子工程等&#xff0c;它集环境感知、动态决策与规划于一体&#xff0c;是目前科学技术发展最活跃的领域之一。移动机器人的各种组件之间需要协同工作才能实现机器人的自主移…

【源码解析】RuoYi-Vue-Plus翻译功能 Translation 源码分析

类说明功能Translation通用翻译注解标注需要翻译的字段&#xff0c;用于实体类字段上TranslationType翻译类型注解标注翻译字段的实现类型&#xff0c;用于实现类上标注TransConstant翻译常量TranslationType 类型常量TranslationConfig翻译模块配置类配置初始化&#xff0c;设…

深度学习基础入门篇[9.2]:卷积之1*1 卷积(残差网络)、2D/3D卷积、转置卷积数学推导、应用实例

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

一文了解customRef 自定义ref使用

概念 按照文档中的说明&#xff1a;customRef 可以用来创建一个自定义的 ref&#xff0c;并对其依赖项跟踪和更新触发进行显式控制。它需要一个工厂函数&#xff0c;该函数接收 track 和trigger函数作为参数&#xff0c;并且应该返回一个带有 get 和 set 的对象。 其实大致意思…

公有云——阿里云ECS服务器入门精通(IaaS)(2)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 一.ECS 实例规格族介绍 1.实例的架构类型、规格分类&#xff0c;详细信息 2.企业…

网络互联与互联网 - IP 子网划分详解

文章目录 1 概述1.1 划分目的1.2 划分原则1.3 子网掩码 2 IP 子网划分示例3 网工软考真题3.1 判断网络号和主机号3.2 计算可容纳的主机数3.3 子网划分 1 概述 IP 子网划分&#xff1a;实际上就是设计 子网掩码 的过程。原因&#xff1a;由于在五类的IP地址中&#xff0c;网络号…

【SpringBoot】数据校验API

个人简介&#xff1a;Java领域新星创作者&#xff1b;阿里云技术博主、星级博主、专家博主&#xff1b;正在Java学习的路上摸爬滚打&#xff0c;记录学习的过程~ 个人主页&#xff1a;.29.的博客 学习社区&#xff1a;进去逛一逛~ 数据校验API SpringBoot数据校验数据校验API的…

智能电动「唱主角」,哪些供应商在「领跑」智驾域控制器赛道

新势力&#xff0c;从哪里突围&#xff1f; 造车新势力在过去几年的成绩&#xff0c;已经代表了未来趋势&#xff1a;新能源汽车&#xff0c;尤其是纯电动。而对于智能化软硬件供应商&#xff0c;尤其是新势力供应商来说&#xff0c;亦是如此。 高工智能汽车研究院监测数据显…