神经网络模型运算量和参数量分析
1、FLOPS、FLOPs和MACs区分
- FLOPS(Floating Point Operations Per Second):每秒浮点运算次数,是一个衡量硬件(显卡、CPU)速度的指标。
- FLOPs(Floating Point Operations):浮点运算次数,用来衡量模型计算复杂度。一次乘法算一个FLOPs,一次加法也算一个FLOPs
- MACs(Multiply-Accumulate Operations):乘加累积操作数,1MACs包含一个乘法操作与一个加法操作,大约包含2FLOPs,通常MACs与FLOPs存在一个2倍的关系。
2、Python中一些计算模型运算量和网络参数量的工具
2.1、thop
注意:输入需要带上Batch维度, 支持多输入,最直观,在中间变量较多if else时可能会报错。
from thop import profile, clever_format
total_ops, total_params = profile(my_model, inputs=(torch.randn((1,3,192,400)),torch.randn((1,1,192,400)),), verbose=False)
# 这里我使用了一个两输入的模型
clever_format([total_ops, total_params], "%.3f")
返回值:
total_ops:5.621G——实际上是上面提到的MACs
total_params:8.920M——参数的个数,而不是占用的大小,如果模型都是float32参数,每个参数占用4字节。
2.2、torchsummary.summary
注意:model必须是pytorch模型,必须继承自nn.Module;模型输入size,形状为C,H,W;支持多输入的模型;但是在中间变量较多if else时可能会报错。
from torchsummary import summary
a = summary(my_model,[(3, 192, 400), (1, 192, 400)], device='cuda')
返回值:
Total params: 8,878,994——Total params是指模型中总参数个数,包括权重偏置等,而不考虑参数的具体数据类型和内存占用情况,只是简单地计算模型中所有参数的数量。
Trainable params: 8,878,994——模型中可训练的参数个数。
Params size (MB): 33.87 模型大小:这个是模型保存的大小,目前模型多用floa32,一个数占用4字节,这个参数是指保存到电脑中的模型.pth文件的大小。
2.3、ptflops
注意:仅支持单输入模型,不支持任何激活函数,激活函数需要设置成nn.Identity,或者考虑用F.relu等,但是能看到每一层的参数以及计算量分布。常用于调整层结构
from ptflops import get_model_complexity_info
flops, params = get_model_complexity_info(RCFormer_net, (4,192,400), as_strings=True, print_per_layer_stat=True)
print(flops)
print(params)
所有的方法都更推荐优先将模型转为单输入然后再分析,多输入模型分析容易出问题。