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

  • html网页设计源代码结合企业网站建设的设计方案和功能需求

    html网页设计源代码结合企业网站建设的设计方案和功能需求

  • 淘特怎么用微信零钱直接付款(淘特怎么用微信支付)

    淘特怎么用微信零钱直接付款(淘特怎么用微信支付)

  • 荣耀x10有多少倍的变焦呢(荣耀x10有多大)

    荣耀x10有多少倍的变焦呢(荣耀x10有多大)

  • 闲鱼上买的东西出现问题怎么办(闲鱼买的东西一直不发货怎么办)

    闲鱼上买的东西出现问题怎么办(闲鱼买的东西一直不发货怎么办)

  • 借的充电宝不还会怎样(借的充电宝不还钱会怎么样)

    借的充电宝不还会怎样(借的充电宝不还钱会怎么样)

  • 相册加密在哪里设置(相册加密在哪里解除)

    相册加密在哪里设置(相册加密在哪里解除)

  • 苹果信号满格打不出去(苹果信号满格打不出去电话)

    苹果信号满格打不出去(苹果信号满格打不出去电话)

  • 苹果官换机是翻新机吗(苹果官换机官翻机与新机有什么区别)

    苹果官换机是翻新机吗(苹果官换机官翻机与新机有什么区别)

  • 注销的微博还能恢复吗(注销的微博还能搜到吗)

    注销的微博还能恢复吗(注销的微博还能搜到吗)

  • 允许修改系统设置是什么意思(允许修改系统设置有什么危害)

    允许修改系统设置是什么意思(允许修改系统设置有什么危害)

  • 拼多多无推广中单元怎么解决(拼多多无推广中单元)

    拼多多无推广中单元怎么解决(拼多多无推广中单元)

  • 抖音切换账号草稿箱会丢吗(抖音切换账号草稿箱不见了怎么恢复)

    抖音切换账号草稿箱会丢吗(抖音切换账号草稿箱不见了怎么恢复)

  • iphone11长焦镜头有什么用(苹果11长焦镜头是什么)

    iphone11长焦镜头有什么用(苹果11长焦镜头是什么)

  • 购买华为手机有耳机吗(购买华为手机有学生优惠吗)

    购买华为手机有耳机吗(购买华为手机有学生优惠吗)

  • 启动任务管理器的组合键是什么(启动任务管理器怎么打开)

    启动任务管理器的组合键是什么(启动任务管理器怎么打开)

  • 微博私信聊天记录找回(微博私信聊天记录恢复)

    微博私信聊天记录找回(微博私信聊天记录恢复)

  • 拼多多不确认收货商家能收到钱吗(拼多多不确认收货会不会扣费)

    拼多多不确认收货商家能收到钱吗(拼多多不确认收货会不会扣费)

  • 饿了么订单怎么要发票(饿了么订单怎么部分退款)

    饿了么订单怎么要发票(饿了么订单怎么部分退款)

  • r17有nfc功能如何开启(oppor17有nfc)

    r17有nfc功能如何开启(oppor17有nfc)

  • 64g苹果够用吗

    64g苹果够用吗

  • 苹果手机定位安卓手机怎么弄(苹果手机定位安全吗)

    苹果手机定位安卓手机怎么弄(苹果手机定位安全吗)

  • stata和spss的区别(spss与stata的区别)

    stata和spss的区别(spss与stata的区别)

  • 华为nove5支持5g吗(华为nove5支持nfc吗?)

    华为nove5支持5g吗(华为nove5支持nfc吗?)

  • 借助Process Explorer解决SYSTEM进程CPU占用率高问题(借助的近义词)

    借助Process Explorer解决SYSTEM进程CPU占用率高问题(借助的近义词)

  • 一点就分享系列(理解篇5)Meta 出品 Segment Anything 4月6号版核心极速解读——主打一个”Zero shot“是贡献和辅助,CV依然在!(一点分享案例)

    一点就分享系列(理解篇5)Meta 出品 Segment Anything 4月6号版核心极速解读——主打一个”Zero shot“是贡献和辅助,CV依然在!(一点分享案例)

  • 猿创征文 |【高级篇】Java 进阶之JVM实战(猿创部落科技有限公司)

    猿创征文 |【高级篇】Java 进阶之JVM实战(猿创部落科技有限公司)

  • 出口免税收入的计税依据
  • 预缴税款是什么科目
  • 采购单是原始凭证吗
  • 捐赠的费用放在什么科目
  • 收入与成本不配合
  • 通行费发票抵扣要勾选认证吗
  • 转回存货跌价准备对递延所得税资产的影响
  • 本期准予抵减税额怎么算
  • 增值税专用发票电子版
  • 合同签订之后国家降税怎么办?
  • 库存完工产品属于什么会计科目,什么类别
  • 商品流通企业应收账款很少的原因
  • 土地所有权可以出资吗
  • 对方公司开发票我方未付款如何做分录?
  • 增值税多缴税款退税政策
  • 哪些业务需要编写收款凭证
  • 公司支付宝付款
  • 新办企业需要做什么
  • 以前年度损益调整贷方余额表示什么
  • 预提差率费怎么记账
  • 年金是根据什么计算的
  • 银行透支算资产吗
  • 银行 委托收款
  • 仓库的账怎么做
  • macos 关闭屏幕
  • 律师费能计入办公费用吗
  • 如何查询苹果手机充电次数
  • bootice.exe
  • win10商店在哪打开
  • launcher.exe是什么,每次开机都是否需要进行更改
  • php
  • 土地增值税清算的条件
  • 股权和债权有无区别
  • 留抵增值税可以冲营业外支出吗
  • laccadive islands
  • php fileinfo
  • 城市赚钱项目
  • 公司偷税漏税有哪些表现形式
  • 怎么安装vue环境
  • php socket_create
  • 来料加工企业的划分标准
  • 出纳造工资表吗
  • 手机银行对公账户转账要手续费吗
  • 企业长期借款的渠道有哪些
  • 小企业销售商品时,确认收入的标志有
  • 应交税费为什么写在借方
  • 提高资产利用率的例子
  • 关联方交易的税收问题
  • 企业主营业务收入科目下的余额应转入的科目是
  • 筹建期有时间限制吗
  • 多计的人工成本怎么做账
  • 总资产利润率一般为多少
  • 高新企业研发费用会计分录
  • 印花税的计税依据及税率
  • 运输费计入什么科目里面
  • 学校收到学生的礼物
  • 收到工程款怎么入账
  • 金税盘技术维护费
  • 出口退税进项发票有什么要求
  • 企业应付账款的借方余额反映的是
  • 预付房租收到发票怎么写摘要
  • 公司卖土地怎么避税
  • 年底需要结转的会计科目
  • 库存商品账本填写样本
  • sql添加后返回主键
  • 怎么在bios里设置usb开关
  • xp系统新建用户后原来的用户没有了
  • win8怎么清空电脑只剩系统
  • linux录屏软件安装
  • linux怎样使用
  • node.js怎么搭建服务器
  • ghost此应用无法在你的电脑上运行
  • unity strangeioc
  • 为什么使用json传输数据
  • flexable.js
  • javascript定义数组的方法
  • 为什么python那么难
  • 社保每个月几号截止申报
  • 河南省国家税务总局网站
  • 生育保险证明去哪里办
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设