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冒泡排序简单实现方法
Jul 09 Python
Python使用Tkinter实现机器人走迷宫
Jan 22 Python
python 基本数据类型占用内存空间大小的实例
Jun 12 Python
python内存监控工具memory_profiler和guppy的用法详解
Jul 29 Python
使用python实现kNN分类算法
Oct 16 Python
pycharm运行程序时看不到任何结果显示的解决
Feb 21 Python
Jupyter Notebook折叠输出的内容实例
Apr 22 Python
如何利用python web框架做文件流下载的实现示例
Jun 02 Python
关于tf.matmul() 和tf.multiply() 的区别说明
Jun 18 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
python自动化调用百度api解决验证码
Apr 13 Python
Python中三种花式打印的示例详解
Mar 19 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
自动分页的不完整解决方案
2007/01/12 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
php中curl和file_get_content的区别
2014/05/10 PHP
PHP实现活动人选抽奖功能
2017/04/19 PHP
php源码的使用方法讲解
2019/09/26 PHP
javascript实现的在当前窗口中漂浮框的代码
2010/03/15 Javascript
JS控制阿拉伯数字转为中文大写示例代码
2013/09/04 Javascript
嵌入式iframe子页面与父页面js通信的方法
2015/01/20 Javascript
js实现二级菜单渐隐显示
2015/11/03 Javascript
Javascript中的return作用及javascript return关键字用法详解
2015/11/05 Javascript
javascript数组遍历的方法实例分析
2016/09/13 Javascript
Vue filters过滤器的使用方法
2017/07/14 Javascript
JS计算两个时间相差分钟数的方法示例
2018/01/10 Javascript
vue下载excel的实现代码后台用post方法
2019/05/10 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
js实现车辆管理系统
2020/08/26 Javascript
JavaScript十大取整方法实例教程
2020/12/03 Javascript
多种类型jQuery网页验证码插件代码实例
2021/01/09 jQuery
[01:18:31]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第一场 1月10日
2021/03/11 DOTA
Python运算符重载用法实例分析
2015/06/01 Python
使用Python发送各种形式的邮件的方法汇总
2015/11/09 Python
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
使用Python编写爬虫的基本模块及框架使用指南
2016/01/20 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
美国知名日用品连锁超市:Dollar General(多来店)
2017/01/14 全球购物
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
编码转换,怎样实现将GB2312编码的字符串转换为ISO-8859-1编码的字符串
2014/01/07 面试题
中英文自我评价语句
2013/12/20 职场文书
给朋友的道歉信
2014/01/09 职场文书
公司总经理任命书
2014/06/05 职场文书
运动会铅球比赛加油稿
2014/09/26 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
2016年庆“七一”主题党日活动总结
2016/04/05 职场文书
选择比努力更重要?这是长期以来对“努力”的最大误解
2019/07/12 职场文书
python 如何用map()函数创建多线程任务
2021/04/07 Python