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 SqlAlchemy动态添加数据表字段实例解析
Feb 07 Python
Python元组及文件核心对象类型详解
Feb 11 Python
pip安装时ReadTimeoutError的解决方法
Jun 12 Python
python实现将汉字保存成文本的方法
Nov 16 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
详解python中sort排序使用
Mar 23 Python
python cv2在验证码识别中应用实例解析
Dec 25 Python
python离线安装外部依赖包的实现
Feb 13 Python
使用keras2.0 将Merge层改为函数式
May 23 Python
Opencv求取连通区域重心实例
Jun 04 Python
Python引入多个模块及包的概念过程解析
Sep 21 Python
Linux系统下升级pip的完整步骤
Jan 31 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
win7 64位系统 配置php最新版开发环境(php+Apache+mysql)
2014/08/15 PHP
php实现插入排序
2015/03/29 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
js对象关系图 方便dom操作
2012/03/18 Javascript
浅析node.js中close事件
2014/11/26 Javascript
原创jQuery弹出层插件分享
2015/04/02 Javascript
Javascript中arguments和arguments.callee的区别浅析
2015/04/24 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
jQuery实现扑克正反面翻牌效果
2017/03/10 Javascript
Require.JS中的几种define定义方式示例
2017/06/01 Javascript
js排序与重组的实例讲解
2017/08/28 Javascript
Vue keep-alive实践总结(推荐)
2017/08/31 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
JS实现音乐钢琴特效
2020/01/06 Javascript
[01:15:29]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第三局
2016/03/04 DOTA
[05:00]TI9战队采访 - Royal Never Give Up
2019/08/20 DOTA
python中MySQLdb模块用法实例
2014/11/10 Python
python+opencv实现动态物体识别
2018/01/09 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
python文件读写代码实例
2019/10/21 Python
Python restful框架接口开发实现
2020/04/13 Python
python如何提升爬虫效率
2020/09/27 Python
css3 box-sizing属性使用参考指南
2013/01/08 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
世界上最好的足球商店:Unisport
2019/03/02 全球购物
与C++相比,Java中的数组有什么不同
2014/03/25 面试题
初中新生军训方案
2014/05/13 职场文书
感恩老师演讲稿400字
2014/08/28 职场文书
优秀三好学生事迹材料
2014/08/31 职场文书
体育教师个人工作总结
2015/02/09 职场文书
外贸英文求职信范文
2015/03/19 职场文书
自荐信大全
2019/03/21 职场文书
Python面向对象之内置函数相关知识总结
2021/06/24 Python
HashMap实现保存两个key相同的数据
2021/06/30 Java/Android