计算GMAC和GFLOPS

简介: 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

目录
相关文章
|
测试技术 uml 容器
UML之包图(Package Diagram)
UML之包图(Package Diagram)
790 1
|
存储 运维 算法
蚂蚁Raft一致性算法库SOFAJRaft深入分析
大家好,我是 V 哥。SOFAJRaft 是蚂蚁金服开源的一款基于 Raft 共识算法的 Java 实现,特别适合高负载、低延迟的分布式系统。它支持 Multi-Raft-Group,能同时处理多个 Raft 集群,具备扩展性和强一致性保障。项目源自百度的 braft,并在性能和功能上进行了优化。本文将深入探讨 SOFAJRaft 的核心源码实现,包括 Leader 选举、日志复制、一致性维护、日志管理和快照机制等。通过关键代码展示其在节点初始化、日志复制、一致性维护等方面的设计思路。希望帮助大家更好地理解 Raft 算法,求关注和点赞,感谢!
294 2
蚂蚁Raft一致性算法库SOFAJRaft深入分析
|
缓存 负载均衡 Java
Java“TimeoutException”解决
Java中的“TimeoutException”通常在操作超时未完成时抛出。解决方法包括:增加超时时间、优化代码逻辑减少执行时间、使用异步处理或线程池提高效率。
1355 11
|
移动开发 前端开发 测试技术
【Flutter前端技术开发专栏】Flutter中的组件化开发基础
【4月更文挑战第30天】Flutter作为热门的UI框架,以其声明式编程和高效性能深受开发者喜爱。本文聚焦Flutter的组件化开发,阐述组件化开发的代码复用、模块化、团队协作和测试便利等优势。在Flutter中,所有元素几乎都是组件,包括简单按钮到复杂布局。通过继承`StatelessWidget`或`StatefulWidget`创建自定义组件,如示例中的`CustomButton`。组件通过`build`方法构建,并可在其他组件中嵌套使用。理解并掌握组件的样式、布局及使用,对于提升Flutter开发技能至关重要。
455 0
【Flutter前端技术开发专栏】Flutter中的组件化开发基础
|
存储 API 流计算
Flink - checkpoint Failure reason: Not all required tasks are currently running
Flink 程序增加 readFile 生成文件流后,最初运行期间 CheckPoint 存储没有问题,待文件流 Finished 后 CheckPoint 存储报错: checkpoint Failure reason: Not all required tasks are currently running,下面分析并解决下。
3272 0
Flink - checkpoint Failure reason: Not all required tasks are currently running
|
存储 数据可视化 大数据
基于Python Django的大数据招聘数据分析系统,包括数据大屏和后台管理
本文介绍了一个基于Python Django框架开发的大数据招聘数据分析系统,该系统具备后台管理功能和数据大屏展示,利用大数据技术收集和分析招聘市场趋势,帮助企业和招聘机构提高招聘效率和质量。
499 3
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
机器学习/深度学习 自然语言处理 算法
【论文泛读】 知识蒸馏:Distilling the knowledge in a neural network
【论文泛读】 知识蒸馏:Distilling the knowledge in a neural network
【论文泛读】 知识蒸馏:Distilling the knowledge in a neural network
|
JavaScript IDE 测试技术
Rtsp转Flv在浏览器中播放
【2月更文挑战第5天】本文简单介绍如何间接实现在浏览器中播放rtsp的流,涉及技术点和工具较多,本文仅做功能实现思路的梳理和简单的代码实践,后续整理更深入的实现原理。
1277 1
|
机器学习/深度学习 数据可视化 Python
No module named 'tensorboardX' 如何解决
【5月更文挑战第27天】No module named 'tensorboardX' 如何解决
1321 0