深度学习模型计算量评价指标FLOPs, MACs, MAdds关系

在评价深度学习模型的大小和计算量时,经常使用的参数有:parameters, FLOPs, MACs, MAdds。除此以外,我们还经常见到MAC, FLOPS, GFLOPS, TFLOPS,其中,后三个参数其实并非用来评价模型的计算量,而是用来评价计算机硬件的计算能力。下面分别介绍一下以上几个参数:

parameters:

这个参数表示的是模型内部总的参数数量,用来衡量模型的大小,例如一个3*3的卷积层包含10个参数,分别为卷积操作的9个参数和偏置操作的1个参数。

FLOPs:

(Floating Point Operations) 即浮点运算次数,用来衡量模型计算复杂度,常用来做神经网络模型速度的间接衡量标准(虽然最近已经有文章证明靠FLOPs间接标准评价模型的速度是不靠谱的,因为模型的计算速度还跟内存的吞吐等因素相关,但此标准依然广泛用作模型速度的参考评价标准)。对于卷积层而言,FLOPs的计算公式如下:

FLOPs = 2 * H * W * ( Cin * K * K ) * Cout

其中,Cin是指卷积层输入tensor的通道数,Cout是指卷积层输出tensor的通道数,K是指卷积核大小,其中乘以2是因为在卷积操作中,加法次数与乘法次数相同,在卷积乘法中加法次数比乘法次数少一次,但是还需要多考虑一个卷积加法,所以总的乘法次数与加法次数相同。

MACs, MAdds:

(Multiply–Accumulate Operations) 即乘加累积操作数,常常与FLOPs概念混淆,实际上1MACs包含一个乘法操作与一个加法操作,大约包含2FLOPs。通常MACs与FLOPs存在一个2倍的关系。MACsMAdds说的是一个东西。

MAC:

(memory access cost)即内存使用量,用来评价模型在运行时的内存占用情况。1x1卷积的FLOPs为 2 * H * W * Cin * Cout。对应的MAC为H * W * (Cin + Cout) + Cin * Cout(这里假定内存足够)。

FLOPS, GFLOPS, TFLOPS:

(Floating Point Operations Per Second) 即每秒浮点运算次数,它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。

在这里所谓的“浮点运算”,实际上包括了所有涉及小数的运算。这类运算在某类应用软件中常常出现,而它们也比整数运算更花时间。现今大部分的处理器中,都有一个专门用来处理浮点运算的“浮点运算器”(FPU)。也因此FLOPS所量测的,实际上就是FPU的执行速度。

GFLOPS 就是 Giga Floating-point Operations Per Second,即每秒10亿次的浮点运算数,常作为GPU性能参数但不一定代表GPU的实际表现,因为还要考虑具体如何拆分多边形和像素、以及纹理填充,理论上该数值越高越好。1GFlops = 1,000MFlops。

工具:

我们在构建完模型后,如何得到以上这些参数量。这里常用的工具有:

针对tensorflow

有自带工具tf.RunMetadata(), 使用例子可以参考(TensorFlow: Is there a way to measure FLOPS for a model?l)

针对torch

有第三方工具torchstat和thop

对于torchstat示例如下:

from torchstat import stat
import torchvision.models as models

model = model.densenet121()
stat(model, (3, 224, 224))

对于thop示例如下:

from torchvision.models import densenet121
from thop import profile
model = densenet121()
input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, inputs=(input, ))

你可能感兴趣的:(深度学习--基础知识,深度学习,python,pytorch,tensorflow)