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计算圆周长、面积、球体体积并画出圆
Apr 08 Python
Python中字典映射类型的学习教程
Aug 20 Python
深入理解Python中变量赋值的问题
Jan 12 Python
Python实现视频下载功能
Mar 14 Python
pyqt5实现俄罗斯方块游戏
Jan 11 Python
python三引号输出方法
Feb 27 Python
python的一些加密方法及python 加密模块
Jul 11 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
Python bisect模块原理及常见实例
Jun 17 Python
解决import tensorflow导致jupyter内核死亡的问题
Feb 06 Python
Python3接口性能测试实例代码
Jun 20 Python
Python利用zhdate模块实现农历日期处理
Mar 31 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
php提示undefined index的几种解决方法
2012/05/21 PHP
php中switch语句用法详解
2015/08/17 PHP
PHP响应post请求上传文件的方法
2015/12/17 PHP
详解配置 Apache 服务器支持 PHP 文件的解析
2017/02/15 PHP
Codeigniter里的无刷新上传的实现代码
2019/04/14 PHP
浏览器的JavaScript引擎的识别方法
2013/10/20 Javascript
jquery的ajax和getJson跨域获取json数据的实现方法
2014/02/04 Javascript
JavaScript利用构造函数和原型的方式模拟C#类的功能
2014/03/06 Javascript
js+div实现文字滚动和图片切换效果代码
2015/08/27 Javascript
jquery实现经典的淡入淡出选项卡效果代码
2015/09/22 Javascript
js实现模拟银行卡账号输入显示效果
2015/11/18 Javascript
Bootstrap表单布局样式代码
2016/05/31 Javascript
JavaScript生成验证码并实现验证功能
2016/09/24 Javascript
php 修改密码实现代码
2017/05/24 Javascript
Node.js  REPL (交互式解释器)实例详解
2017/08/06 Javascript
Nodejs进阶之服务端字符编解码和乱码处理
2017/09/04 NodeJs
vue-auto-focus: 控制自动聚焦行为的 vue 指令方法
2018/08/25 Javascript
angular组件间通讯的实现方法示例
2020/05/07 Javascript
vue绑定数字类型 value为数字的实例
2020/08/31 Javascript
一篇文章带你从零快速上手Rollup
2020/09/07 Javascript
python机器学习之神经网络(三)
2017/12/20 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
Python OpenCV 调用摄像头并截图保存功能的实现代码
2019/07/02 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
解决tensorflow由于未初始化变量而导致的错误问题
2020/01/06 Python
Jupyter notebook 启动闪退问题的解决
2020/04/13 Python
python爬取代理ip的示例
2020/12/18 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
白兰氏健康Mall:BRAND’S
2017/11/13 全球购物
Ejb技术面试题
2015/04/29 面试题
《钱学森》听课反思
2014/03/01 职场文书
本科毕业生自荐信
2014/05/26 职场文书
企业群众路线教育实践活动心得体会
2014/11/03 职场文书
你对自己的信用报告有过了解吗?
2019/07/09 职场文书
留学文书中的个人陈述,应该注意哪些问题?
2019/08/23 职场文书