位置: IT常识 - 正文

【已解决】探究CUDA out of memory背后原因,如何释放GPU显存?(想要探究的问题)

编辑:rootadmin
原力计划【已解决】探究CUDA out of memory背后原因,如何释放GPU显存? 目录1 问题背景2 问题探索2.1 CUDA固有显存2.2 显存激活与失活2.3 释放GPU显存3 问题总结4 告别Bug1 问题背景

推荐整理分享【已解决】探究CUDA out of memory背后原因,如何释放GPU显存?(想要探究的问题),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:想要探究的问题,写出你探究的结果,写出你探究的结果,探究结果怎么答,探究一下,写出你探究的结果,探究并解决问题的方法翻译,探究并解决问题的方法翻译,内容如对您有帮助,希望把文章链接给更多的朋友!

研究过深度学习的同学,一定对类似下面这个CUDA显存溢出错误不陌生

RuntimeError: CUDA out of memory. Tried to allocate 916.00 MiB (GPU 0; 6.00 GiB total capacity; 4.47 GiB already allocated; 186.44 MiB free; 4.47 GiB reserved in total by PyTorch)

本文探究CUDA的内存管理机制,并总结该问题的解决办法

2 问题探索2.1 CUDA固有显存

在实验开始前,先清空环境,终端输入nvidia-smi

接下来向GPU存入一个小的张量

import torchdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')torch.randn((2, 3), device=device)

占用显存情况如下,共计448M

而当我们增大张量的尺寸,例如

torch.randn((200, 300, 200, 20), device=device)

此时GPU占用也随之上升,共计1362M

这表明:GPU显存占用率和存入的数据尺寸成正相关,越大的数据占用显存越多,这其实是废话,但是把这句话反过来:越小的数据占用显存越小吗?做个实验

torch.randn((1, 1), device=device)

仍然占用448M

事实上,这是因为CUDA运行时,其固件会占用一定的显存,在本机软硬件环境下是448M,不同的CUDA版本或显卡型号固件显存不同。换言之,只要使用了GPU,就至少会占xxx M的显存,且这部分显存无法被释放。

2.2 显存激活与失活

给出以下代码,请问哪一个会报错?

代码Ax1 = torch.randn((200, 300, 200, 20), device=device)x2 = torch.randn((200, 300, 200, 20), device=device)x3 = torch.randn((200, 300, 200, 20), device=device)x4 = torch.randn((200, 300, 200, 20), device=device)x5 = torch.randn((200, 300, 200, 20), device=device)x6 = torch.randn((200, 300, 200, 20), device=device)代码Bx = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)

答案可以猜到,代码A报错了,这与CUDA显存的激活机制有关。可以把CUDA当前的数据空间看成一个队列,队列中有两种内存——激活内存(Activate Memory)和失活内存(Unactivate Memory)。当一块内存不再被变量所引用时,这块内存就由激活内存转为失活内存,但它仍然存在于这个数据队列中。

接下来,一块新的数据被添加进来,CUDA就会释放掉一部分失活内存,用于存放新的数据。如果新的数据占用空间大于队列中的所有失活内存,就会从显存再申请一部分空间添加到队列,相当于队列的容量被扩充了;如果新的数据占用空间约等于队列中的失活内存,那么CUDA显存的占用率就几乎不变

可以实验验证,运行

x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300), device=device)【已解决】探究CUDA out of memory背后原因,如何释放GPU显存?(想要探究的问题)

的显存占用为1364M,与单独运行

x = torch.randn((200, 300, 200, 20), device=device)

的1362M相比差不多,但是新的数据占用空间大于队列中的所有失活内存时

x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((300, 300, 300, 20), device=device)

显存占用就飙升到3422M。当数据队列达到某个阈值时,CUDA会触发垃圾回收机制,清理失活内存。

上述实验解释了深度学习中非常常见的代码

for images, labels in train_bar:images, labels = images.to(config.device), labels.to(config.device)# 梯度清零opt.zero_grad()# 正向传播outputs = model(images)# 计算损失loss = F.cross_entropy(outputs, labels)# 反向传播loss.backward()# 模型更新opt.step()

为什么能维持GPU显存不变。本质上,这就是上面代码B的执行过程。

2.3 释放GPU显存

运行下面的命令可以手动清理GPU数据队列中的失活内存

torch.cuda.empty_cache()

需要注意的是,上述命令可能要运行多次才会释放空间,比如

x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = torch.randn((200, 300, 200, 20), device=device)x = 1

