目录
1. 定义
2. 实现方法
2.1. 计算参数量
2.2. 计算参数量和FLOPs
2.3. 计算推理时间(FPS)
3. 数据大小对参数量和FLOPs的影响
4. 参数量和FLOPs对于硬件要求
参考
在评价深度学习模型的大小、计算量、推理时间,经常使用的参数有:parameters, FLOPs,FPS, MACs, MAdds。除此以外,我们还经常见到MAC, FLOPS, GFLOPS, TFLOPS等,其中,后三个参数其实并非用来评价模型的计算量,而是用来评价计算机硬件的计算能力。下面分别介绍一下以上几个参数:
参数量是指模型训练中需要训练的参数总数。用来衡量模型的大小(计算空间复杂度)。
浮点运算次数,理解为计算量(计算时间复杂度),可以用来衡量算法的复杂度,常用做神经网络模型速度的间接衡量标准(虽然最近已经有文章证明靠FLOPs间接标准评价模型的速度是不靠谱的,因为模型的计算速度还跟内存的吞吐等因素相关,但此标准依然广泛用作模型速度的参考评价标准)。一个乘法或一个加法都是一个FLOPs。
FPS(Frames Per Second):每秒传输帧数,网络每秒可以处理(检测)多少帧(多少张图片),即每秒内可以处理的图片数量或者处理一张图片所需时间来评估检测速度,时间越短,速度越快。FPS简单来理解就是图像的刷新频率,假设目标网络处理1帧要0.02s,此时FPS就是1/0.02=50。
乘加累积操作数,常常与FLOPs概念混淆,实际上1MACs包含一个乘法操作与一个加法操作,通常MACs与FLOPs存在一个2倍的关系。MACs和MAdds相同。
内存使用量,用来评价模型在运行时的内存占用情况。
每秒浮点运算次数,理解为计算速度,是一个衡量硬件性能的指标。它常被用来估算电脑的执行效能,尤其是在使用到大量浮点运算的科学计算领域中。正因为FLOPS字尾的那个S,代表秒,而不是复数,所以不能省略掉。在这里所谓的“浮点运算”,实际上包括了所有涉及小数的运算。这类运算在某类应用软件中常常出现,而它们也比整数运算更花时间。现今大部分的处理器中,都有一个专门用来处理浮点运算的“浮点运算器”(FPU)。也因此FLOPS所量测的,实际上就是FPU的执行速度。
即每秒10亿次的浮点运算数,常作为GPU性能参数但不一定代表GPU的实际表现,因为还要考虑具体如何拆分多边形和像素、以及纹理填充,理论上该数值越高越好。1GFlops = 1,000MFlops。
model = torchvision.models.alexnet(pretrained=False)
# nelement():统计Tensor的元素个数
#.parameters():生成器,迭代的返回模型所有可学习的参数,生成Tensor类型的数据
total = sum([param.nelement() for param in model.parameters()])
print("Number of parameter: %.2fM" % (total/1e6))
安装 :
pip install thop
调用:
计算模型参数总量和模型计算量,而且会打印每一层网络的具体信息。
import torch
import torchvision
from thop import profile
print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)
input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, (input,))
print('flops: %.2f M, params: %.2f M' % (flops / 1e6, params / 1e6))
安装:
pip install ptflops
调用:
计算模型参数总量和模型计算量,而且会打印每一层网络的具体信息。
import torchvision
from ptflops import get_model_complexity_info
model = torchvision.models.alexnet(pretrained=False)
flops, params = get_model_complexity_info(model, (3, 224, 224), as_strings=True, print_per_layer_stat=True)
print('flops: ', flops, 'params: ', params)
安装:
pip install torchstat
调用:计算模型参数总量和模型计算量,而且会打印每一层网络的具体信息。
import torch
import torchvision
from torchstat import stat
print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)
stat(model, (3, 224, 224))
安装:
import time
调用:
torch.cuda.synchronize()
start = time.time()
result = model(img.to(device))
torch.cuda.synchronize()
end = time.time()
print('infer_time:', end-start)
以thop法,为例:
import torch
import torchvision
from thop import profile
print('==> Building model..')
model = torchvision.models.alexnet(pretrained=False)
input = torch.randn(1, 3, 224, 224)
flops, params = profile(model, (input,))
print('flops: %.2f M, params: %.2f M' % (flops / 1e6, params / 1e6))
flops: 714.21 M, params: 61.10 M
flops: 1428.41 M, params: 61.10 M
flops: 5665.76 M, params: 61.10 M
深度学习中模型计算量(FLOPs)和参数量(Params)的理解以及四种计算方法总结https://blog.csdn.net/qq_40507857/article/details/118764782