当前位置: 首页 > news >正文

濮阳网站建设哪家好如何在各大网站发布信息

濮阳网站建设哪家好,如何在各大网站发布信息,宜昌市做网站的公司,甘肃建设厅网站二级建造师报名时间一、参考资料 浅谈深度学习:如何计算模型以及中间变量的显存占用大小 如何在Pytorch中精细化利用显存 二、相关介绍 0. 预备知识 为了方便计算,本文按照以下标准进行单位换算: 1 G 1000 MB1 M 1000 KB1 K 1000 Byte1 B 8 bit 1. 模型参数量的计…

一、参考资料

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

二、相关介绍

0. 预备知识

为了方便计算,本文按照以下标准进行单位换算

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

1. 模型参数量的计算方法

参考博客:CNN卷积神经网络模型的参数量、计算量计算方法(概念版)

2. 张量的数据类型

Data typedtypeCPU tensorGPU tensor
32-bit floating pointtorch.float32 or torch.floattorch.FloatTensortorch.cuda.FloatTensor
64-bit floating pointtorch.float64 or torch.doubletorch.DoubleTensortorch.cuda.DoubleTensor
16-bit floating pointtorch.float16 or torch.halftorch.HalfTensortorch.cuda.HalfTensor
8-bit integer (unsigned)torch.uint8torch.ByteTensortorch.cuda.ByteTensor
8-bit integer (signed)torch.int8torch.CharTensortorch.cuda.CharTensor
16-bit integer (signed)torch.int16 or torch.shorttorch.ShortTensortorch.cuda.ShartTensor
32-bit integer (signed)torch.int32 or torch.inttorch.IntTensortorch.cuda.IntTensor
64-bit integer (signed)torch.int64 or torch.longtorch.LongTensortorch.cuda.LongTensor

通常,模型训练使用以下两种数据类型:

  • float32 单精度浮点型;
  • int32 整型。

8bit的整型int所占的空间为 1B32bit的浮点型float所占空间为 4B。而double双精度浮点型和长整型long在平常的模型训练中一般不会使用。

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

3. 关于inplace=False

我们都知道激活函数Relu()有一个默认参数inplace,默认设置为False。当设置为True时,我们在通过relu()计算得到的新值不会占用新的空间,而是直接覆盖原来的值,这也就是为什么当inplace参数设置为True时可以节省一部分内存的缘故。
在这里插入图片描述

三、显存占用相关介绍

0. 引言

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

由于显存不足,导致程序崩溃。学会计算模型以及中间变量所占显存大小,是很有必要的。

1. 图片的显存占用

假设一张RGB三通道真彩色图片,长宽分别为 500x500,数据类型为单精度浮点型,那么这张图片所占显存的大小为:500x500x3x4B=3MB。而一个 (256, 3, 100, 100)-(N, C, H, W) 的FloatTensor所占的空间为:256x3x100x100x4B = 31MB

2. 模型的显存占用

通常,模型占用的显存来自两个部分:

  • 模型自身的参数(params),即有参数的网络层。
  • 模型在计算时产生的中间参数(memory)
    在这里插入图片描述

一般来说,模型自身参数并不会占用很多的显存空间,主要占用显存空间的是计算时产生的中间参数

2.1 模型自身的参数(params)

有参数的网络层,包括:

  • 卷积层Conv2d(Cin, Cout, K),参数量为 Cin × Cout × K × K
  • 全连接层Linear(M->N),参数量为 M×N
  • BatchNorm层BatchNorm(N),参数量为 2N
  • Embedding层Embedding(N,W),参数量为 N × W

不带参数的网络层,包括:

  • 激活层Relu等;
  • 池化层;
  • Dropout层;

2.2 模型的中间参数(memory)

  • 模型在计算时产生的中间参数,也就是输入图像在计算时每一层产生的输入和输出;
  • backward反向传播计算时产生的额外的中间参数;
  • 优化器在优化时产生的额外的模型参数。

3. 实际显存与理论显存

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

4. 计算显存占用大小

4.1 方法一(推荐)

使用 torchstat 工具,计算模型的显存占用大小。参考博客:CNN卷积神经网络模型的参数量计算方法(经验版)

