pytorch 运行一段时间后出现GPU OOM的问题


Posted in Python onJune 02, 2021

pytorch的dataloader会将数据传到GPU上,这个过程GPU的mem占用会逐渐增加,为了避免GPUmen被无用的数据占用,可以在每个step后用del删除一些变量,也可以使用torch.cuda.empty_cache()释放显存:

del targets, input_k, input_mask
torch.cuda.empty_cache()

这时能观察到GPU的显存一直在动态变化。

但是上述方式不是一个根本的解决方案,因为他受到峰值的影响很大。比如某个batch的数据量明显大于其他batch,可能模型处理该batch时显存会不够用,这也会导致OOM,虽然其他的batch都能顺利执行。

显存的占用跟这几个因素相关:

模型参数量

batch size

一个batch的数据 size

通常我们不希望改变模型参数量,所以只能通过动态调整batch-size,使得一个batch的数据 size不会导致显存OOM:

ilen = int(sorted_data[start][1]['input'][0]['shape'][0])
olen = int(sorted_data[start][1]['output'][0]['shape'][0])
# if ilen = 1000 and max_length_in = 800
# then b = batchsize / 2
# and max(1, .) avoids batchsize = 0
# 太长的句子会被动态改变bsz,单独成一个batch,否则padding的部分就太多了,数据量太大,OOM
factor = max(int(ilen / max_length_in), int(olen / max_length_out))
b = max(1, int(batch_size / (1 + factor)))
#b = batch_size
end = min(len(sorted_data), start + b)
minibatch.append(sorted_data[start:end])
if end == len(sorted_data):
    break
start = end

此外,如何选择一个合适的batchsize也是个很重要的问题,我们可以先对所有数据按照大小(长短)排好序(降序),不进行shuffle,按照64,32,16依次尝试bsz,如果模型在执行第一个batch的时候没出现OOM,那么以后一定也不会出现OOM(因为降序排列了数据,所以前面的batch的数据size最大)。

还有以下问题

pytorch increasing cuda memory OOM 问题

改了点model 的计算方式,然后就 OOM 了,调小了 batch_size,然后发现发现是模型每次迭代都会动态增长 CUDA MEMORY, 在排除了 python code 中的潜在内存溢出问题之后,基本可以把问题定在 pytorch 的图计算问题上了,说明每次迭代都重新生成了一张计算图,然后都保存着在,就 OOM 了。

参考

CUDA memory continuously increases when net(images) called in every iteration

Understanding graphs and state

说是会生成多个计算图:

loss = SomeLossFunction(out) + SomeLossFunction(out)

准备用 sum来避免多次生成计算图的问题:

loss = Variable(torch.sum(torch.cat([loss1, loss2], 0)))

然而,调着调着就好了,和报错前的 code 没太大差别。估计的原因是在pycharm 远程连接服务器的时候 code 的保存版本差异问题,这个也需要解决一下。

还有个多次迭代再计算梯度的问题,类似于 caffe中的iter_size,这个再仔细看看。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中反射用法实例
Mar 27 Python
Python环境下安装使用异步任务队列包Celery的基础教程
May 07 Python
Python 2与Python 3版本和编码的对比
Feb 14 Python
python 简单备份文件脚本v1.0的实例
Nov 06 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
python使用mysql的两种使用方式
Mar 07 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 Python
python 循环数据赋值实例
Dec 02 Python
Python unittest工作原理和使用过程解析
Feb 24 Python
python pyqtgraph 保存图片到本地的实例
Mar 14 Python
Ubuntu权限不足无法创建文件夹解决方案
Nov 14 Python
python3 re返回形式总结
Nov 20 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
终于听上了直流胆调频
2021/03/02 无线电
ThinkPHP验证码和分页实例教程
2014/08/22 PHP
PHP网络操作函数汇总
2015/05/18 PHP
php基于mcrypt_encrypt和mcrypt_decrypt实现字符串加密解密的方法
2016/07/12 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
浅析jquery的作用与优势
2013/12/02 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
jquery表单对象属性过滤选择器实例分析
2015/05/18 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
JavaScript采用递归算法计算阶乘实例
2015/08/04 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
2015/11/09 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
VUE 更好的 ajax 上传处理 axios.js实现代码
2017/05/10 Javascript
vue选项卡切换登录方式小案例
2019/09/27 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
python实现基于两张图片生成圆角图标效果的方法
2015/03/26 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
matplotlib调整子图间距,调整整体空白的方法
2018/08/03 Python
Python使用itchat 功能分析微信好友性别和位置
2019/08/05 Python
Django choices下拉列表绑定实例
2020/03/13 Python
关于keras.layers.Conv1D的kernel_size参数使用介绍
2020/05/22 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
皮肤科医师岗位职责
2013/12/04 职场文书
中专药剂专业应届毕的自我评价
2013/12/27 职场文书
升国旗仪式主持词
2014/03/19 职场文书
质量提升方案
2014/06/16 职场文书
酒店爱岗敬业演讲稿
2014/09/02 职场文书
医院党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
高一地理教学工作总结
2015/08/12 职场文书
php随机生成验证码,php随机生成数字,php随机生成数字加字母!
2021/04/01 PHP
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL