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高级应用实例对比:高效计算大文件中的最长行的长度
Jun 08 Python
Python urlopen()函数 示例分享
Jun 12 Python
Python构造自定义方法来美化字典结构输出的示例
Jun 16 Python
python爬虫入门教程--正则表达式完全指南(五)
May 25 Python
基于Python List的赋值方法
Jun 23 Python
python 对key为时间的dict排序方法
Oct 17 Python
Python中Proxypool库的安装与配置
Oct 19 Python
python三方库之requests的快速上手
Mar 04 Python
python框架flask表单实现详解
Nov 04 Python
使用Pycharm(Python工具)新建项目及创建Python文件的教程
Apr 26 Python
教你利用Selenium+python自动化来解决pip使用异常
May 20 Python
只用Python就可以制作的简单词云
Jun 07 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
CodeIgniter扩展核心类实例详解
2016/01/20 PHP
php的常量和变量实例详解
2017/06/27 PHP
phpstorm 正则匹配删除空行、注释行(替换注释行为空行)
2018/01/21 PHP
js中onload与onunload的使用示例
2013/08/25 Javascript
Jquery如何实现点击时高亮显示代码
2014/01/22 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
javascript实现10个球随机运动、碰撞实例详解
2015/07/08 Javascript
多种JQuery循环滚动文字图片效果代码
2020/06/23 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
简单实现jQuery进度条轮播实例代码
2016/06/20 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
AngularJS获取json数据的方法详解
2017/05/27 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
原生nodejs使用websocket代码分享
2018/04/07 NodeJs
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
nodejs中函数的调用实例详解
2018/10/31 NodeJs
小程序转发探索示例
2019/02/19 Javascript
vue实现百度下拉列表交互操作示例
2019/03/12 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
React实现阿里云OSS上传文件的示例
2020/08/10 Javascript
Django日志模块logging的配置详解
2017/02/14 Python
Python openpyxl 遍历所有sheet 查找特定字符串的方法
2018/12/10 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
python 自定义异常和主动抛出异常(raise)的操作
2020/12/11 Python
Python try except finally资源回收的实现
2021/01/25 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
Stubhub英国:购买体育、演唱会和剧院门票
2018/06/10 全球购物
索尼巴西商店:Sony巴西
2019/06/21 全球购物
北京泡泡网网络有限公司.net面试题
2012/07/17 面试题
茶叶生产计划书
2014/01/10 职场文书
办公室岗位职责
2014/02/12 职场文书
学习决心书范文
2014/03/11 职场文书
详解解Django 多对多表关系的三种创建方式
2021/08/23 Python
python微信智能AI机器人实现多种支付方式
2022/04/12 Python