模型的显存和参数量计算
写在前面:以此记录关于模型显存和参数量的一些理解和计算。
首先是“运算量”和“参数量”两个概念:
参数量:这个比较好理解,例如卷积层中的卷积核c_i*k*k*n_o
,其参数量就是相乘的结果。而且,无论输入图像的尺寸怎么变(YOLO实现中的multi scale训练策略),只要模型结构确定,参数量就固定。还需要注意,参数都是FP32(4字节)存放,所以模型大小是参数量*4。
运算量:使用FLOPs衡量,代表浮点运算次数,这个可以衡量算法/模型的复杂度。
还要区分两个容易混淆的量:FLOPS和FLOPs:
FLOPS:Floating point Opreations Per Second,每秒浮点运算次数,理解为计算速度,是一个衡量硬件的标准。GPU算力描述的就是这个,这些数值的单位为MM=10^12次。
FLOPs:Floating point Opreations,s是复数,为浮点数操作数。理解为算法的计算量。paper中通常使用的是GFLOPs,即10亿次浮点运算。
一、显存
参数的显存占用:只有有参数的层,才会有显存占用。这部分的显存占用和输入无关,模型加载完成之后就会占用。
有参数的层主要包括:卷积、全连接、BatchNorm、Embedding等等
无参数的层主要包括:多数的激活层(Sigmoid/ReLU)、池化层、Dropout等等
具体来说,模型参数数目(不考虑偏置b):
- Linear(M->N):M×N
- Conv2d(Cin,Cout,K):Cin×Cout×k×k
- BatchNorm(N):2N
- Embedding(N,W):N×W
参数占用显存=参数数目×n
n=4:float32
n=2:float16
n=8:double64
梯度与动量的显存占用
优化器如果是SGD:
可以看出,除了保存W之外还要保存对应的梯度
因此显存占用等于参数从占用的显存×2
优化器如果是带Momentum-SGD
这时候还需要保存动量,因此显存×3
如果是Adam优化器,动量占用的显存更多,显存×4
故模型中与输入输出无关的显存占用包括:参数W、梯度dW(一般与参数一样)、优化器的动量
输入输出显存占用
主要看输出feature map的形状
输入可以看成上一层的输出
因此模型输出显存占用为:
- 每一层feature map的形状(多维数组的形状)
- 保存输出对应的梯度泳衣反向传播(链式法则)
- 显存占用与batch size成正比
- 模型输出不需要存储相应的动量信息
因此,总的显存公式为:
显存占用=模型显存(参数)+batch_size×每个样本显存(输出和梯度动量)
节省显存的方法:
- 降低batch_size
- 下采样(NCHW->(1/4)*NCHW)
- 减少全连接层(一般只留最后一层分类用的全连接层)
二、计算量
卷积神经网络的参数位于卷积层和全连接层。
三、举例
以VGG16为例
各层的具体情况如下:
网络层(操作) | 输入 | filter | stride | padding | 输出 | 参数量计算公式 | 参数量 | 显存占用 |
---|---|---|---|---|---|---|---|---|
Input | 224x224x3 | 224x224x3 | 0 | 224x224x3 | ||||
Conv3-64 | 224x224x3 | 3x3x64 | 1 | 1 | 224x224x64 | 3x3x3x64 (+ 64)(括号里面是bias项) | 1728(1792) | 224x224x64 |
Conv3-64 | 224x224x64 | 3x3x64 | 1 | 1 | 224x224x64 | 3x3x64x64 (+ 64) | 36864(36928) | 224x224x64 |
MaxPool2 | 224x224x64 | 2x2 | 2 | 0 | 112x112x64 | 0 | 112x112x64 | |
Conv3-128 | 112x112x64 | 3x3x128 | 1 | 1 | 112x112x128 | 3x3x64x128 (+ 128) | 73728(73856) | 112x112x128 |
Conv3-128 | 112x112x128 | 3x3x128 | 1 | 1 | 112x112x128 | 3x3x128x128 (+ 128) | 147456(147584) | 112x112x128 |
MaxPool2 | 112x112x128 | 2x2 | 2 | 0 | 56x56x128 | 0 | 56x56x128 | |
Conv3-256 | 56x56x128 | 3x3x256 | 1 | 1 | 56x56x256 | 3x3x128x256 (+ 256) | 294912(295168) | 56x56x256 |
Conv3-256 | 56x56x256 | 3x3x256 | 1 | 1 | 56x56x256 | 3x3x256x256 (+ 256) | 589824(590080) | 56x56x256 |
Conv3-256 | 56x56x256 | 3x3x256 | 1 | 1 | 56x56x256 | 3x3x256x256 (+ 256) | 589824(590080) | 56x56x256 |
MaxPool2 | 56x56x256 | 2x2 | 2 | 0 | 28x28x256 | 0 | 28x28x256 | |
Conv3-512 | 28x28x256 | 3x3x512 | 1 | 1 | 28x28x512 | 3x3x256x512 (+ 512) | 1179648(1180160) | 28x28x512 |
Conv3-512 | 28x28x512 | 3x3x512 | 1 | 1 | 28x28x512 | 3x3x512x512 (+ 512) | 2359296(2359808) | 28x28x512 |
Conv3-512 | 28x28x512 | 3x3x512 | 1 | 1 | 28x28x512 | 3x3x512x512 (+ 512) | 2359296(2359808) | 28x28x512 |
MaxPool2 | 28x28x512 | 2x2 | 2 | 0 | 14x14x512 | 0 | 14x14x512 | |
Conv3-512 | 14x14x512 | 3x3x512 | 1 | 1 | 14x14x512 | 3x3x512x512 (+ 512) | 2359296(2359808) | 14x14x512 |
Conv3-512 | 14x14x512 | 3x3x512 | 1 | 1 | 14x14x512 | 3x3x512x512 (+ 512) | 2359296(2359808) | 14x14x512 |
Conv3-512 | 14x14x512 | 3x3x512 | 1 | 1 | 14x14x512 | 3x3x512x512 (+ 512) | 2359296(2359808) | 14x14x512 |
MaxPool2 | 14x14x512 | 2x2 | 2 | 0 | 7x7x512 | 0 | 7x7x512 | |
FC1 | 7x7x512 | 4096 | 7x7x512x4096 (+ 4096) | 102760448(102764544) | 4096 | |||
FC2 | 4096 | 4096 | 4096*4096 (+ 4096) | 16777216(16781312) | 4096 | |||
FC3 | 4096 | 1000 | 4096*1000 (+ 1000) | 4096000(4097000) | 1000 |
总共参数量为:138,344,128(138,375,544)
占用显存:
- 参数占用显存:138344128×4/1024/1024=527.74MB~528MB(共有138344128个参数,每个都是float32类型的,即一个占用32位=4bytes)
- 输出占用显存(和batch_size有关):15237608×4/1024/1024=58.12MB/image
模型的显存和参数量计算相关推荐
- Lesson 16.1016.1116.1216.13 卷积层的参数量计算,1x1卷积核分组卷积与深度可分离卷积全连接层 nn.Sequential全局平均池化,NiN网络复现
二 架构对参数量/计算量的影响 在自建架构的时候,除了模型效果之外,我们还需要关注模型整体的计算效率.深度学习模型天生就需要大量数据进行训练,因此每次训练中的参数量和计算量就格外关键,因此在设计卷积网 ...
- 常规-分组-深度分离-分组深度分离卷积-参数量-计算量-dilation-python实现
不同的卷积操作 本文所用样本 一般的卷积(常规的) 分组卷积 深度分离卷积 逐通道卷积(depthwise conv) 逐点卷积 (pointwise conv) 分组深度分离卷积 上面卷积总结 卷积 ...
- 深度学习模型参数量/计算量和推理速度计算
作者|龟壳 来源 | 知乎 地址 | https://zhuanlan.zhihu.com/p/376925457 本文仅作学术分享,若侵权请联系后台删文处理 本文总结了一些关于模型参数量计算以及推理 ...
- 模型大小 与参数量计算
1.model size 就是模型的大小,我们一般使用参数量parameter来衡量,注意,它的单位是个.但是由于很多模型参数量太大,所以一般取一个更方便的单位:兆(M) 来衡量.比如ResNet-1 ...
- 深度学习——参数量计算
一.卷积层参数计算 卷积层需要关注的参数有conv(kernel_size,in_channel,out_channel),即卷积核大小,输入输出通道数,和偏差bias. 计算公式:conv_para ...
- 不优雅地解决pytorch模型测试阶段显存溢出问题
在一次测试一个超分辨模型LESRCNN(作者提供了已训练好的模型)时,发生了CUDA out of memory的错误(虽然显卡有8G显存,但还是差了些): RuntimeError: CUDA ou ...
- 《南溪的目标检测学习笔记》——训练PyTorch模型遇到显存不足的情况怎么办(“OOM: CUDA out of memory“)
1 前言 在目标检测中,可能会遇到显存不足的情况,我们在这里记录一下解决方案: 2 如何判断真正是出现显存溢出(不是"软件误报") 当前需要分配的显存在600MiB以下, 例如: ...
- Flask 推理MXnet 模型时显存泄漏
1.问题描述 使用Flask做MXnet模型推理API时,每调用一次API,显存持续增长,直至最终显存爆炸强制退出程序. 注:使用MXnet做模型推理时,存在输入图片size不固定的情况. 2.解决方 ...
- pytorch测试模型时显存不够的问题
在训练过程中使用了分块训练,但是在测试的时候使用了整张图片输入到网络中,然后就出现了显存不够的问题 经验告诉我不应该不够,但是使用了分块训练,我也不知道是不是真的不够 一筹莫展之时,发现没有使用tor ...
最新文章
- “几何深度学习”受爱因斯坦启示:让AI摆脱平面看到更高的维度
- Ubuntu 设置NAT共享网络(命令行方法)
- 【Codeforces Round #299 (Div. 2) B】Tavas and SaDDas
- 中国无烟煤市场需求规模与未来发展形势分析报告2022版
- 用Groovy读取本地文件的代码
- iOS-cocoapods使用方法
- 【转载】广告系统架构解密
- python 函数 过程_python学习之函数(三)--函数与过程
- 推荐系统实战系列(python版).rar_python实战音乐推荐系统
- odoo10参考系列--视图三(其他高级视图)
- Spring(一)--作用、IOC容器细节、搭配环境、Spring实验
- java 占位符_Java重要知识点
- 怎么高速旋转_洗衣机怎么选比较好,滚筒洗衣机和波轮洗衣机哪种更好?
- Pytorch中DataLoader相关操作
- 进程调度算法Java
- 手机怎么看php格式的视频教程,wmv格式用手机怎么看
- windows环境下tensorflow手把手安装教程-pip安装
- GNSS/INS组合导航(五):惯性导航参数建模
- 简易的安卓天气app(四)——搜索城市、完善页面
- mysql出现2058,连接MySQL报“Error No.2058 Plugin caching_sha2_password could not be loaded”