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常用的文件及文件路径、目录操作方法汇总介绍
May 21 Python
详解Python list 与 NumPy.ndarry 切片之间的对比
Jul 24 Python
python实现两个文件合并功能
Apr 01 Python
PyCharm代码回滚,恢复历史版本的解决方法
Oct 22 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
Oct 29 Python
【python】matplotlib动态显示详解
Apr 11 Python
Python中psutil的介绍与用法
May 02 Python
python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
Aug 06 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
Python中的引用和拷贝实例解析
Nov 14 Python
django修改models重建数据库的操作
Mar 31 Python
python 使用tkinter与messagebox写界面和弹窗
Mar 20 Python
python flask开发的简单基金查询工具
python爬取网页版QQ空间,生成各类图表
Python爬虫实战之爬取携程评论
Pytorch DataLoader shuffle验证方式
python 爬取吉首大学网站成绩单
python 批量压缩图片的脚本
Jun 02 #Python
python操作xlsx格式文件并读取
You might like
PHP防CC攻击实现代码
2011/12/29 PHP
使用Smarty 获取当前日期时间和格式化日期时间的方法详解
2013/06/18 PHP
laravel 5 实现模板主题功能(续)
2015/03/02 PHP
php把数组值转换成键的方法
2015/07/13 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
2019/04/03 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
分享XmlHttpRequest调用Webservice的一点心得
2012/07/20 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
2015/10/29 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
javascript内存分配原理实例分析
2017/04/10 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
自定义类似于jQuery UI Selectable 的Vue指令v-selectable
2017/08/23 jQuery
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
JavaScript HTML DOM元素 节点操作汇总
2019/07/29 Javascript
vue中使用elementUI组件手动上传图片功能
2019/12/13 Javascript
JavaScript进制转换实现方法解析
2020/01/18 Javascript
Node登录权限验证token验证实现的方法示例
2020/05/25 Javascript
python基础教程之匿名函数lambda
2017/01/17 Python
Python实现购物车功能的方法分析
2017/11/10 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
python匿名函数的使用方法解析
2019/10/10 Python
创建Shapefile文件并写入数据的例子
2019/11/26 Python
Python在终端通过pip安装好包以后在Pycharm中依然无法使用的问题(三种解决方案)
2020/03/10 Python
Anaconda和ipython环境适配的实现
2020/04/22 Python
numpy的Fancy Indexing和array比较详解
2020/06/11 Python
torchxrayvision包安装过程(附pytorch1.6cpu版安装)
2020/08/26 Python
谈谈python垃圾回收机制
2020/09/27 Python
.NET面试10题
2014/02/24 面试题
初婚未育未抱养证明
2014/01/12 职场文书
大学班长的职责
2014/01/27 职场文书
四议两公开实施方案
2014/03/28 职场文书
老干部工作先进集体事迹材料
2014/05/21 职场文书
被告答辩状范文
2015/05/22 职场文书
联谊会开场白
2015/06/01 职场文书