作者|龟壳

来源 | 知乎

地址 | https://zhuanlan.zhihu.com/p/376925457

本文仅作学术分享,若侵权请联系后台删文处理

本文总结了一些关于模型参数量计算以及推理速度计算的方法,附有相关代码。

01

FLOPs和Params计算

1.1概念理解

FLOPS: 注意全大写,是floating point operations per second的缩写,意指每秒浮点运算次数,理解为计算速度。是一个衡量硬件性能的指标。

计算公式:
对卷积层:(K_h * K_w * C_in * C_out) * (H_out * W_out)
对全连接层:C_in * C_out

FLOPs: 注意s小写,是floating point operations的缩写(s表复数),意指浮点运算数,理解为计算量。可以用来衡量算法/模型的复杂度

img

Params: 是指模型训练中需要训练的参数总数

模型参数量计算公式为:
对卷积层:(K_h * K_w * C_in)* C_out
对全连接层:C_in * C_out

img
注意:
1.params只与你定义的网络结构有关,和forward的任何操作无关。即定义好了网络结构,参数就已经决定了。FLOPs和不同的层运算结构有关。如果forward时在同一层(同一名字命名的层)多次运算,FLOPs不会增加
2.Model_size = 4*params  模型大小约为参数量的4倍

补充:

MAC:内存访问成本

1.2计算方法

方法1-使用thop库