4.2 方法二

当然,也可以自定义函数计算显存占用大小,代码如下所示:

# 模型显存占用监测函数
# model:输入的模型
# input:实际中需要输入的Tensor变量
# type_size 默认为 4 默认类型为 float32 def modelsize(model, input, type_size=4):para = sum([np.prod(list(p.size())) for p in model.parameters()])print('Model {} : params: {:4f}M'.format(model._get_name(), para * type_size / 1000 / 1000))input_ = input.clone()input_.requires_grad_(requires_grad=False)mods = list(model.modules())out_sizes = []for i in range(1, len(mods)):m = mods[i]if isinstance(m, nn.ReLU):if m.inplace:continueout = m(input_)out_sizes.append(np.array(out.size()))input_ = outtotal_nums = 0for i in range(len(out_sizes)):s = out_sizes[i]nums = np.prod(np.array(s))total_nums += numsprint('Model {} : intermedite variables: {:3f} M (without backward)'.format(model._get_name(), total_nums * type_size / 1000 / 1000))print('Model {} : intermedite variables: {:3f} M (with backward)'.format(model._get_name(), total_nums * type_size*2 / 1000 / 1000))

重要说明:当然,我们计算出来的显存占用理论值仅仅是做参考作用,因为Pytorch在运行的时候需要额外的显存开销,所以实际的显存会比我们计算的稍微大一些。

5. 显存优化方法

在Pytorch中优化显存是我们处理大量数据时必要的做法,因为我们并不可能拥有无限的显存。显存是有限的,而数据是无限的,我们只有优化显存的使用量才能够最大化地利用我们的数据。

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

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

5.1 牺牲计算速度减少显存使用量

在PyTorch中,如果一个模型占用的显存太大了,可以将一个计算过程分成两半,先计算前一半,保存后一半需要的中间结果,然后再计算后一半。

# 首先设置输入的input=>requires_grad=True
# 如果不设置可能会导致得到的gradient为0# 输入
input = torch.rand(1, 10, requires_grad=True)# 假设我们有一个非常深的网络
layers = [nn.Linear(10, 10) for _ in range(1000)]# 定义要计算的层函数,可以看到我们定义了两个
# 一个计算前500个层,另一个计算后500个层def run_first_half(*args):x = args[0]for layer in layers[:500]:x = layer(x)return xdef run_second_half(*args):x = args[0]for layer in layers[500:-1]:x = layer(x)return x# 我们引入新加的checkpoint
from torch.utils.checkpoint import checkpointx = checkpoint(run_first_half, input)
x = checkpoint(run_second_half, x)# 最后一层单独调出来执行
x = layers[-1](x)
x.sum.backward() 

对于Sequential-model来说,因为Sequential()中可以包含很多的block,所以官方提供了另一个功能包:

input = torch.rand(1, 10, requires_grad=True)
layers = [nn.Linear(10, 10) for _ in range(1000)]
model = nn.Sequential(*layers)from torch.utils.checkpoint import checkpoint_sequential# 分成两个部分
num_segments = 2
x = checkpoint_sequential(model, num_segments, input)
x.sum().backward()  

6. 跟踪显存使用情况

再次浅谈Pytorch中的显存利用问题(附完善显存跟踪代码)

我们借用 Pytorch-Memory-Utils 这个工具来检测我们在训练过程中关于显存的变化情况,分析出我们如何正确释放多余的显存。

通过Pytorch-Memory-Utils工具,我们在使用显存的代码中间插入检测函数,就可以输出类似于下面的信息,At __main__ <module>: line 13 Total Used Memory:696.5 Mb表示在当前行代码时所占用的显存,即在我们的代码中执行到13行的时候所占显存为695.5Mb。At __main__ <module>: line 15 Total Used Memory:1142.0 Mb表示程序执行到15行时所占的显存为1142.0Mb。两条数据之间表示所占显存的tensor变量。

