浅谈深度学习:如何计算模型以及中间变量的显存占用大小

您所在的位置:网站首页 如何计算模型要多大的显存 浅谈深度学习:如何计算模型以及中间变量的显存占用大小

浅谈深度学习:如何计算模型以及中间变量的显存占用大小

2024-06-30 11:11:55| 来源: 网络整理| 查看: 265

点击小眼睛开启蜘蛛网特效 浅谈深度学习:如何计算模型以及中间变量的显存占用大小 Oldpan 2018年6月7日 11条评论 40,306次阅读 67人点赞 《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》前言

亲,显存炸了,你的显卡快冒烟了!

torch.FatalError: cuda runtime error (2) : out of memory at /opt/conda/conda-bld/pytorch_1524590031827/work/aten/src/THC/generic/THCStorage.cu:58

想必这是所有炼丹师们最不想看到的错误,没有之一。

OUT OF MEMORY,显然是显存装不下你那么多的模型权重还有中间变量,然后程序奔溃了。怎么办,其实办法有很多,及时清空中间变量,优化代码,减少batch,等等等等,都能够减少显存溢出的风险。

但是这篇要说的是上面这一切优化操作的基础,如何去计算我们所使用的显存。学会如何计算出来我们设计的模型以及中间变量所占显存的大小,想必知道了这一点,我们对自己显存也就会得心应手了。

如何计算

首先我们应该了解一下基本的数据量信息:

1 G = 1000 MB 1 M = 1000 KB 1 K = 1000 Byte 1 B = 8 bit

好,肯定有人会问为什么是1000而不是1024,这里不过多讨论,只能说两种说法都是正确的,只是应用场景略有不同。这里统一按照上面的标准进行计算。

然后我们说一下我们平常使用的向量所占的空间大小,以Pytorch官方的数据格式为例(所有的深度学习框架数据格式都遵循同一个标准):

《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》

我们只需要看左边的信息,在平常的训练中,我们经常使用的一般是这两种类型:

float32 单精度浮点型 int32 整型

一般一个8-bit的整型变量所占的空间为1B也就是8bit。而32位的float则占4B也就是32bit。而双精度浮点型double和长整型long在平常的训练中我们一般不会使用。

ps:消费级显卡对单精度计算有优化,服务器级别显卡对双精度计算有优化。

也就是说,假设有一幅RGB三通道真彩色图片,长宽分别为500 x 500,数据类型为单精度浮点型,那么这张图所占的显存的大小为:500 x 500 x 3 x 4B = 3M。

而一个(256,3,100,100)-(N,C,H,W)的FloatTensor所占的空间为256 x 3 x 100 x 100 x 4B = 31M

不多是吧,没关系,好戏才刚刚开始。

显存去哪儿了

看起来一张图片(3x256x256)和卷积层(256x100x100)所占的空间并不大,那为什么我们的显存依旧还是用的比较多,原因很简单,占用显存比较多空间的并不是我们输入图像,而是神经网络中的中间变量以及使用optimizer算法时产生的巨量的中间参数。

我们首先来简单计算一下Vgg16这个net需要占用的显存:

通常一个模型占用的显存也就是两部分:

模型自身的参数(params) 模型计算产生的中间变量(memory)

《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》

图片来自cs231n,这是一个典型的sequential-net,自上而下很顺畅,我们可以看到我们输入的是一张224x224x3的三通道图像,可以看到一张图像只占用150x4k,但上面标注的是150k,这是因为上图中在计算的时候默认的数据格式是8-bit而不是32-bit,所以最后的结果要乘上一个4。

我们可以看到,左边的memory值代表:图像输入进去,图片以及所产生的中间卷积层所占的空间。我们都知道,这些形形色色的深层卷积层也就是深度神经网络进行“思考”的过程:

《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》

图片从3通道变为64 –> 128 –> 256 –> 512 …. 这些都是卷积层,而我们的显存也主要是他们占用了。

还有上面右边的params,这些是神经网络的权重大小,可以看到第一层卷积是3×3,而输入图像的通道是3,输出通道是64,所以很显然,第一个卷积层权重所占的空间是 (3 x 3 x 3) x 64。

另外还有一个需要注意的是中间变量在backward的时候会翻倍!

为什么,举个例子,下面是一个计算图,输入x,经过中间结果z,然后得到最终变量L:

《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》

我们在backward的时候需要保存下来的中间值。输出是L,然后输入x,我们在backward的时候要求L对x的梯度,这个时候就需要在计算链L和x中间的z:

《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》

dz/dx这个中间值当然要保留下来以用于计算,所以粗略估计,backward的时候中间变量的占用了是forward的两倍!

优化器和动量

要注意,优化器也会占用我们的显存!

为什么,看这个式子:

《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》

上式是典型的SGD随机下降法的总体公式,权重W在进行更新的时候,会产生保存中间变量《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》,也就是在优化的时候,模型中的params参数所占用的显存量会翻倍。

当然这只是SGD优化器,其他复杂的优化器如果在计算时需要的中间变量多的时候,就会占用更多的内存。

模型中哪些层会占用显存

有参数的层即会占用显存的层。我们一般的卷积层都会占用显存,而我们经常使用的激活层Relu没有参数就不会占用了。

占用显存的层一般是:

卷积层,通常的conv2d 全连接层,也就是Linear层 BatchNorm层 Embedding层

而不占用显存的则是:

刚才说到的激活层Relu等 池化层 Dropout层

