高性能计算HPC介绍之性能评价指标FLOPS – 2

FLOPS是每秒浮点运算次数,floating point operations per second的缩写,FLOPS用作计算机计算能力的评价。根据硬件配置和参数可以计算出高性能计算集群的理论性能。可以用来衡量算法/模型的复杂度。

在这里所谓的“浮点运算”,实际上包括了所有涉及小数的运算。这类运算在某类应用软件中常常出现,而它们也比整数运算更花时间。现今大部分的处理器中,都有一个专门用来处理浮点运算的“浮点运算器”(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