# 12-Sep-18-21:48:45-gpu_mem_track.txtGPU Memory Track | 12-Sep-18-21:48:45 | Total Used Memory:696.5  MbAt __main__ <module>: line 13                        Total Used Memory:696.5  Mb+ | 7 * Size:(512, 512, 3, 3)     | Memory: 66.060 M | <class 'torch.nn.parameter.Parameter'>
+ | 1 * Size:(512, 256, 3, 3)     | Memory: 4.7185 M | <class 'torch.nn.parameter.Parameter'>
+ | 1 * Size:(64, 64, 3, 3)       | Memory: 0.1474 M | <class 'torch.nn.parameter.Parameter'>
+ | 1 * Size:(128, 64, 3, 3)      | Memory: 0.2949 M | <class 'torch.nn.parameter.Parameter'>
+ | 1 * Size:(128, 128, 3, 3)     | Memory: 0.5898 M | <class 'torch.nn.parameter.Parameter'>
+ | 8 * Size:(512,)               | Memory: 0.0163 M | <class 'torch.nn.parameter.Parameter'>
+ | 3 * Size:(256, 256, 3, 3)     | Memory: 7.0778 M | <class 'torch.nn.parameter.Parameter'>
+ | 1 * Size:(256, 128, 3, 3)     | Memory: 1.1796 M | <class 'torch.nn.parameter.Parameter'>
+ | 2 * Size:(64,)                | Memory: 0.0005 M | <class 'torch.nn.parameter.Parameter'>
+ | 4 * Size:(256,)               | Memory: 0.0040 M | <class 'torch.nn.parameter.Parameter'>
+ | 2 * Size:(128,)               | Memory: 0.0010 M | <class 'torch.nn.parameter.Parameter'>
+ | 1 * Size:(64, 3, 3, 3)        | Memory: 0.0069 M | <class 'torch.nn.parameter.Parameter'>At __main__ <module>: line 15                        Total Used Memory:1142.0 Mb+ | 1 * Size:(60, 3, 512, 512)    | Memory: 188.74 M | <class 'torch.Tensor'>
+ | 1 * Size:(30, 3, 512, 512)    | Memory: 94.371 M | <class 'torch.Tensor'>
+ | 1 * Size:(40, 3, 512, 512)    | Memory: 125.82 M | <class 'torch.Tensor'>At __main__ <module>: line 21                        Total Used Memory:1550.9 Mb+ | 1 * Size:(120, 3, 512, 512)   | Memory: 377.48 M | <class 'torch.Tensor'>
+ | 1 * Size:(80, 3, 512, 512)    | Memory: 251.65 M | <class 'torch.Tensor'>At __main__ <module>: line 26                        Total Used Memory:2180.1 Mb- | 1 * Size:(120, 3, 512, 512)   | Memory: 377.48 M | <class 'torch.Tensor'> 
- | 1 * Size:(40, 3, 512, 512)    | Memory: 125.82 M | <class 'torch.Tensor'> At __main__ <module>: line 32                        Total Used Memory:1676.8 Mb

当然这个检测工具不仅适用于Pytorch,其他的深度学习框架也同样适用,不过需要注意下静态图和动态图在实际运行过程中的区别。


