位置: IT常识 - 正文

深度学习之GPU显存与利用率 浅析小结

编辑:rootadmin
深度学习之GPU显存与利用率 浅析小结 相信很多人,包括我在内,都对GPU的显存抱有不小的怨念,CUDA out of memory之类的问题一直困扰着咱等,今天这篇文章就是来浅析一下,说不定会有所帮助

推荐整理分享深度学习之GPU显存与利用率 浅析小结,希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:,内容如对您有帮助,希望把文章链接给更多的朋友!

首先就一笔带过说一下GPU的重要性吧,以Pytorch为例,就是使用CUDA,cuDNN对深度学习的模型推理时执行的各种计算转换为矩阵乘法进行加速,来达到从猴年马月的运行,到现在几十成百倍的提速。 至于我们爱之深恨之切的显存呢,以数据读取时GPU运行内存的变化作为参考,具体实现机制一般是通过worker进程+队列的方式,让多个worker异步地读取、预处理数据入列,然后主管训练主进程从队列的另一头取数据。如果队列满了、训练进程来不及取数据,worker进程就会阻塞住,运行内存也就不会无限制地增长了。

torch.utils.data.DataLoader(datasets[x], batch_size=batch_size, shuffle=True, num_workers=8, pin_memory=True)

注意:打印日志、计算eta等无关数据处理和计算的操作也会占用不少CPU处理时间。 先粗略讲一下 batch_size管显存(不完全成正比,模型自身的参数及其延伸出来的数据也要占据显存),num_workers管GPU利用率(使得CPU加载数据和GPU处理速度能够匹配,联想操作系统就能理解),后面两者都会提到

显而易见, 将数据的加载,预处理,后处理等放在CPU上进行,也就是其他读写的IO任务。并通过调节num_workers数量来调节GPU利用率是个不错的办法。数量设置在一个比较大的范围内比较好(可以考虑4-8),但不是越大越好。因为越大,虽然线程多了,但是切分到每一个线程消耗也大了,所以会增加CPU的负荷,从而降低对GPU的利用。num_workers数一般和batch_size数配合使用。 除此之外,当你的服务器或者电脑的内存较大,性能较好的时候,建议打开pin_memory打开,就省掉了将数据从CPU传入到缓存RAM里面,再给传输到GPU上;为True时是直接映射到GPU的相关内存块上,省掉了一点数据传输时间。 这里注意一下,数据loading的时候建议在dataset的__init__里或者pipeline中通过调用数据导入方法全部load进来,而不是在getitem方法中写。

因此,针对于此,一个粗糙的方法就是在多GPU的时候采取ddp模式(线程不要太多),用共享内存的方法,让rank0的进程把这些标注数据和扔到共享内存里,然后其他所有进程都只读、映射这段内存,实现了零拷贝。

若只是GPU利用率低的话,第一是增加batch size,增加GPU的内存占用率,尽量用完内存,而不要剩一半,空的内存给另外的程序用,两个任务的效率都会非常低。第二,在数据加载时候,将num_workers线程数设置稍微大一点,推荐是8,16等,且开启pin_memory=True。不要将整个任务放在主进程里面做,这样消耗CPU,且速度和性能极为低下。

其次,考虑模型本身的影响,分别是模型参数和各层的响应,均与模型复杂度有关,以Resnet50为例,有26 million参数,若使用32-bit浮点精度,那么占内存:26M * 32 bit = 99MB。同时他有16 million响应,占内存:16M*32bit = 64MB。 响应和模型参数的数量并没有直接关系。卷积层可以有很大尺寸的响应,但只有很少的参数;激活层甚至可以没有参数。

可能到这里你会觉得才100M多一些,影响也不大啊,非也非也,这时候就是batchsize登场的时候了。

为了有效利用GPU的SIMD机制,要把数据以mini-batch的形式输入网络。 如果要用32 bit的浮点数填满常见的1024 bit通路,需要32个样本同时计算。 在使用mini-batch时,模型参数依然只保存一份,但各层响应需要按mini-batch大小翻倍。

50层的ResNet,mini-batch=32,各层响应占内存:64MB*32 = 2GB

不过,2G还不是终点,在深度学习库中,一般会采用**lowering的方式,把卷积计算转换成矩阵乘法**。 在计算此类卷积时,前层响应X XX需要扩大K^2 倍。

