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

  • 淘宝保证金代扣能关闭吗(淘宝保证金代扣是什么意思)

    淘宝保证金代扣能关闭吗(淘宝保证金代扣是什么意思)

  • 淘宝零钱怎么提现(淘宝零钱怎么提到微信)

    淘宝零钱怎么提现(淘宝零钱怎么提到微信)

  • 苹果11pro多少内存(苹果11 pro都有多大内存的)

    苹果11pro多少内存(苹果11 pro都有多大内存的)

  • 滴滴模式怎么接单最快(滴滴接人怎么弄)

    滴滴模式怎么接单最快(滴滴接人怎么弄)

  • 苹果11可以无线充电吗(苹果11可以无线连接carplay吗)

    苹果11可以无线充电吗(苹果11可以无线连接carplay吗)

  • 华为手机半夜自动重启是什么原因(华为手机半夜自动放音乐)

    华为手机半夜自动重启是什么原因(华为手机半夜自动放音乐)

  • 手机来电防骚扰如何设置在哪(手机来电防骚扰软件下载)

    手机来电防骚扰如何设置在哪(手机来电防骚扰软件下载)

  • nova7怎么插耳机(华为nova7手机怎么插耳机)

    nova7怎么插耳机(华为nova7手机怎么插耳机)

  • 进入后台运行是什么

    进入后台运行是什么

  • 闪照截图对方会知道吗(闪照截图对方会知道吗 qq)

    闪照截图对方会知道吗(闪照截图对方会知道吗 qq)

  • 5sa1533是什么版本(iphone5sa1530是什么版本)

    5sa1533是什么版本(iphone5sa1530是什么版本)

  • 抖音评论图片怎么保存(抖音评论图片怎么保存到手机)

    抖音评论图片怎么保存(抖音评论图片怎么保存到手机)

  • 手机卡跨省可以注销吗(手机卡跨省可以过户吗)

    手机卡跨省可以注销吗(手机卡跨省可以过户吗)

  • 手机银行预留信息是什么(手机银行预留信息不完整怎么处理呢)

    手机银行预留信息是什么(手机银行预留信息不完整怎么处理呢)

  • 预售不可以加购物车吗(预售可以下单吗)

    预售不可以加购物车吗(预售可以下单吗)

  • uc怎么用(uc怎么用迅雷下载)

    uc怎么用(uc怎么用迅雷下载)

  • 电脑xp系统怎么升级(新电脑怎么安装系统)

    电脑xp系统怎么升级(新电脑怎么安装系统)

  • 一加7pro5g版上市时间(一加7pro有5g版吗)

    一加7pro5g版上市时间(一加7pro有5g版吗)

  • 为什么刷宝不可以提现(刷宝为什么不能签到了)

    为什么刷宝不可以提现(刷宝为什么不能签到了)

  • qq大会员包括什么

    qq大会员包括什么

  • 苹果8怎么清理系统内存(苹果8怎么清理运行中的软件)

    苹果8怎么清理系统内存(苹果8怎么清理运行中的软件)

  • 小米笔记本黑屏无反应(小米笔记本黑屏但是还运作,电源键亮着)

    小米笔记本黑屏无反应(小米笔记本黑屏但是还运作,电源键亮着)

  • 我用尽了洪荒之力,解开了ChatGPT 写前端代码的封印,结果...(我已经用尽了洪荒之力漫画表情)

    我用尽了洪荒之力,解开了ChatGPT 写前端代码的封印,结果...(我已经用尽了洪荒之力漫画表情)

  • Redux的基本使用过程详解(redux入门教程)

    Redux的基本使用过程详解(redux入门教程)

  • phpcms首页模板是哪个文件(phpcms 用的是什么模板引擎)

    phpcms首页模板是哪个文件(phpcms 用的是什么模板引擎)

  • 个人开发选项
  • 合并报表会计未分配利润怎么填写?
  • 特许权使用费收入
  • 上月社保未扣款怎么回事
  • 会计信息采集每年都要采集吗
  • 公司股权关系怎么填写
  • 企业所得税申报表A类
  • 结转周转材料成本分录
  • 会计核算形式的主要区别
  • 行政事业单位核算短期投资时有关预算会计核算正确的是
  • 投资公司的投资人叫什么
  • 公司注销实收资本怎么处理
  • 免税收入的三个条件
  • 公司买卖股票如何账务处理
  • 营改增文件2019
  • 免税投资背后的风险,你都清楚吗?
  • 营改增后小规模纳税人如何报税
  • 网络科技定额发票怎么做分录?
  • 小微企业增值税减免政策
  • 其他权益性无形资产的进项税额抵扣
  • 税种登记要带什么资料?
  • 事业单位打印费计入什么科目
  • 包装物租金怎么算
  • win11 应用商店
  • 文件过滤什么意思
  • 怎么给员工购买保险
  • 车辆购置税会计账务处理
  • 充值会员卡销售话语
  • 错账的种类
  • vue解决数据量过大的问题
  • 中小企业发展专项资金
  • gridview用法
  • pytorch_lightning.utilities.exceptions.MisconfigurationException: You requested GPUs: [1] But...
  • 设备销售合作协议书范本
  • 轻资产并购
  • 朝夕教育怎么样
  • 浅谈当下火热的行业
  • vue中的$el
  • python搭建项目结构
  • yum命令安装软件
  • 浅析Laravel5中队列的配置及使用
  • 经营租赁出租方的会计处理
  • 高新技术企业福利费扣除比例
  • 员工办理健康证需要什么材料
  • 加工费能直接抵税吗
  • 嵌入式软件行业在加计扣除的时候可以看作是制造业吗
  • 现金流量表里包括应收票据吗
  • 农产品来源用途是什么
  • 公账取现用途写什么
  • 新会计准则应付账款
  • 增值税进项税额加计抵减会计处理
  • 软件企业研发费用
  • 工商年报纳税总额包括个人所得税吗
  • 给慈善机构捐款英语
  • 电子发票能否作废
  • 中小企业的资产负债率均值是多少
  • 变卖固定资产怎么交税
  • 会计行政法规包括哪些条例?具体说明?
  • mysql 修改密码后 unknown error 1820
  • 回顾30年的水文模型参数率定研究
  • 电脑开机一直显示xp
  • freebsd怎么样
  • 此windows副本不是正版黑屏
  • dns_config_service_win
  • ubuntu查看内存占用最多的进程ID
  • mac死机按什么都没用
  • Linux系统网络配置
  • windows7修改注册表
  • Win7旗舰版64位如何关闭电脑触摸屏功能的方法
  • nodejs实战
  • jquery插件库怎么导入
  • 深入理解android内核
  • 短信发送器
  • 正途科技有限公司
  • python语言中
  • javascript生成随机整数
  • 发票查验结果怎么保存
  • 每月个人所得税申报截止时间是几号
  • 换电员工作时间自由吗
  • 税控盘开票怎么赋码的教程
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设