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中的startswith和endswith函数使用实例
Aug 25 Python
Python3连接MySQL(pymysql)模拟转账实现代码
May 24 Python
python学习教程之使用py2exe打包
Sep 24 Python
Django的分页器实例(paginator)
Dec 01 Python
python使用KNN算法手写体识别
Feb 01 Python
Python英文文本分词(无空格)模块wordninja的使用实例
Feb 20 Python
python调用支付宝支付接口流程
Aug 15 Python
浅析使用Python搭建http服务器
Oct 27 Python
Python pathlib模块使用方法及实例解析
Oct 05 Python
selenium学习教程之定位以及切换frame(iframe)
Jan 04 Python
Python日志打印里logging.getLogger源码分析详解
Jan 17 Python
Django框架中视图的用法
Jun 10 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
香妃
2021/03/03 冲泡冲煮
thinkphp使用literal防止模板标签被解析的方法
2014/11/22 PHP
php字符串过滤与替换小结
2015/01/26 PHP
eclipse php wamp配置教程
2016/06/30 PHP
一些javascript一些题目的解析
2010/12/25 Javascript
js内置对象 学习笔记
2011/08/01 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
JavaScript判断数组重复内容的两种方法(推荐)
2016/06/06 Javascript
javascript设计模式之策略模式学习笔记
2017/02/15 Javascript
Node.js安装配置图文教程
2017/05/10 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
Angular5给组件本身的标签添加样式class的方法
2018/04/07 Javascript
详解Webpack + ES6 最新环境搭建与配置
2018/06/04 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
2019/06/03 Javascript
vue-cli4项目开启eslint保存时自动格式问题
2020/07/13 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
Python线程指南详细介绍
2017/01/05 Python
使用Python批量修改文件名的代码实例
2019/01/24 Python
对django 模型 unique together的示例讲解
2019/08/06 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
python使用opencv在Windows下调用摄像头实现解析
2019/11/26 Python
Python和Anaconda和Pycharm安装教程图文详解
2020/02/04 Python
在终端启动Python时报错的解决方案
2020/11/20 Python
用React加CSS3实现微信拆红包动画效果
2017/03/13 HTML / CSS
澳大利亚相机之家:Camera House
2017/11/30 全球购物
第一范式(1NF)、第二范式(2NF)和第三范式(3NF)之间的区别是什么?
2016/04/28 面试题
酷瑞网络科技面试题
2012/03/30 面试题
超市理货员岗位职责
2014/07/04 职场文书
2014公司党员自我评价范文
2014/09/11 职场文书
公司证明怎么写
2014/09/22 职场文书
大专毕业生自我鉴定范文(2篇)
2014/09/27 职场文书
市级三好学生评语
2014/12/29 职场文书
加薪申请报告范本
2015/05/15 职场文书
小学思想品德教学反思
2016/02/24 职场文书
python实现简单的聊天小程序
2021/07/07 Python