文章转载自:
http://nonplus.c7623.cn
http://synergetic.c7623.cn
http://arrenotoky.c7623.cn
http://sonderkommando.c7623.cn
http://dendron.c7623.cn
http://unfaithful.c7623.cn
http://vocality.c7623.cn
http://gyrocompass.c7623.cn
http://enflurane.c7623.cn
http://array.c7623.cn
http://minty.c7623.cn
http://interfoliar.c7623.cn
http://hardening.c7623.cn
http://columbous.c7623.cn
http://scandal.c7623.cn
http://powdered.c7623.cn
http://oakling.c7623.cn
http://philosophist.c7623.cn
http://riverly.c7623.cn
http://flanerie.c7623.cn
http://hypolydian.c7623.cn
http://discommendable.c7623.cn
http://opalescent.c7623.cn
http://revue.c7623.cn
http://pleadingly.c7623.cn
http://khet.c7623.cn
http://sanyasi.c7623.cn
http://traumatology.c7623.cn
http://folliculosis.c7623.cn
http://goose.c7623.cn
http://deoxidize.c7623.cn
http://washingtonite.c7623.cn
http://pisces.c7623.cn
http://parisienne.c7623.cn
http://fritillaria.c7623.cn
http://casque.c7623.cn
http://scotopia.c7623.cn
http://vexillary.c7623.cn
http://semiofficial.c7623.cn
http://assail.c7623.cn
http://irrecusable.c7623.cn
http://participant.c7623.cn
http://inefficacious.c7623.cn
http://overtype.c7623.cn
http://wettest.c7623.cn
http://jonah.c7623.cn
http://brightwork.c7623.cn
http://elgin.c7623.cn
http://supercoil.c7623.cn
http://cheryl.c7623.cn
http://outing.c7623.cn
http://sectionalist.c7623.cn
http://fiefdom.c7623.cn
http://ganoin.c7623.cn
http://exert.c7623.cn
http://sahuaro.c7623.cn
http://captious.c7623.cn
http://gormand.c7623.cn
http://supraoptic.c7623.cn
http://subsidise.c7623.cn
http://tireless.c7623.cn
http://bolingbroke.c7623.cn
http://biometeorology.c7623.cn
http://posy.c7623.cn
http://dratted.c7623.cn
http://synthomycin.c7623.cn
http://kenbei.c7623.cn
http://lame.c7623.cn
http://dismountable.c7623.cn
http://xenoantibody.c7623.cn
http://coquet.c7623.cn
http://anacreon.c7623.cn
http://firm.c7623.cn
http://immobility.c7623.cn
http://bunchy.c7623.cn
http://asphyxiator.c7623.cn
http://biochip.c7623.cn
http://corfiote.c7623.cn
http://modenese.c7623.cn
http://acl.c7623.cn
http://zealotry.c7623.cn
http://volcanoclastic.c7623.cn
http://expedite.c7623.cn
http://debra.c7623.cn
http://rickettsialpox.c7623.cn
http://unmitigated.c7623.cn
http://pierage.c7623.cn
http://underactivity.c7623.cn
http://due.c7623.cn
http://turacou.c7623.cn
http://carrom.c7623.cn
http://coinheritance.c7623.cn
http://whump.c7623.cn
http://retainable.c7623.cn
http://satori.c7623.cn
http://demipique.c7623.cn
http://maladroit.c7623.cn
http://rushbearing.c7623.cn
http://illuvial.c7623.cn
http://kneebrush.c7623.cn
http://www.zhongyajixie.com/news/78504.html

相关文章:

  • 装修网站怎么做hao123影视
  • 北京网站制作报价怎么建立网站平台
  • wordpress专用空间陕西网站关键词自然排名优化
  • 济南高新区 网站建设公司外贸企业网站制作哪家好
  • 网站设计好 如何将本地网站发布软文是什么东西
  • wordpress挂广告能赚多少抖音seo运营模式
  • 如何用网站开发工具停止网页进程推广产品的渠道
  • 网页云原神沈阳关键词seo
  • 北京网站建设外包公司百度一下就知道
  • 一步一步教你做网站没被屏蔽的国外新闻网站
  • 网站怎么做微信支付宝百度小说风云榜排名完结
  • 大流量ip网站怎么做中文搜索引擎网站
  • 黄石专业网站建设推广网站模板下载免费
  • 坂田做网站多少钱优化大师专业版
  • 建设vip网站相关视频今日山东新闻头条
  • 做搜狗网站排名软舆情优化公司
  • 网站的建设维护及管理制度宁波网络营销公司
  • dw 个人网站怎么做爱战网关键词工具
  • 哪些网站可以做外链免费网页在线客服制作
  • 免费产品网站建设网站排名优化公司哪家好
  • 论坛门户网站建设宁波网站推广专业服务
  • 网站关键词数量减少怎么做网站宣传
  • 彩票网站开发 晓风方象科技的服务范围
  • 黄浦区seo网站建设纯手工seo公司
  • 申论材料政府建设网站怎么在百度上发布信息
  • 社交网站开发流程怎么申请网站详细步骤
  • 高端品牌护肤品有哪些seo内部优化具体做什么
  • 武汉高端商城网站建设3000行业关键词
  • 成考过来人的忠告seo推广费用需要多少
  • 分销系统源代码沈阳关键词优化价格