具体计算方式:

Conv2d(Cin, Cout, K): 参数数目:Cin × Cout × K × K Linear(M->N): 参数数目:M×N BatchNorm(N): 参数数目: 2N Embedding(N,W): 参数数目: N × W 额外的显存

总结一下,我们在总体的训练中,占用显存大概分以下几类:

模型中的参数(卷积层或其他有参数的层) 模型在计算时产生的中间参数(也就是输入图像在计算时每一层产生的输入和输出) backward的时候产生的额外的中间参数 优化器在优化时产生的额外的模型参数

但其实,我们占用的显存空间为什么比我们理论计算的还要大,原因大概是因为深度学习框架一些额外的开销吧,不过如果通过上面公式,理论计算出来的显存和实际不会差太多的。

如何优化

优化除了算法层的优化,最基本的优化无非也就一下几点:

减少输入图像的尺寸 减少batch,减少每次的输入图像数量 多使用下采样,池化层 一些神经网络层可以进行小优化,利用relu层中设置inplace 购买显存更大的显卡 从深度学习框架上面进行优化

下篇文章我会说明如何在Pytorch这个深度学习框架中跟踪显存的使用量,然后针对Pytorch这个框架进行有目的显存优化。

参考: https://blog.csdn.net/liusandian/article/details/79069926

《浅谈深度学习:如何计算模型以及中间变量的显存占用大小》

  点赞 分享

打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮

cuda 机器学习 深度学习 深度学习库 算法 本篇文章采用 署名-非商业性使用-禁止演绎 4.0 国际 进行许可 转载请务必注明来源: https://oldpan.me/archives/how-to-calculate-gpu-memory

   关注Oldpan博客微信公众号,你最需要的及时推送给你。

 猜你喜欢 大大大大大模型部署方案抛砖引玉 深度学习部署神器-triton inference server第一篇 馋了馋NVIDIA Jetson Orin嵌入式AI开发板 TORCH.FX第二篇——PTQ量化实操 老潘的思考 算法工程师老潘的一些经验 Pingback: [Pytorch]深度模型的显存计算以及优化_Python技术站 z zzq说道: 2019年12月4日 下午8:48

博主你好,优化器占用显存那里,下三角F(W),不就是W的梯度吗?在反向传播的时候不是已经保存了吗?为什么优化器那里还要翻倍那?

木 木子说道: 2019年10月18日 下午5:24

大佬,dropout层我有点疑问,之前看到说dropout层在每个神经元上加个标记,然后根据标记算什么神经元参加更新什么神经元不参加更新,这里面的标记算参数吗?

O Oldpan说道: 2019年10月21日 下午4:35

不算,不是参数不能被更新,和卷积中的卷积核大小一样,是固定的,在实际训练预测中可以忽略

嗷 嗷嗷说道: 2019年5月13日 下午2:11

4g显存load200mb的h5权重总是失败,load100mb左右的都可以成功

O Oldpan说道: 2019年5月14日 下午8:33

你还执行什么操作了,如果只是加载200MB的权重4G显存是可以的

Pingback: 浅谈深度学习:如何计算模型以及中间变量的显存占用大小 | AI柠檬 A Aren说道: 2018年12月4日 上午9:48

自己在caffe中构建的双线性插值上采样层的参数如何估算?其输入输出也占用显存?

O Oldpan说道: 2018年12月4日 下午8:14

上采样操作,要看有没有需要学习的参数?输入输出可以忽略主要是中间变量占显存。

Pingback: 再次浅谈Pytorch中的显存利用问题(附完善显存跟踪代码) - Oldpan的个人博客 Pingback: 如何在Pytorch中精细化利用显存 - Oldpan的个人博客 Dontation

如果你与我志同道合于此,很愿意与你交流

如果你喜欢我的内容,欢迎关注和支持~

-------这是人工分割线------- 联系我请关注公众号哦关注 oldpan博客 不错过老潘的最新文章。公众号回复"666"获取老潘的宝藏资料(C++、CUDA、Python、深度学习、算法),希望与你交朋友~

公众号 weixin_social 微信捐赠 weixin_pay 标签聚合深度学习 机器学习 算法 pytorch 环境搭建 python 深度学习库 基础 服务器 互联网 运维 cuda 日志 博客 教程 TensorRT Web 程序 故障问题 推荐 ubuntu pycharm JavaScript TensorFlow 资讯 代码 C/C++ 数据集 资源 电脑 热门文章 本站专栏 社区文章 暂时没有数据 深度学习那些事-云+社区 腾讯云 深度学习那些事-知乎专栏 深度学习那些事-掘金专栏 CSDN-Oldpan博客 深度学习(DeepLearning)专栏 Pytorch深度学习框架专栏 每日一词

“逆转裁判”有趣单词 点击进入

最新评论 如 罗密: “老潘,想找你帮做一个ai模型工业部署,有…” 5月 28, 07:05 如 老牛: “我的博客又复活了 已添加友链” 3月 12, 10:48 如 Termi: “来催更了(不是) :evil:” 2月 28, 22:13 如 上海短视频拍摄: “非常不错” 2月 23, 23:54 如 上海短视频拍摄: “写的很好” 2月 23, 22:03 如 上海短视频拍摄: “感谢分享” 2月 23, 22:01

 友链  资源  RSS          洛奇

Copyright 2024 Oldpan的个人博客. All Rights Reserved.     Thanks the theme by Kratos 陕ICP备17018520号-1



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