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

  • Edge浏览器闪退解决办法(Edge浏览器闪退)

    Edge浏览器闪退解决办法(Edge浏览器闪退)

  • 怎么看屏幕是不是oled(怎么看屏幕是不是4k)

    怎么看屏幕是不是oled(怎么看屏幕是不是4k)

  • 苹果x多久充满才算正常(苹果x多久充满电正常)

    苹果x多久充满才算正常(苹果x多久充满电正常)

  • 紫盘能不能当电脑硬盘(紫盘适不适合家用)

    紫盘能不能当电脑硬盘(紫盘适不适合家用)

  • 华为P20电池鼓包原因(华为p20电池鼓包处理办法)

    华为P20电池鼓包原因(华为p20电池鼓包处理办法)

  • 12306账号是什么意思(12306账号是什么组成)

    12306账号是什么意思(12306账号是什么组成)

  • 苹果6相机自拍出来是反方向怎么调(苹果6相机自拍出来是反的)

    苹果6相机自拍出来是反方向怎么调(苹果6相机自拍出来是反的)

  • 微信屏幕怎么变成黑色了(微信屏幕怎么变小了)

    微信屏幕怎么变成黑色了(微信屏幕怎么变小了)

  • 光信号不亮不能上网(光信号不亮能正常上网)

    光信号不亮不能上网(光信号不亮能正常上网)

  • 华为mate30出厂有贴膜吗(华为mate30出厂有指纹解锁吗)

    华为mate30出厂有贴膜吗(华为mate30出厂有指纹解锁吗)

  • 苹果拉黑电话对方提示什么(苹果拉黑电话对方打电话能收到提示吗)

    苹果拉黑电话对方提示什么(苹果拉黑电话对方打电话能收到提示吗)

  • qq空间怎么解除自己可见(qq空间怎么解除封闭)

    qq空间怎么解除自己可见(qq空间怎么解除封闭)

  • iphonex多长机身(iphonex机身有多长)

    iphonex多长机身(iphonex机身有多长)

  • vue怎么把照片时间拉长(vue怎么照片设置)

    vue怎么把照片时间拉长(vue怎么照片设置)

  • 怎么解绑腾讯视频绑手机号(怎么解绑腾讯视频手机号)

    怎么解绑腾讯视频绑手机号(怎么解绑腾讯视频手机号)

  • vivox27录屏怎么没有声音(vivox27录屏怎么把声音录进去)

    vivox27录屏怎么没有声音(vivox27录屏怎么把声音录进去)

  • 成都地铁如何用支付宝二维码乘车(成都地铁如何用手机扫码过闸)

    成都地铁如何用支付宝二维码乘车(成都地铁如何用手机扫码过闸)

  • 淘宝直播浮现权开通条件(淘宝直播浮现权怎么样才能获得)

    淘宝直播浮现权开通条件(淘宝直播浮现权怎么样才能获得)

  • 快手作品删了能恢复吗(快手作品删了能恢复吗视频)

    快手作品删了能恢复吗(快手作品删了能恢复吗视频)

  • 苹果id创建不了怎么办(苹果id创建不了游戏账号是什么问题)

    苹果id创建不了怎么办(苹果id创建不了游戏账号是什么问题)

  • 快手怎么隐藏发布时间(快手怎么隐藏发布的作品)

    快手怎么隐藏发布时间(快手怎么隐藏发布的作品)

  • x21分辨率在哪里调(x21i分辨率)

    x21分辨率在哪里调(x21i分辨率)

  • wps怎么做ppt详细步骤(wps怎么做ppt详细步骤手机版)

    wps怎么做ppt详细步骤(wps怎么做ppt详细步骤手机版)

  • 三星s9呼吸灯怎么设置(三星s9+呼吸灯)

    三星s9呼吸灯怎么设置(三星s9+呼吸灯)

  • 苹果mac电脑17种常见的问题以及解决方法(mac系列电脑)

    苹果mac电脑17种常见的问题以及解决方法(mac系列电脑)

  • win11粘滞键怎么取消? windows11打开关闭粘滞键的技巧(win11粘滞键怎么关闭 重启后又有)

    win11粘滞键怎么取消? windows11打开关闭粘滞键的技巧(win11粘滞键怎么关闭 重启后又有)

  • python怎么设置字体颜色(python怎么设置字符串宽度)

    python怎么设置字体颜色(python怎么设置字符串宽度)

  • 个税申诉已受理怎么撤销
  • 银行开户手续费怎么开发票
  • 收到工程服务费会计分录
  • 合并扣税项是什么科目
  • 进销存明细账怎么填写
  • 停用的厂房折旧吗
  • 土地使用权分割转让依据
  • 无形资产 减值
  • 长期股权投资稀释
  • 缴纳公积金工资基数
  • 个体广告用去税务报账吗?
  • 工会经费按上年工资总额还是本年
  • 发票一定要房东开的才能报销吗?
  • 人工费收税吗
  • 天然气的销售需要什么资质
  • 发票联给错怎么办?
  • 教育咨询发票怎么开具
  • 发票连号不许报销吗
  • 限制性股票股利会计处理
  • 安全生产费用包含哪些
  • 设计部工资计入哪个科目
  • 个人私家车买卖平台
  • 小规模付增值税怎么做账
  • 个人独资企业免费刻章吗
  • 企业废业怎样做会计分录
  • 软件存在的意义
  • ecshop有哪些bug
  • 电脑输入法无法输入中文怎么办
  • 所得税和所得税税率
  • 请问怎么清除
  • 即征即退进项税额分摊方法
  • electron-vue官网
  • php定义一个二维数组
  • opencv焊点缺陷检测
  • 2022年windows11windows10最强VMware Workstation 16 Pro for Windows虚拟机软件最新授权版16.2.3-19376536版本
  • 股权转让 减资
  • 计提工会经费怎么做账务处理
  • 会计人员报销差旅费应该给谁审核呢
  • 集团公司如何收管理费
  • 哪些人不要申报个税
  • 善意取得增值税专用发票
  • 长期股权投资核算的权益法包括哪些内容
  • python怎么运行程序
  • c语言f lf
  • 普通动产和特殊动产登记的区别
  • 股东之间股权转让流程
  • 金税四期能监控到公户吗
  • 机械租赁的主要工作内容
  • 运输中合理损耗计入什么科目
  • 纳税人将购买的货物分配给股东,因该货物购买时已缴纳
  • 车辆处置缴纳增值税税率
  • 转出未交增值税会计账务处理
  • 贴现法付息实际利率
  • 内部债权债务的抵消分录
  • 报关单金额大于出口发票金额
  • 印花税算错了地方怎么办
  • 相关损坏维修成本是什么
  • 未分配利润高怎么解释
  • 成本会计核算方法论文怎么写
  • 产成品核算的内容
  • xp系统不能搜索
  • fedora31安装教程
  • windowsserver2008r2密码重置
  • VMware虚拟机中安装MATE桌面环境
  • ias.exe是什么程序
  • win7系统桌面图标变大了怎样恢复
  • scrtkfg.exe - scrtkfg是什么进程 有什么用
  • win10内置杀毒
  • 你可能不知道的中融新大
  • perl 批量注释
  • unity获取mesh网格数据
  • 安卓影音播放软件
  • Node.js中的construct
  • java script教程
  • jq动态设置css
  • python结合了什么的高级语言
  • 税务局电话客服人工服务
  • 怎么代理保险业务
  • 买房契税发票图片别人看到了有危险吗
  • 绍兴柯桥有哪些村
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设