位置: 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使用范围)

  • oppoa8屏幕多少英寸(oppoa8手机屏幕多大尺寸)

    oppoa8屏幕多少英寸(oppoa8手机屏幕多大尺寸)

  • 趣威点读笔怎么连接wifi(趣威点读笔怎么下载教材)

    趣威点读笔怎么连接wifi(趣威点读笔怎么下载教材)

  • 有的抖音不能保存本地(有的抖音不能保存本地怎么设置)

    有的抖音不能保存本地(有的抖音不能保存本地怎么设置)

  • vivox50有微云台吗(vivox50pro的微云台)

    vivox50有微云台吗(vivox50pro的微云台)

  • 美团怎么确认收货(美团怎么确认收单)

    美团怎么确认收货(美团怎么确认收单)

  • 三星s20+和华为p40pro对比(三星s20和华为p40选哪个)

    三星s20+和华为p40pro对比(三星s20和华为p40选哪个)

  • 计算机病毒最主要的特征是(电脑病毒之王)

    计算机病毒最主要的特征是(电脑病毒之王)

  • 复印店可以打印手机文件吗(复印店可以打印发票吗)

    复印店可以打印手机文件吗(复印店可以打印发票吗)

  • 移动电话卡可以异地补办吗(移动电话卡可以转归属地吗)

    移动电话卡可以异地补办吗(移动电话卡可以转归属地吗)

  • 微信支付时需要验证码怎么回事(微信支付时需要网络吗)

    微信支付时需要验证码怎么回事(微信支付时需要网络吗)

  • vivox21plus是什么处理器(vivox21plus参数配置)

    vivox21plus是什么处理器(vivox21plus参数配置)

  • pn结正偏是指(PN结正偏是指AN区电位高于P区BP区电位高于N区)

    pn结正偏是指(PN结正偏是指AN区电位高于P区BP区电位高于N区)

  • 微型计算机的主要用途(微型计算机的主板上没有集成键盘和鼠标的接口)

    微型计算机的主要用途(微型计算机的主板上没有集成键盘和鼠标的接口)

  • 计算机的三大应用领域是(计算机的三个应用领域)

    计算机的三大应用领域是(计算机的三个应用领域)

  • mt732ch a是什么版本(mt782za/a什么版本)

    mt732ch a是什么版本(mt782za/a什么版本)

  • ios13怎么移动app(苹果13怎么把软件放到桌面)

    ios13怎么移动app(苹果13怎么把软件放到桌面)

  • s6edge的电话转移怎么恢复(转移手机上的电话号码)

    s6edge的电话转移怎么恢复(转移手机上的电话号码)

  • 苹果桌面怎么删空白页(苹果桌面怎么删除图标)

    苹果桌面怎么删空白页(苹果桌面怎么删除图标)

  • 苹果回收站删了还能找回吗(苹果回收站删了还能找回照片吗)

    苹果回收站删了还能找回吗(苹果回收站删了还能找回照片吗)

  • iphone5怎么下载微信(iphone5怎么下载微信旧版)

    iphone5怎么下载微信(iphone5怎么下载微信旧版)

  • 微信定位怎么发给别人(微信定位怎么发给QQ好友)

    微信定位怎么发给别人(微信定位怎么发给QQ好友)

  • 抖音被取关了有通知吗(抖音被取关了我还能看到对方的动态吗)

    抖音被取关了有通知吗(抖音被取关了我还能看到对方的动态吗)

  • 小程序内存不足怎么办(抖音小程序内存不足)

    小程序内存不足怎么办(抖音小程序内存不足)

  • 华为p30怎么切换后台(华为p30怎么切换卡2上网)

    华为p30怎么切换后台(华为p30怎么切换卡2上网)

  • 承租方支付租房税费
  • 本期收入和本期减除费用
  • 符合简易征收的条件
  • 盈利能力也可以反映短期偿债能力
  • 公司现金支票取钱需要带什么资料
  • 水果销售公司简介
  • 出纳购买东西能报销吗
  • 企业的技术转让费
  • 股权变更印花税申报表怎么填写
  • 预付冲应付会计分录摘要
  • 购进货物进项不予抵扣
  • 商业企业月末结转成本
  • 长期股权投资属于金融资产吗
  • 买房报销
  • 税务管理相关知识
  • 应付账款扣款怎么做账
  • 增值税专用发票和普通发票的区别
  • 工业企业税负率一般控制在多少?
  • 财税2010121号文件有效吗
  • 二手房交易需要多长时间?
  • 影视制作公司是做什么的
  • 补贴属于什么手段
  • 营业用房标准
  • 个人劳务报酬所得税计算方法2020
  • 股利如何算
  • 如何在Windows 11上卸载更新
  • 建筑单位领用材料分录
  • el-cascader动态加载多级
  • window10最新20h2
  • tkinter美观界面
  • php的数组函数
  • 成本核算流程会议记录
  • mysql实现事务
  • 企业购入软件会计分录
  • 国家公园好玩吗
  • 蓝色龙舌兰花语
  • php面向对象优点,缺点
  • vue区别
  • css教程网站
  • mysql中regexp_substr函数的使用
  • phpcms开发手册
  • 应交税费-应交增值税
  • 销售服饰
  • 行政事业单位资产管理办法
  • mysql 子查询
  • mysql入门很简单
  • 企业停工期间发生的费用如何处理
  • 发票一式两联
  • 电子缴款凭证在哪里找
  • 汇算清缴时发现收入少了
  • 保证金159001收益如何计算
  • 公司租赁个人车辆租金多少合适
  • 酒店的布草怎么铺
  • 应收账款增值税专用发票
  • 现金余额出现负数的原因
  • 纸质银行承兑到期怎么办
  • 结转销售成本的分录
  • 购房发票丢了怎么收房
  • 预收账款的会计编码
  • 业务收入和营业收入关系
  • 旅行社开的机票款可以抵扣吗
  • 残保金零申报必须大于0
  • 小规模印花税怎么报
  • Windows下MySQL 5.7无法启动的解决方法
  • win10添加闹钟
  • dns server配置
  • win7菜单栏是什么
  • opengl画点
  • Node.js中的construct构造函数
  • androidstudiosdk
  • 超级链接是什么意思
  • node发送短信
  • unity 位图字体
  • jquery(document).ready
  • jquery遍历表单元素
  • python中对象的概念
  • JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
  • ca证书网上申请
  • 货物劳务税包括哪些税
  • 西安医疗保险官网
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设