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

  • 微博营销技巧之:三招提升微博话题的关注度(微博营销有哪些技巧)

    微博营销技巧之:三招提升微博话题的关注度(微博营销有哪些技巧)

  • cad剖面线怎么填充(cad剖面线填充完只有一条线)

    cad剖面线怎么填充(cad剖面线填充完只有一条线)

  • 华为v30有红外线功能吗(华为v30红外线如何用)

    华为v30有红外线功能吗(华为v30红外线如何用)

  • 华为如何扫描图片转化为文字(华为如何扫描图片为pdf)

    华为如何扫描图片转化为文字(华为如何扫描图片为pdf)

  • 微信积分有什么用呢(微信积分有什么用在哪看)

    微信积分有什么用呢(微信积分有什么用在哪看)

  • my games是什么文件夹(games是什么意思 翻译)

    my games是什么文件夹(games是什么意思 翻译)

  • 索尼9500g和9000h的差距(索尼9500g和9000f哪个好)

    索尼9500g和9000h的差距(索尼9500g和9000f哪个好)

  • ipv4地址中a类b类c类地址分别是如何定义的(ipv4地址中a类b类c类的网络号是)

    ipv4地址中a类b类c类地址分别是如何定义的(ipv4地址中a类b类c类的网络号是)

  • Excel怎么把纯数字改成日期(excel表格怎么提取纯数字)

    Excel怎么把纯数字改成日期(excel表格怎么提取纯数字)

  • 红米k20pro尊享版闪存规格(红米k20pro尊享版配置参数)

    红米k20pro尊享版闪存规格(红米k20pro尊享版配置参数)

  • 苹果商店怎么设置下载不需要密码(苹果商店怎么设置刷脸下载)

    苹果商店怎么设置下载不需要密码(苹果商店怎么设置刷脸下载)

  • 华为gt手表可以关闭蓝牙吗(华为gt手表可以安装应用吗)

    华为gt手表可以关闭蓝牙吗(华为gt手表可以安装应用吗)

  • 爱奇艺怎么设置儿童模式(爱奇艺怎么设置几个人用)

    爱奇艺怎么设置儿童模式(爱奇艺怎么设置几个人用)

  • 华为mate20pro拍照能放大多少倍(华为mate20pro拍照技巧攻略)

    华为mate20pro拍照能放大多少倍(华为mate20pro拍照技巧攻略)

  • word怎么计算平均值(word怎么计算平均得分)

    word怎么计算平均值(word怎么计算平均得分)

  • 加密文件怎么解密(加密文件怎么解密如何解除)

    加密文件怎么解密(加密文件怎么解密如何解除)

  • 皮皮虾能加通讯录好友吗(皮皮虾怎么添加通讯录好友)

    皮皮虾能加通讯录好友吗(皮皮虾怎么添加通讯录好友)

  • pcat10是什么型号的手机(pcat10和pcam10有什么不一样吗)

    pcat10是什么型号的手机(pcat10和pcam10有什么不一样吗)

  • iphone8频繁自动关机(iphone8频繁自动重启怎么解决)

    iphone8频繁自动关机(iphone8频繁自动重启怎么解决)

  • 为什么airpods连不上(为什么airpods连上没有声音)

    为什么airpods连不上(为什么airpods连上没有声音)

  • 抖音里的时光倒流在哪个功能里面(抖音里的时光倒流怎么拍的)

    抖音里的时光倒流在哪个功能里面(抖音里的时光倒流怎么拍的)

  • Windows 10如何清除系统使用记录(windows10如何清理c盘垃圾)

    Windows 10如何清除系统使用记录(windows10如何清理c盘垃圾)

  • 拼多多改地址怎么改(拼多多改地址怎么改视频)

    拼多多改地址怎么改(拼多多改地址怎么改视频)

  • CSS实现文字垂直居中(css中文字垂直排列)

    CSS实现文字垂直居中(css中文字垂直排列)

  • 百望税控软件下载
  • 税务检查的定义
  • 工程款给付协议
  • 对公账户取现金怎么取
  • 小规模纳税人减征额怎么计算
  • 金税四期监控个人在银行的存款吗
  • 预计负债的三个基本要素
  • 用票据付款怎么做账
  • 会计科目已受控于应收应付系统
  • 进项税额销项税额月末需要结转吗
  • 有哪些扣除项目可以抵扣
  • 产成品返工如何处理
  • 附加税减免税会计处理怎么做?
  • 房地产开发企业销售自行开发的房地产项目
  • 造价服务费收费标准计算器
  • 按计划成本发出原材料怎么算
  • 一般纳税人的账户是基本账户吗
  • 承租人转租需要交税吗
  • 失去胜诉权但又有起诉权是什么意思
  • 承兑汇票属于现金支付吗
  • 专票入库单金额怎么算
  • win10怎么打开任务管理器
  • 不动产抵押合同管辖法院
  • 生产车间发生的间接费用会计科目
  • php实现分页功能的方法
  • 分摊本月领用材料的成本差异
  • php面包屑导航
  • 关于工程材料的图书有哪些
  • html前端技术
  • Win10 Build21376内测版发布 重新设计默认用户界面字体
  • 存货盘盈怎么做账
  • 土增税清算扣除项目分摊公式
  • win11怎么桌面快捷方式
  • 技术转市场到底是不是个正确的选择
  • 车辆赔偿款收条怎么写
  • thinkphp5.1完全开发手册
  • 应收票据终止确认的情形
  • 应付职工薪酬是负数是什么意思
  • 计提坏账的比例是多少
  • css添加边框阴影 立体效果
  • 缴纳残保金会计分录最新
  • 存货的会计核算及业务处理
  • 企业送的购物卡怎么退回去
  • mysql 内连接查询
  • js中定义变量关键词是
  • 没有数字的公章有效吗
  • 摄影的服务注册是什么
  • 办理对公账户时间
  • 应收票据和其他应收款的区别
  • 存货按照计划成本法核算内容
  • Windows7下Microsoft SQL Server 2008安装图解和注意事项
  • 用mysql的小技巧
  • 劳务分包预缴税款计算公式
  • 调整以前月份的管理费用怎么做
  • 增值税免征印花税怎么算
  • 契税的计税金额是什么
  • 包工包料工程如何报价合理
  • 信息服务的最终目的是什么
  • 出售房产收入属于转让财产收入吗
  • 留抵的进项税可以用多少年
  • 修改mysql用户权限
  • 怎么用U盘装系统
  • qttask.exe是什么进程?qttask.exe是不是病毒?
  • w10隐藏功能
  • ubuntu 18.04 16.04
  • win7电脑开机自启动管理在哪里
  • cmd是什么意思 视频
  • mac菜单栏不见了
  • js匿名函数怎么调用
  • Extjs Label的 fieldLabel和html属性值对齐的方法
  • Lesson02_04 表单标签(2)
  • apktool修改包名
  • cd弹出错误怎么回事
  • sdk有问题
  • bud3d跑酷
  • jquery获取浏览器宽度
  • Python的for和in
  • springmvc返回json格式的注解
  • 江苏电子税务局网站官网
  • 广州市天河税务局电话号码
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设