模型 FLOPs, MACs, MAdds 关系 以及 常用计算
论文中比较模型的性能时,需要提供模型的大小。 衡量模型大小的指标有:parameters和 [FLOPs, MACs, MAdds] 中三者之一。
1. FLOPs, MACs, MAdds ??? 三者有什么关系呢?
image.png1.1. MACs 和MAdds
首先,MACs
和MAdds
说的是一个东西。两者值是一样的
1.2. FLOPs
根据github issue 的回答:
Most of modern hardware architectures uses FMA instructions for operations with tensors.
FMA computes a*x+b as one operation. Roughly GMACs = 0.5 * GFLOPs
太长不看版:
知道了三者的关系后,接下来会发现使用不同的工具统计出来的这些值是不一样。 parameters的计算方式比较统一,基本一样。 而MACs总是有些差异。 接下来就分析一下这些差异的来源。
2. 计算工具差异
首先很常用的工具:
TensorFlow:
自带tf.RunMetadata()
, 使用例子可以参考(TensorFlow: Is there a way to measure FLOPS for a model?l)
PyTorch:
https://github.com/Lyken17/pytorch-OpCounter
https://github.com/sovrasov/flops-counter.pytorch
MXNet:
TODO
非常感谢这些开源的作者和一同完善的contributors. Respect!
以下是针对FLOPs 而不是parameters (基本一致)的差别:
BatchNorm | Activaton | return | |
---|---|---|---|
tf.RunMetadata | - | ? | FLOPs |
pytorch-OpCounter | √ | √ | MACs |
flops-counter.pytorch | √ | - | MACs |
最后,
https://github.com/facebookresearch/detectron2
https://github.com/rbgirshick/yacs
https://github.com/facebookresearch/pycls
也都带有计算的方式,但是不太了解,以后更新.
pycls 不计算BatchNorm, Activation的MACs