计算量 参数量 模型内存
- 前言
- 1 计算量和参数量
- 2 统计计算量、参数量和模型内存
- 3 源码分享
- 3.1 thop实现
- 3.2 ptflops实现
- pytorch_model_summary实现各层参数量统计
- 4 总结
前言
理清FLOPS和FLOPs,大写S
代表的是显卡的运算性能,小写s
代表的是模型的运算次数!
FLOPS是处理器性能的衡量指标,是“每秒所执行的浮点运算次数”的缩写;
FLOPs是算法复杂度的衡量指标,是“浮点运算次数”的缩写,s代表的是复数;
例如:
红框中的FLOPS是大写,和显卡运算能力有关!
论文中,写的都是FLOPs,谁会没事在论文中写FLOPS!!
1 计算量和参数量
计算量指的是,我们网络运行时需要的次数,类似于时间复杂度,常见单位是FLOPs,GFLOPs,1GFlops = 1,000Flops
参数量指的是,我们网络中需要学习的参数,类似于空间复杂度,常见单位是M,
显卡性能决定是否能带的动计算量,显卡显存决定是否能带的动参数量
2 统计计算量、参数量和模型内存
深度学习中,卷积层占据的计算量和参数量最大,因此给出卷积层的计算量和参数量计算公式:
参数量:
(kernel_size*kernel_size) *channel_input*channel_output
计算量:
(kernel_size*kernel_size*H*W) *channel_input*channel_output
H, W 指的是该层输入的图片大小
模型内存:
因为:一个参数大概就是一个 float,4个字节,而 1kb=1024 字节
所以:模型内存 = 参数量 * 4 / 1024 /1024 = 总字节数 / 1024(换算成kb) /1024 (换算成MB)
举例:
AlexNet:内存计算:60000000*4/1024/1024=228>200Mb
3 源码分享
3.1 thop实现
代码:
from torchvision.models import resnet101
from thop import profile
import torch
net = resnet101(False)
X = torch.randn(1,3,256,256)
flops, params = profile(net, (X, ))
print('flops: ', flops, 'params: ', params)
print('flops: %.2f M, params: %.2f M' % (flops / 1000000.0, params / 1000000.0))
结果:
3.2 ptflops实现
代码:
import torchvision
from ptflops import get_model_complexity_info
model = resnet101(False)
flops, params = get_model_complexity_info(model, (3, 256, 256), as_strings=True, print_per_layer_stat=True)
print('flops: ', flops, 'params: ', params)
结果:
这里的GMac约等于GFLOPs,具体结果大家可以搜索一下,这个应该还是有一些出入的!
pytorch_model_summary实现各层参数量统计
代码:
import torch
import torchvision
from pytorch_model_summary import summary
net = resnet101(False)
X = torch.randn(1,3,256,256)
print(summary(net, X, show_input=False, show_hierarchical=False))
结果:
4 总结
- 影响网络参数量,和Batch没关,但是和输入数据的通道数和大小有关,大家可以自己试一下;
- 影响网络计算量,和Batch有关,当Batch>1时候,计算量是是Batch=1的Batch倍,大家自己试一下;
参考文献: https://blog.csdn.net/qq_40507857/article/details/118764782
参考文献: https://www.bilibili.com/video/BV1oR4y1X7xZ/?spm_id_from=333.999.0.0