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

  • 青桔单车怎么扫码骑行(青桔单车怎么扫不到二维码)

    青桔单车怎么扫码骑行(青桔单车怎么扫不到二维码)

  • airpods pro怎么关闭信息朗读(airpods pro怎么关机)

    airpods pro怎么关闭信息朗读(airpods pro怎么关机)

  • win10桌面图标不见了怎么办(win10桌面图标不能随意拖拽)

    win10桌面图标不见了怎么办(win10桌面图标不能随意拖拽)

  • 爱奇艺vip可以同时几个人用呢(爱奇艺vip能共用吗)

    爱奇艺vip可以同时几个人用呢(爱奇艺vip能共用吗)

  • 抖音怎么不显示在线时间(抖音怎么不显示粉丝团)

    抖音怎么不显示在线时间(抖音怎么不显示粉丝团)

  • 华为手机锁屏图片怎么关闭(华为手机锁屏图片)

    华为手机锁屏图片怎么关闭(华为手机锁屏图片)

  • qq密保好友辅助需要好友密码(qq密保好友辅助让好友扫码是真的吗)

    qq密保好友辅助需要好友密码(qq密保好友辅助让好友扫码是真的吗)

  • 华为p40pro有多重(华为p40pro机身重量多少)

    华为p40pro有多重(华为p40pro机身重量多少)

  • 2w充电宝充满要多久(2w充电宝充满要多久5a)

    2w充电宝充满要多久(2w充电宝充满要多久5a)

  • 华为nova6双卡怎么装(华为nova6双卡怎么放)

    华为nova6双卡怎么装(华为nova6双卡怎么放)

  • 4g上网正常一拨电话就无服务(4g拨号上网)

    4g上网正常一拨电话就无服务(4g拨号上网)

  • intel至强e5相当于i几(至强e5性能排行)

    intel至强e5相当于i几(至强e5性能排行)

  • 快手直播火苗没了是降权了吗(快手直播页面的火苗代表什么)

    快手直播火苗没了是降权了吗(快手直播页面的火苗代表什么)

  • 互联网有什么设施(互联网具有怎样的基本特点)

    互联网有什么设施(互联网具有怎样的基本特点)

  • 蓝牙耳机加减什么意思(蓝牙耳机加减音量键不管用)

    蓝牙耳机加减什么意思(蓝牙耳机加减音量键不管用)

  • 携程砍价返现在哪领取(携程砍价返现在哪里)

    携程砍价返现在哪领取(携程砍价返现在哪里)

  • w10不激活有什么影响(w10不激活会不会影响性能)

    w10不激活有什么影响(w10不激活会不会影响性能)

  • 怎么开通花呗(怎么开通花呗服务)

    怎么开通花呗(怎么开通花呗服务)

  • airpods防水等级(airpod 防水级别)

    airpods防水等级(airpod 防水级别)

  • vivox23炫彩版有红外线吗(vivox23炫彩版多少钱买的)

    vivox23炫彩版有红外线吗(vivox23炫彩版多少钱买的)

  • cad删除一部分快捷键(cad如何删除一整块中部分内容)

    cad删除一部分快捷键(cad如何删除一整块中部分内容)

  • 微信和朋友的聊天记录怎么恢复(微信和朋友的聊天记录)

    微信和朋友的聊天记录怎么恢复(微信和朋友的聊天记录)

  • 如何进行TP-Link路由器设置?(如何进行降压治疗)

    如何进行TP-Link路由器设置?(如何进行降压治疗)

  • 语谱图(一) Spectrogram 的定义与机理(语谱图生成)

    语谱图(一) Spectrogram 的定义与机理(语谱图生成)

  • 租赁房屋怎么写合同
  • 个体工商户收入怎么核定
  • 附加税计提多了怎么调整税额
  • 其他综合收益何时转投资收益
  • 工资交税是用累计税吗
  • 政府补助收入要交印花税吗
  • 预付账款和暂估入账的区别
  • 合伙开有限公司注销流程
  • 为什么租赁只能20年
  • 可转换债券含义
  • 境外中资企业转让股权的涉税处理
  • 电算化怎么操作
  • 土地增值税计税价格
  • 暂估入库商品作暂估冲红处理如何做?
  • 银行询证函费用计入财务费用还是管理费用
  • 调拨入库的固定资产是否缴税?
  • 海关缴款书认证不符
  • 没有业务来往可以报税吗
  • 单次劳务费税率
  • 体检发票开公司还是个人
  • 广告制作税收编码怎么填
  • 递延年金现值计算公式解释
  • 未计提印花税会计分录
  • 公司对外汇款需要什么手续
  • 单位代缴纳职工个税如何账务处理
  • 小规模纳税人增值税3%减按1%
  • windows10如何更改时间
  • 苹果6plus自带软件有哪些
  • 公司从一个帐户里扣税吗
  • 剑灵怎么截图正版
  • 合伙企业生产经营所得
  • php 面向对象
  • 公司试乘试驾车管理
  • 原材料当做废品怎么做
  • 超额累进税率包括
  • php 错误和异常处理
  • 计提减值后折旧年限怎么算
  • 递归 php
  • 购买商品或服务赠品法律地位
  • 得了遗尿症应该怎么办
  • php操作json
  • 面试官问几个问题
  • 未开票收入如何申报
  • 危废处理需要哪些手续
  • 面试宝典下载
  • openssl 加密套件
  • 稳岗补贴怎么申请步骤
  • python,array
  • 先做凭证再付款
  • 主营业务冲减怎么做账
  • 弥补亏损的会计分录是怎样的
  • 行政事业单位福利费开支范围文件
  • 发票专用章和财务专用章可以同一人保管吗
  • 当月进项票没有开进来
  • 子公司注销母公司收回现金流
  • 对外担保的效力
  • 搬迁赔偿款
  • 工资每月变动社保怎么变
  • 什么是补偿性余额,对银行借款的成本有何影响?
  • 跨年的个人所得税可以更正吗
  • 银行付款退回重付怎么办
  • 一般纳税人增值税申报操作流程
  • 企业向个人借款利息如何缴纳增值税
  • 通行费的进项抵税怎么算
  • 多收发票会计分录
  • 账簿按形式分几种
  • sql null用法
  • 勒索病毒2021
  • macfic
  • mac os ftp
  • fedora s9
  • win7的查看方式
  • linux的简单使用
  • 硬盘分区win7怎么扩充c盘
  • yum源有什么用
  • windows7里剪切小剪刀在哪里
  • Cocos2d-x 3.x lua绑定
  • Android ViewStub 布局延迟加载
  • androids翻译
  • 国家税务总局关于税务机构改革有关事项的公告
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设