科普总结:Flops、FLOPS、GFLOPS

什么是FLOPS ?

FLOPS(即“每秒浮点运算次数”,“每秒峰值速度”),是“每秒所执行的浮点运算次数”(floating-point operations per second)的缩写。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。

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

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

评价

许多专家对FLOPS有颇多微词,认为它并不是一个有意义的量度(measurement),因为FLOPS并不能反应出许多对执行效能有影响的因素。例如:I/O的效能、内存的架构、快取内存一致性(cache coherence)、...等。这意味着电脑的实际计算容量,与FLOPS的理论峰值间会有一段不小的差距。

换算

一个MFLOPS(megaFLOPS)等于每秒一百万(=10^6)次的浮点运算,
一个GFLOPS(gigaFLOPS)等于每秒十亿(=10^9)次的浮点运算,
一个TFLOPS(teraFLOPS)等于每秒一万亿(=10^12)次的浮点运算,(1太拉)
一个PFLOPS(petaFLOPS)等于每秒一千万亿(=10^15)次的浮点运算,
一个EFLOPS(exaFLOPS)等于每秒一百京(=10^18)次的浮点运算,
一个ZFLOPS(zettaFLOPS)等于每秒十万京(=10^21)次的浮点运算。

如何计算FLops

其中就是指计算量的大小,表示FLOPs。对于卷积层而言,FLOPs的计算公式如下:

FLOPs = 2HW( CinK2 + 1 )Cout           (1)

其中的Cin是指卷积层输入tensor的通道数,Cout指的是卷积层输出tensor的通道数。K指的是卷积核大小。

而后把常数项去掉,简化小操作:

FLOPs = HW( CinK2 )Cout           (2)

而在实际中,我们不可能自己计算FLOPs,所以,本着能找库就找库的聪明才能,查了一下,还真有相关计算FLOPs的库,现查到的有两个库,一个是torchstat以及thop。经过测试,基本上两个可以对齐的,所以说,任意选择一个就好。具体用法写两个小demo吧。

对于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)
macs, params = profile(model, inputs=(input, ))

参考链接:https://zhuanlan.zhihu.com/p/67009992

本文整理自网络,此文目的在于传递更多信息,如涉及侵权,请联系删除。