此时x指向了int型,所以GPU数据队列中的空间均未被变量引用,说明队列中全部都是失活内存,但此时运行nvidia-smi仍有2278M的占用,进一步运行torch.cuda.empty_cache()后即可恢复到448M的基础占用——虽然现在没有数据在GPU上,但固件已经开始运行,因此占用无法被释放。

3 问题总结

关于CUDA GPU显存管理的总结:

GPU显存占用率和存入的数据尺寸成正相关,越大的数据占用显存越多只要使用了GPU,就至少会占xxx M的显存,且这部分显存无法被释放当一块内存不再被变量所引用时,这块内存就由激活内存转为失活内存,但它仍然存在于这个数据队列中当数据队列达到某个阈值时,CUDA会触发垃圾回收机制,清理失活内存运行torch.cuda.empty_cache()可以手动清理失活内存

那么根据上述理论,就可以得到对应的问题解决方案

调小batch_size

本质上是防止GPU数据队列向显存申请的空间大于显存本身

检查是否有数据持续存入GPU而未释放

举个例子:

app = []for _ in range(1000):app.append(torch.randn((200, 300, 200, 20), device=device))

这里append函数相当于获得张量torch.randn((200, 300, 200, 20), device=device)的拷贝存入列表,因此每次存入的张量都会被隐式地引用,GPU持续地增加激活内存而不被释放,导致崩溃。

训练过程中的测试阶段和验证阶段前插入代码with torch.no_grad()

原理是不计算梯度,从而不用GPU加速运算,不会把数据再加到数据队列中

4 告别Bug

本文收录于《告别Bug》专栏,该专栏记录人工智能领域中各类Bug以备复查,文章形式为:问题背景 + 问题探索 + 问题解决,订阅专栏+关注博主后可通过下方名片联系我进入AI技术交流群帮忙解决问题


🔥 更多精彩专栏:

《ROS从入门到精通》《Pytorch深度学习实战》《机器学习强基计划》《运动规划实战精讲》…

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文链接地址:https://www.jiuchutong.com/zhishi/278092.html 转载请保留说明!

上一篇:Mac电脑登录支付宝无法输入密码的解决方法(苹果电脑付款方式设置)

