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 相关文章推荐
使用setup.py安装python包和卸载python包的方法
Nov 27 Python
10种检测Python程序运行时间、CPU和内存占用的方法
Apr 01 Python
python BeautifulSoup设置页面编码的方法
Apr 03 Python
Python中比较特别的除法运算和幂运算介绍
Apr 05 Python
对numpy.append()里的axis的用法详解
Jun 28 Python
selenium+python实现1688网站验证码图片的截取功能
Aug 14 Python
CentOS下Python3的安装及创建虚拟环境的方法
Nov 28 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
TensorFlow自定义损失函数来预测商品销售量
Feb 05 Python
python两个list[]相加的实现方法
Sep 23 Python
Python中Pyspider爬虫框架的基本使用详解
Jan 27 Python
python 实现体质指数BMI计算
May 26 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
PHP中__get()和__set()的用法实例详解
2013/06/04 PHP
php ci框架中加载css和js文件失败的原因及解决方法
2014/07/29 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
可以用来调试JavaScript错误的解决方案
2010/08/07 Javascript
js 使用form表单select类实现级联菜单效果
2012/12/19 Javascript
javaScript矢量图表库-gRaphael几行代码实现精美的条形图/饼图/点图/曲线图
2013/01/09 Javascript
php跨域调用json的例子
2013/11/13 Javascript
JQuery中两个ul标签的li互相移动实现方法
2015/05/18 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
JavaScript中数组去除重复的三种方法
2016/04/22 Javascript
详解jQuery lazyload 懒加载
2016/12/19 Javascript
Vue.2.0.5过渡效果使用技巧
2017/03/16 Javascript
JS利用cookies设置每隔24小时弹出框
2017/04/20 Javascript
Vue入门之数据绑定(小结)
2018/01/08 Javascript
Vuex 入门教程
2018/01/10 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
JS实现匀速与减速缓慢运动的动画效果封装示例
2018/08/27 Javascript
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
浅谈vue 组件中的setInterval方法和window的不同
2020/07/30 Javascript
详解python中字典的循环遍历的两种方式
2017/02/07 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
keras分类模型中的输入数据与标签的维度实例
2020/07/03 Python
python pandas dataframe 去重函数的具体使用
2020/07/20 Python
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
六十岁生日答谢词
2014/01/10 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
党的群众路线教育实践活动个人批评与自我批评
2014/10/16 职场文书
个人年底工作总结
2015/03/10 职场文书
警告通知
2015/04/25 职场文书
2015年售票员工作总结
2015/04/29 职场文书
2016年父亲节寄语
2015/12/04 职场文书
mybatis调用sqlserver存储过程返回结果集的方法
2021/05/08 SQL Server
如何开启Apache,Nginx和IIS服务器的GZIP压缩功能
2022/04/29 Servers
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技