深度学习之GPU显存与利用率 浅析小结

50层的ResNet,考虑lowering效应时,各层响应占内存7.5GB

还要注意的一个问题就是,你的网络训练结束的标准是什么。是以epoch还是iteration为标准。如果是以iteration为标准,那么你加大batch_size大小,网络训练时间自然就会增加,此时需要在batch_size翻倍时iteration打对折。如果是以epoch为标准,那么更改batch_size时不需要做其他更改。

显存占用 ≈ 模型显存占用 + batch_size × 每个样本的显存占用,可以这么简单来看待

之前都是以ResNet50举例,下面换成GPT-2可能更接近现在的网络结构。

引言

对于一个1.5B参数量的GPT-2模型,在16比特精度下需要3GB的内存来存储它的权重(或参数),但它却没法在具有32GB显存的一块GPU上进行训练。模型训练过程中,大部分的内存开销用于model states,例如优化器的状态、梯度和参数。除了模型状态之外,剩下的内存开销则来自于residual states,例如激活值、临时区缓存和内存碎片。

Model States

以Adam为例,它需要存储两部分的优化器状态:time averaged momentum和variance of the gradients。因此,在使用Adam进行模型训练的时候需要有足够的的内存空间来存储动量估计和梯度方差的复制值,除此之外还需要有足够的空间存储模型本身的梯度和权重。优化器的状态通常会占到很大一部分的内存,这在混合精度训练中尤为明显。

在混合精度(fp16/32)训练中,模型参数和激活值是以fp16的格式进行保存,前向和反向传播中也使用fp16的权重和激活值进行计算。然而为了更高效的计算和保证梯度更新的正确(混合精度训练会出现舍入误差),通常会同时拷贝一份fp32的权重和优化器状态。

举例:对于一个参数量大小为 γ 的模型使用Adam和混合精度进行训练。首先它分别需要 2γ 的内存来存储fp16拷贝的参数和权重,分别需要 4γ 的内存来存储fp32拷贝的参数、动量估计和梯度方差。这里用 K 来表示存储优化器状态的所需的额外内存开销倍数,混合精度Adam对应的 K = 12 。综上,训练这样一个模型所需要的内存开销为 2γ + 2γ + Kγ = 16γ。对于一个参数量为1.5B的GPT-2模型,所需的训练内存消耗至少为24GB,远大于fp16格式下模型本身3GB大小的参数量。

Residual StatesActivation

在训练过程中激活值会占到很大一部分的内存。Transformer结构的模型的激活值所占内存与 transformers_layers * hidden_dimensions * sequence_length * batch_size 的大小成正比,对于GPT-2模型来说,激活值内存为 12 * hiddem_dim * bsz * seq_length * transformer_layers 。因此,对于一个1.5B参数量、sequence length为1K、batch size为32的GPT-2模型,需要的内存为60GB。

虽然activation checkpointing技术能够以33%的重新计算激活值的运算代价实现激活值所占显存近似根号倍的降低(这就能够将上述模型所需的激活值内存降低到8GB左右),对于更大的模型来说效果还是有限的(100B参数量的GPT模型在使用activation checkpointing的基础上仍需要60G的内存)。

Temporary buffers

保存中间计算结果的临时区缓存,例如梯度的all-reduce,或者为了提升throughput而在all-reduce前将所有的梯度结果融合成为single flattened buffer的梯度标准化计算(gradient norm computation)。对于1.5B参数量的模型,fp32下的flattened buffer内存占用就会达到6GB。

Memory Fragmentation

即使内存大小大于理论上模型训练需要的内存开销,由于内存碎片的存在(空闲内存以不连续的方式出现在不同的位置,导致没有连续的内存来应对模型训练中的需求),还是有可能出现内存不足的错误。训练超大模型时,在某些极端情况下,内存剩余还有30%的时候还会出现OOM(out of memory)的问题。

显存用到刚刃上的简单方法推荐

1.为了有效利用SIMD,如果精度降低一倍,batch大小要扩大一倍。不能降低内存消耗。但可以使用英伟达的apex混合精度加速,pytorch显存直接砍一半。 2. in-place运算:不开辟新内存,直接重写原有响应。很多激活函数都可以这样操作。如nn.ReLU(inplace=True),也就是尽量使用inplace操作flag。 复杂一些,通过分析整个网络图,可以找出只需要用一次的响应,它可以和后续响应共享内存。例如MxNet的memory sharing机制。 3. 计算换存储:找出那些容易计算的响应结果(例如激活函数层的输出)不与存储,在需要使用的时候临时计算。使用这种方法,MxNet的这个例子能够把50层的ResNet网络占用的内存减小四倍。