下一篇:总结Linux中用于文本处理的awk、sed、grep命令用法(linux使用范围)

  • 微信团队提醒违规了怎么办(微信团队提醒违规色情)

    微信团队提醒违规了怎么办(微信团队提醒违规色情)

  • 苹果6plus夜间模式怎么设置(苹果6splus夜间模式)

    苹果6plus夜间模式怎么设置(苹果6splus夜间模式)

  • hwouc是什么文件夹(.h是什么文件)

    hwouc是什么文件夹(.h是什么文件)

  • 华为手机怎么设置信息不显示(华为手机怎么设置指纹解锁)

    华为手机怎么设置信息不显示(华为手机怎么设置指纹解锁)

  • 微信删好友对方会有提示吗(微信删好友对方还有我吗)

    微信删好友对方会有提示吗(微信删好友对方还有我吗)

  • 路由器上的wps按钮在哪里(路由器上的wps按了会怎么样)

    路由器上的wps按钮在哪里(路由器上的wps按了会怎么样)

  • 华为手机微信视频无法全屏(华为手机微信视频没有声音如何恢复正常)

    华为手机微信视频无法全屏(华为手机微信视频没有声音如何恢复正常)

  • 手机电池是什么电池(苹果手机电池是什么)

    手机电池是什么电池(苹果手机电池是什么)

  • 抖音能看到好友给别人的赞吗(抖音能看到好友的浏览记录吗)

    抖音能看到好友给别人的赞吗(抖音能看到好友的浏览记录吗)

  • 苹果手机为什么只能充电80(苹果手机为什么wifi打不开)

    苹果手机为什么只能充电80(苹果手机为什么wifi打不开)

  • 手机上dlna是什么意思(手机里dlna是什么意思)

    手机上dlna是什么意思(手机里dlna是什么意思)

  • 手机上有激光笔功能吗(手机上有激光笔怎么用)

    手机上有激光笔功能吗(手机上有激光笔怎么用)

  • 苹果xsmax充满电还显示充电(苹果xsmax充满电要多久时间)

    苹果xsmax充满电还显示充电(苹果xsmax充满电要多久时间)

  • webmomo什么意思(movw什么意思)

    webmomo什么意思(movw什么意思)

  • 页脚和页码有什么区别(页脚和页码怎么共存)

    页脚和页码有什么区别(页脚和页码怎么共存)

  • 笔记本电脑录音声音很小怎么办(笔记本电脑录音转文字软件)

    笔记本电脑录音声音很小怎么办(笔记本电脑录音转文字软件)

  • ps画圆快捷键(ps如何快速画圆)

    ps画圆快捷键(ps如何快速画圆)

  • hd有什么用(联通卡hd有什么用)

    hd有什么用(联通卡hd有什么用)

  • 手机自动拦截电话怎么取消(手机自动拦截电话在哪里找)

    手机自动拦截电话怎么取消(手机自动拦截电话在哪里找)

  • 华为p20红外线遥控器功能在哪里(华为p20pro红外线遥控)

    华为p20红外线遥控器功能在哪里(华为p20pro红外线遥控)

  • ppor17恢复出厂设置在哪里(ppbox1s恢复出厂设置)

    ppor17恢复出厂设置在哪里(ppbox1s恢复出厂设置)

  • pos机连不上网络怎么办(pos机连接不上网)

    pos机连不上网络怎么办(pos机连接不上网)

  • 202101最新win10教育版/专业版激活秘钥分享 附激活工具(windows10.0)

    202101最新win10教育版/专业版激活秘钥分享 附激活工具(windows10.0)

  • JS逆向 webpack解密(auto.js 逆向)

    JS逆向 webpack解密(auto.js 逆向)

  • 出口退税便捷退税操作流程
  • 纳税人未缴少缴税款
  • 发票丢失的税务处罚
  • 如何做好存货管理,从哪方面去做
  • 法人买社保不领钱可以吗
  • 增值税普通发票几个点
  • 购车税叫什么
  • 开发产品计入什么科目
  • 固定资产大修理支出标准
  • 未开票收入改为开票收入做账
  • 营改增的会计处理及其对财务的影响
  • 库存材料盘亏会计分录
  • 离职补偿金公司不付怎么办
  • 物业收租金必须要发票吗
  • 工程竣工结算审查期限
  • 0x8000005解决方案
  • 关闭guest账户
  • 空调应该计入什么科目
  • ghost后分区没有了
  • 股权处置的形式
  • php options
  • 房产增值税计算公式2022最新
  • mac osx10.11
  • laravel引入css
  • 库存现金月末怎么结转
  • uniapp前端面试题
  • 下列项目的进项税额可从销项税
  • 速动资产是指
  • 银行代发工资当天改工资卡来得及吗
  • 交通运输发票票样
  • 民办非企业性质还是商业性质吗
  • 增值税增量留抵退税政策2019
  • 商业汇票的行为有哪些
  • phpsystem函数
  • css入门经典
  • 项目支出可以列支差旅费吗
  • 企业会计准则无形资产土地摊销
  • 在发票上盖了公章有用吗
  • 税务查账后如何结转
  • 小微企业如何升级一般纳税人
  • 业务活动成本和管理费用能不能写在一起
  • 企业出售房屋
  • 以摊余成本计量的债权投资与以公允价值计量且其变动
  • 土地使用权被政府收回没有注销怎么样缴土地使用税
  • 公司帮员工买的意外险钱是打到公司还是员工账号
  • 企业消费税应计入资产成本的有哪些
  • 不满足收入确认条件的会计分录
  • 贷款减值准备是什么意思
  • 进项税额增值税专用发票
  • 工程款项目的发包人是谁
  • 财务费用利息收入怎么记账
  • 网吧是个人独资企业还是个体工商户
  • 计提利息为什么贷方是应付利息
  • 库存商品可以用多栏式吗
  • 无形资产减值准备是什么科目
  • 会计软件什么范围分为单用户和多用户呢
  • 销售怎么写啊
  • java连接sqlserver数据库对象名无效
  • SQL 导入导出Excel数据的语句
  • 如何系统还原xp
  • linux ln命令 -s
  • Linux JDK,TOMCAT安装及环境设置
  • windows8音频服务尚未启用 怎么解决
  • 苹果电脑安装虚拟机会有什么影响
  • WARNING: /tmp: File system full, swap space limit exceeded的解决办法
  • 手把手教您安装软件
  • window10突然激活失效
  • win7自带软件在哪里
  • angular创建service
  • python迭代算法举例
  • js相等和全等
  • python文件与目录操作
  • python方法有哪些
  • [置顶]马粥街残酷史
  • 税务举报可以撤销么?
  • 已代扣代缴个人所得税,他人还需要缴纳个人所得税吗?
  • 注销税务说明
  • 企业所得税率2023年
  • 企业卖旧房如何计算缴纳土地增值税
  • 地税局申报个人所得税
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设