'''
code by zzg-2020-05-19
pip install thop
'''
import torch
from thop import profile
from models.yolo_nano import YOLONanodevice = torch.device("cpu")
#input_shape of model,batch_size=1
net = YOLONano(num_classes=20, image_size=416) ##定义好的网络模型input = torch.randn(1, 3, 416, 416)
flops, params = profile(net, inputs=(input, ))print("FLOPs=", str(flops/1e9) +'{}'.format("G"))
print("params=", str(params/1e6)+'{}'.format("M")

方法2-使用torchstat库

'''
在PyTorch中,可以使用torchstat这个库来查看网络模型的一些信息,包括总的参数量params、MAdd、显卡内存占用量和FLOPs等
pip install torchstat
'''
from torchstat import stat
from torchvision.models import resnet50
model = resnet50()
stat(model, (3, 224, 224))

方法3-使用 ptflops:https://github.com/sovrasov/flops-counter.pytorch

#pip install ptflops
from ptflops import get_model_complexity_info
from torchvision.models import resnet50
model = resnet50()
flops, params = get_model_complexity_info(model, (3, 224, 224), as_strings=True, print_per_layer_stat=True)
print('Flops:  ' + flops)
print('Params: ' + params)

参考:

https://www.cnblogs.com/king-lps/p/10904552.html

https://zhuanlan.zhihu.com/p/337810633

02

模型推理速度计算

2.1 模型推理速度正确计算

需要克服GPU异步执行和GPU预热两个问题,下面例子使用 Efficient-net-b0,在进行任何时间测量之前,我们通过网络运行一些虚拟示例来进行“GPU 预热”。这将自动初始化 GPU 并防止它在我们测量时间时进入省电模式。接下来,我们使用 tr.cuda.event 来测量 GPU 上的时间。在这里使用 torch.cuda.synchronize() 至关重要。这行代码执行主机和设备(即GPU和CPU)之间的同步,因此只有在GPU上运行的进程完成后才会进行时间记录。这克服了不同步执行的问题。

model = EfficientNet.from_pretrained(‘efficientnet-b0’)
device = torch.device(“cuda”)
model.to(device)
dummy_input = torch.randn(1, 3, 224, 224,dtype=torch.float).to(device)
starter, ender = torch.cuda.Event(enable_timing=True), torch.cuda.Event(enable_timing=True)
repetitions = 300
timings=np.zeros((repetitions,1))
#GPU-WARM-UP
for _ in range(10):_ = model(dummy_input)
# MEASURE PERFORMANCE
with torch.no_grad():for rep in range(repetitions):starter.record()_ = model(dummy_input)ender.record()# WAIT FOR GPU SYNCtorch.cuda.synchronize()curr_time = starter.elapsed_time(ender)timings[rep] = curr_time
mean_syn = np.sum(timings) / repetitions
std_syn = np.std(timings)
mean_fps = 1000. / mean_syn
print(' * Mean@1 {mean_syn:.3f}ms Std@5 {std_syn:.3f}ms FPS@1 {mean_fps:.2f}'.format(mean_syn=mean_syn, std_syn=std_syn, mean_fps=mean_fps))
print(mean_syn)

2.2 模型吞吐量计算

神经网络的吞吐量定义为网络在单位时间内(例如,一秒)可以处理的最大输入实例数。与涉及单个实例处理的延迟不同,为了实现最大吞吐量,我们希望并行处理尽可能多的实例。有效的并行性显然依赖于数据、模型和设备。因此,为了正确测量吞吐量,我们执行以下两个步骤:(1)我们估计允许最大并行度的最佳批量大小;(2)给定这个最佳批量大小,我们测量网络在一秒钟内可以处理的实例数

要找到最佳批量大小,一个好的经验法则是达到 GPU 对给定数据类型的内存限制。这个大小当然取决于硬件类型和网络的大小。找到这个最大批量大小的最快方法是执行二进制搜索。当时间不重要时,简单的顺序搜索就足够了。为此,我们使用 for 循环将批量大小增加 1,直到达到运行时错误为止,这确定了 GPU 可以处理的最大批量大小,用于我们的神经网络模型及其处理的输入数据。

在找到最佳批量大小后,我们计算实际吞吐量。为此,我们希望处理多个批次(100 个批次就足够了),然后使用以下公式:

(批次数 X 批次大小)/(以秒为单位的总时间)

这个公式给出了我们的网络可以在一秒钟内处理的示例数量。下面的代码提供了一种执行上述计算的简单方法(给定最佳批量大小)

model = EfficientNet.from_pretrained(‘efficientnet-b0’)
device = torch.device(“cuda”)
model.to(device)
dummy_input = torch.randn(optimal_batch_size, 3,224,224, dtype=torch.float).to(device)
repetitions=100
total_time = 0
with torch.no_grad():for rep in range(repetitions):starter, ender = torch.cuda.Event(enable_timing=True),torch.cuda.Event(enable_timing=True)starter.record()_ = model(dummy_input)ender.record()torch.cuda.synchronize()curr_time = starter.elapsed_time(ender)/1000total_time += curr_time
Throughput = (repetitions*optimal_batch_size)/total_time
print(‘Final Throughput:’,Throughput)

参考:

https://www.cnblogs.com/king-lps/p/10904552.html

https://zhuanlan.zhihu.com/p/337810633

加入技术交流群

△长按添加小助手

扫描二维码添加小助手微信

深度学习模型参数量/计算量和推理速度计算相关推荐

  1. 如何判断你的数据集是否适合使用深度学习模型?如果数据量太小有什么解决办法?

    如何判断你的数据集是否适合使用深度学习模型?如果数据量太小有什么解决办法? deep learning is a data hungry problem 数据集太小,数据样本不足时,深度学习相对其它机 ...

  2. 一文看懂深度学习模型压缩和加速

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 1 前言 近年来深度学习模型在计算机视 ...

  3. 深度学习模型轻量化(上)

    深度学习模型轻量化(上) 移动端模型必须满足模型尺寸小.计算复杂度低.电池耗电量低.下发更新部署灵活等条件. 模型压缩和加速是两个不同的话题,有时候压缩并不一定能带来加速的效果,有时候又是相辅相成的. ...

  4. 对深度学习模型的轻量化处理

    前言 模型的压缩技术是指对深度学习模型进行压缩以减小其大小和计算量,以便在资源有限的设备上部署.常用的压缩技术包括模型剪枝.量化.低秩分解等,下面分别简单的介绍一下. 正文 模型剪枝(Model Pr ...

  5. 手工计算深度学习模型中的参数数量

    https://www.toutiao.com/a6649299295855968782/ 2019-01-22 20:37:14 计算深度学习模型的可训练参数的数量被认为太微不足道了,因为您的代码已 ...

  6. 深度学习模型压缩与加速技术(二):参数量化

    目录 总结 参数量化 参数量化定义 参数量化特点 1.二值化 二值化权重 二值化权重与激活函数 2.三值化 3.聚类量化 4.混合位宽 手工固定 自主确定 训练技巧 参考文献 深度学习模型的压缩和加速 ...

  7. DSSM、CNN-DSSM、LSTM-DSSM等深度学习模型在计算语义相似度上的应用+距离运算

    在NLP领域,语义相似度的计算一直是个难题:搜索场景下query和Doc的语义相似度.feeds场景下Doc和Doc的语义相似度.机器翻译场景下A句子和B句子的语义相似度等等.本文通过介绍DSSM.C ...

  8. 干货 | 深度学习模型超参数搜索实用指南

    乾明 整理编译自 FloydHub Blog 量子位 报道 | 公众号 QbitAI 在文章开始之前,我想问你一个问题:你已经厌倦了小心翼翼地照看你的深度学习模型吗? 如果是的话,那你就来对地方了. ...

  9. 笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解

    笔记 | 百度飞浆AI达人创造营:深度学习模型训练和关键参数调优详解 针对特定场景任务从模型选择.模型训练.超参优化.效果展示这四个方面进行模型开发. 一.模型选择 从任务类型出发,选择最合适的模型. ...

最新文章

  1. 算法实践1_线性回归
  2. android 听筒播放声音
  3. Windows Mobile 6.0下实现自绘多种状态按钮(Win32) 续
  4. 最优秀的5个Linux文本编辑器
  5. 图像处理之三---摄像头灰度值处理
  6. linux 启动端口失败,linux – 应用程序’appname’在开放移动节点应用程序启动失败(端口8080不可用)...
  7. java 读取Zip文件进行写入
  8. SQL中自增(AUTO_INCREMENT)字段介绍
  9. 把AspDotNetCoreMvc程序运行在Docker上-part3:使用独立的存储容器
  10. go语言语法自我总结
  11. 五、String字符串常用方法
  12. win10如何打开摄像头_win10系统,蓝牙关闭,如何打开?
  13. cv方向有哪些_【星球知识卡片】视频分类与行为识别有哪些核心技术,对其进行长期深入学习...
  14. Python 之如何暴力破解加密文件
  15. python捕捉kdj交易信号_KDJ指标详解:教你两种方式判断交易信号!
  16. 交换机的基本原理与配置
  17. debian linux上usb摄像头,[Debian] 安装USB摄像头(芯片ZC0301)驱动
  18. jQuery图片特效脚本prettyPhoto简介
  19. UUID 是什么?有什么作用?
  20. E-R图中联系向关系模式的转化

热门文章

  1. JS --正则表达式
  2. docker 命令汇总
  3. 一次愉快的 bug 修复经历
  4. Android--UI之ImageView
  5. 虚拟机磁盘类型_虚拟机存储类型分为哪些种类
  6. java的游戏图片怎么加载_java游戏图像加载速度非常慢
  7. Torch not compiled with CUDA enabled
  8. xgboost源码 要看的
  9. 如何加快Gensim Word2vec模型加载时间?
  10. oracle 的替代变量和