用FLOPs和MACs计算深度学习模型的计算效率
2023年06月20日 由 Camellia 发表
591985
0
在本文中,我们将了解FLOPs和MACs的定义、区别以及如何使用Python包计算FLOPs和MACs。
什么是FLOPs和MACs?
FLOPs(浮点运算)和MACs(乘积累加运算)是常用于计算深度学习模型计算复杂度的指标。 它们是理解执行给定计算所需的算术运算数量的快速简单的方法。 例如,当使用不同的模型架构(如用于边缘设备的 MobileNet 或 DenseNet)时,人们使用MACs或FLOPs来估计模型性能。 另外,使用“估计”一词的原因是这两个指标都是近似值,而不是运行时性能模型的实际捕获。 然而,它们仍然可以提供关于能耗或计算要求的非常有用的洞察,这在边缘计算中非常有用。
[caption id="attachment_53443" align="aligncenter" width="740"]
图1:使用“密集连接卷积网络”中FLOPs的不同神经网络的比较[/caption]
FLOPs具体指的是浮点运算次数,其中包括对浮点数进行加法、减法、乘法和除法运算。这些运算在许多涉及机器学习的数学计算中非常常见,例如矩阵乘法、激活函数和梯度计算。FLOPs通常用于衡量模型或模型内特定操作的计算成本或复杂性。这在需要对所需的总算术操作进行估计时非常有帮助,通常用于衡量计算效率的上下文中。
另一方面,MACs仅计算乘积运算的次数,该操作涉及两个数的相乘和结果的相加。这种运算对于许多线性代数运算非常重要,例如矩阵乘法、卷积和点积。在高度依赖线性代数运算的模型,如卷积神经网络(CNN)中,MACs通常用作计算复杂性的更具体的衡量指标。
需要注意的是,FLOPs不能成为人们计算以获得计算效率感的单一因素。 在估计模型效率时,许多其他因素被认为是必要的。 例如,系统设置的并行程度如何;架构模型具有什么(例如,MACs中的组卷积成本);模型使用什么计算平台(例如,Cudnn具有用于深度神经网络的GPU加速功能,并且高度调整了正向或归一化等标准操作)。
FLOPS和FLOPs是相同的吗?
FLOPS是“每秒浮点操作次数”的缩写,用于表示计算速度,通常用作硬件性能的度量。在“FLOPS”中,"S"代表"second"(秒),与"P"(表示“per”,即“每”)一起,通常用于表示速率。
另一方面,FLOPs(小写的“s”表示复数)是指浮点运算。它通常用于计算算法或模型的计算复杂性。然而,在讨论人工智能时,有时FLOPs可以具有上述两种含义,读者需要根据上下文确定确切的含义。也有一些讨论呼吁人们完全放弃使用“FLOPs”,而改用“FLOP”,以便更容易区分。在本文中,我们将继续使用FLOPs。
FLOPs和 MACs之间的关系
[caption id="attachment_53458" align="aligncenter" width="962"]
图2:FLOPs和MACs的关系[/caption]
正如上文所提到的,FLOPs和MACs之间的主要区别包括计算的算术操作类型和使用的上下文。像图2中的GitHub评论所示,通常人工智能社区的共识是一个MACs大约等于两个FLOPs。对于深度神经网络来说,乘积运算在计算中占据很重要的地位,因此MACs被认为是更重要的。
如何计算FLOP?
好消息是已经有多个开源软件包可用于计算FLOPs,所以你不必从头开始实现它。 一些最流行的包括flops-counter.pytorch和pytorch-OpCounter。 还有一些软件包,如torchstat,为用户提供了一个基于PyTorch的通用网络分析器。 同样值得注意的是,这些软件包支持的层和模型是有限的。 因此,如果你运行的模型由自定义网络层组成,则可能需要自己计算FLOPs。
这里我们展示了一个使用pytorch-OpCounter和来自torchvision的预训练alexnet计算FLOPs的代码示例:
来源:https://www.kdnuggets.com/2023/06/calculate-computational-efficiency-deep-learning-models-flops-macs.html