还可以看看这里的10多种方法 Trick

最后,如果你能优化算法运算,在网络图结构上优化单位batchsize的显存占用量,自然就可以装下更多的batchsize,来更充分的利用GPU core。参考https://www.zhihu.com/question/476086761https://blog.csdn.net/shenxiaolu1984/article/details/71522141https://zhuanlan.zhihu.com/p/362556069https://blog.csdn.net/qq_45756171/article/details/122910838https://zhuanlan.zhihu.com/p/348122818https://blog.csdn.net/qq_34405401/article/details/108519823https://zhuanlan.zhihu.com/p/520898642https://zhuanlan.zhihu.com/p/31558973https://www.cnblogs.com/jiangkejie/p/10098995.html
本文链接地址:https://www.jiuchutong.com/zhishi/288847.html 转载请保留说明!

上一篇:薰衣草田,英国牛津 (© Peter Greenway/EyeEm/Getty Images)(薰衣草 英国)

下一篇:阿尔卑斯旱獭,奥地利陶恩山国家公园 (© Misja Smits/Minden Pictures)(阿尔卑斯旱獭冬眠)

  • 借呗怎么清除借款及还款记录呢(借呗如何清除借款及还款记录)

    借呗怎么清除借款及还款记录呢(借呗如何清除借款及还款记录)

  • 电脑版怎么做柱形图(在电脑上如何做柱状图)

    电脑版怎么做柱形图(在电脑上如何做柱状图)

  • 手机丢了卡补回来了还能定位吗(手机丢了卡补回来了微信里的钱会不会被刷)

    手机丢了卡补回来了还能定位吗(手机丢了卡补回来了微信里的钱会不会被刷)

  • 钉钉可以在手机和电脑同时使用吗(钉钉下载安装手机版app)

    钉钉可以在手机和电脑同时使用吗(钉钉下载安装手机版app)

  • 移动升级5g需要换卡吗(移动升级5g需要换sim卡吗)

    移动升级5g需要换卡吗(移动升级5g需要换sim卡吗)

  • mp4的视频是什么格式(mp4的视频是什么样子)

    mp4的视频是什么格式(mp4的视频是什么样子)

  • 手机信号和wifi信号有关系吗(手机信号和wifi信号区别)

    手机信号和wifi信号有关系吗(手机信号和wifi信号区别)

  • 电脑自带麦克风吗(电脑自带麦克风在哪)

    电脑自带麦克风吗(电脑自带麦克风在哪)

  • 抖音巨量引擎推广有没有效果(抖音巨量引擎推广直播)

    抖音巨量引擎推广有没有效果(抖音巨量引擎推广直播)

  • 怎么注销淘宝账号重新申请(怎么注销淘宝账号不注销支付宝)

    怎么注销淘宝账号重新申请(怎么注销淘宝账号不注销支付宝)

  • 全家福可以送好友吗(全家福能送人么)

    全家福可以送好友吗(全家福能送人么)

  • 电信1mbps是什么意思(电信限速1mbps是多少网速)

    电信1mbps是什么意思(电信限速1mbps是多少网速)

  • hips什么意思(mychips什么意思)

    hips什么意思(mychips什么意思)

  • 手机收验证码要钱吗(手机收验证码要钱吗是真的吗)

    手机收验证码要钱吗(手机收验证码要钱吗是真的吗)

  • vivos5支持otg吗(vivos5可以插u盘吗)

    vivos5支持otg吗(vivos5可以插u盘吗)

  • 手机桌面悬浮球怎么取消(手机桌面悬浮球下载)

    手机桌面悬浮球怎么取消(手机桌面悬浮球下载)

  • 发说说怎么取消手机标识(发说说怎么取消话题显示)

    发说说怎么取消手机标识(发说说怎么取消话题显示)

  • 荣耀20设置时间在哪里(荣耀设置时间24小时制的在哪里)

    荣耀20设置时间在哪里(荣耀设置时间24小时制的在哪里)

  • 华为其他设置在哪里(华为其他设置在什么里面找)

    华为其他设置在哪里(华为其他设置在什么里面找)

  • 微信步数每天几点截止(微信步数每天几百在干嘛)

    微信步数每天几点截止(微信步数每天几百在干嘛)

  • win10系统一拖二教程(win10 一拖二)

    win10系统一拖二教程(win10 一拖二)

  • lazada是阿里巴巴的吗(阿里巴巴lazada财报)

    lazada是阿里巴巴的吗(阿里巴巴lazada财报)

  • 苹果a11有必要换a12吗(苹果11可以换a14处理器吗)

    苹果a11有必要换a12吗(苹果11可以换a14处理器吗)

  • 飞行模式在哪里找(飞行模式在哪里关闭)

    飞行模式在哪里找(飞行模式在哪里关闭)

  • win10电源设置方法(win10的电源设置)

    win10电源设置方法(win10的电源设置)

  • 实验七 视图(视图的定义和操作实验报告)

    实验七 视图(视图的定义和操作实验报告)

  • 纳税义务发生时间和申报纳税的时间
  • 缴纳附加税会计科目怎么做
  • 收到应收账款逾期短信
  • 新公司的注册资本
  • 如何进行无形资产核算
  • 发行债券的会计要素
  • 建筑公司外包工程收入怎么记账
  • 所得税汇算清缴报告在哪查
  • 建设单位收到施工承包单位的单位工程验收申请后应组织
  • 软件开发公司怎么找客户
  • 自然人股权转让涉税信息怎么填
  • 增值税发票退票时间
  • 公司买理财产品的账务处理
  • 厂房租赁税率是房东交的吗
  • 收到供应商开具什么发票
  • 所得税汇算成本调减会计分录
  • 企业借款增加实际成本
  • 建筑业调试费进什么科目?
  • 小规模企业如何收款
  • 出口货物退免税凭证资料应当保存几年
  • 生产成本中的电费计入制造费用吗
  • 维修进水的笔记怎么写
  • Windows11怎么免费升级专业版
  • 公司补缴印花税的后果
  • 房产税的征收范围为
  • win11如何降到win10
  • 华为鸿蒙harmonyos官网4.0
  • 管理软件对相机的要求
  • dgservice.exe是什么文件
  • launcher.exe是什么,每次开机都是否需要进行更改
  • linux命令行使用鼠标
  • 包装物押金收入计入收入总额吗
  • 出口收汇可以收人民币吗
  • 开出发票单位收到款项如何平账?
  • 应交所得税和所得税费用的区别计算公式
  • 烟草企业亏损
  • 阿查法拉亚盆地 钓鱼
  • 暂估成本的账务处理分录
  • 2023跨年烟花链接
  • 人工智能导论论文2000字
  • chage -l命令
  • 采矿权价款怎么做账
  • 投资公司如何注册勘察设计工程师证书
  • python从键盘输入正整数n,计算1+2+3
  • 帝国cms模型
  • python copyto
  • 旅游门票费用可以用来报销吗?
  • 固定资产有内容限制吗
  • 开具增值税专用发票是什么意思
  • 电子缴款凭证在哪里找
  • 融资租赁租金计算工具使用的主要过程
  • 结转和结算
  • 小规模纳税人开的专票对方可以抵扣吗
  • 管理费用如何核算
  • 资产负债表的作用体现在哪些方面
  • 物流辅助服务属于
  • 大中小企业划分标准2022最新
  • 应收利息和利息收入的差额
  • 什么是资产减值转回
  • 原始凭证怎么粘
  • sqlserver自动生成id
  • linux /bin/false
  • windows2008 iis7如何取消目录执行权限的详细图文介绍
  • winxp共享文件
  • win8磁盘分区合并
  • win10关闭defender方法
  • window mobile系统
  • Win7安装VPN软件后无法上网是什么原因如何解决
  • 如何修改windows密码策略
  • 详细分析我国针对疫情的国防动员举措
  • js用变量值做参数
  • Android 水平居中
  • 如何理解vue
  • python编写步骤
  • jquery event
  • 12366纳税服务热线存在的问题
  • 广东电子税务局报税操作流程视频
  • 怎样在电子税务局申报社保
  • 机关工勤人员2022工资套改表
  • 农民专业合作社章程完整版
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设