pytorch 运行一段时间后出现GPU OOM的问题

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,这个再仔细看看。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 解决Pytorch 训练与测试时爆显存(out of memory)的问题

    Pytorch 训练时有时候会因为加载的东西过多而爆显存,有些时候这种情况还可以使用cuda的清理技术进行修整,当然如果模型实在太大,那也没办法. 使用torch.cuda.empty_cache()删除一些不需要的变量代码示例如下: try: output = model(input) except RuntimeError as exception: if "out of memory" in str(exception): print("WARNING: out of

  • Pytorch GPU显存充足却显示out of memory的解决方式

    今天在测试一个pytorch代码的时候显示显存不足,但是这个网络框架明明很简单,用CPU跑起来都没有问题,GPU却一直提示out of memory. 在网上找了很多方法都行不通,最后我想也许是pytorch版本的问题,原来我的pytorch版本是0.4.1,于是我就把这个版本卸载,然后安装了pytorch1.1.0,程序就可以神奇的运行了,不会再有OOM的提示了.虽然具体原因还不知道为何,这里还是先mark一下,具体过程如下: 卸载旧版本pytorch: conda uninstall pyt

  • 解决pytorch GPU 计算过程中出现内存耗尽的问题

    Pytorch GPU运算过程中会出现:"cuda runtime error(2): out of memory"这样的错误.通常,这种错误是由于在循环中使用全局变量当做累加器,且累加梯度信息的缘故,用官方的说法就是:"accumulate history across your training loop".在默认情况下,开启梯度计算的Tensor变量是会在GPU保持他的历史数据的,所以在编程或者调试过程中应该尽力避免在循环中累加梯度信息. 下面举个栗子: 上代

  • pytorch 运行一段时间后出现GPU OOM的问题

    pytorch的dataloader会将数据传到GPU上,这个过程GPU的mem占用会逐渐增加,为了避免GPUmen被无用的数据占用,可以在每个step后用del删除一些变量,也可以使用torch.cuda.empty_cache()释放显存: del targets, input_k, input_mask torch.cuda.empty_cache() 这时能观察到GPU的显存一直在动态变化. 但是上述方式不是一个根本的解决方案,因为他受到峰值的影响很大.比如某个batch的数据量明显大于

  • jQuery实现文本显示一段时间后隐藏的方法分析

    本文实例讲述了jQuery实现文本显示一段时间后隐藏的方法.分享给大家供大家参考,具体如下: 点击button时,提示信息显示,8秒后,信息隐藏. <input id="place_order" name="place_order" type="submit" /> <div class="after_submit_remind" style="display: none;"> 请耐

  • navicat 连接数据库隔段时间后自动断开连接的解决方案

    这是因为数据库服务器设置了连接多久没有活动就自动断开,避免连接数过多. 解决办法: 1.选择一个数据库,右键打开连接属性 选择高级,设置Keepalive Interval(240) -- 每4分钟自动发送一次心跳数据,这样就可以一直保持连接不断开了. 补充:Navicat导入sql脚本文件卡死注意事项 注意啦~ mysql.ini文件里的max_allowed_packet =64M这个参数不要设置太大 以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们.如有错误或未考虑完全的地方,

  • WinForm实现程序一段时间不运行自动关闭的方法

    本文实例讲述了WinForm实现程序一段时间不运行自动关闭的方法.分享给大家供大家参考.具体实现方法如下: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.

  • 基于JavaScript实现一定时间后去执行一个函数

    在实际需要中可能需要规定在指定的时间之后再去执行一个函数以达成期望的目的,这也就是一个定时器效果,恰好在js中就已经给定了这样的一个函数setTimeout(),下面先介绍一下次函数的 用法: 语法:  复制代码 代码如下: setTimeout(code,interval) 此函数能够规定在指定的在指定的事件之后去执行一段指定代码,此代码只执行一次. setTimeout()函数具有两个参数,第一个参数规定要执行的执行代码,第二个参数规定在多长时间后去执行代码,单位是毫秒. 代码实例: <!D

  • 在pytorch中为Module和Tensor指定GPU的例子

    pytorch指定GPU 在用pytorch写CNN的时候,发现一运行程序就卡住,然后cpu占用率100%,nvidia-smi 查看显卡发现并没有使用GPU.所以考虑将模型和输入数据及标签指定到gpu上. pytorch中的Tensor和Module可以指定gpu运行,并且可以指定在哪一块gpu上运行,方法非常简单,就是直接调用Tensor类和Module类中的 .cuda() 方法. import torch from PIL import Image import torch.nn as

  • Python退出时强制运行一段代码的实现方法

    设想这样一个场景,你要给一个项目开发测试程序,程序开始运行的时候,会创建初始环境,测试完成以后,会清理环境. 这段逻辑本身非常简单: setup() test() clean() 但由于测试的代码比较复杂,你总是在调试的时候程序异常,导致每次clean()函数还没有来得及运行,程序就崩溃了. 你可能想到,如果这样写会怎么样呢: setup() try: text() except Exception as e: print('运行异常:', e) clean() 似乎看起来,程序一定会运行到cl

  • jQuery 监控键盘一段时间没输入

    监控一段时间没输入可用于简单的输入完成 上次实现了一个模拟输入完成则发送请求到后台获取数据的并显示到前台的问题,其中核心的判断标准是输入完成的定义. 即:用户怎么算输入完成. 我使用的标准是,当一个文本框中,里面的内容1秒钟无变化,则表示用户1秒钟内无输入,说明用户是已经输入完成,再等待返回数据了.那么jQuery如何实现判断1秒内无输入呢. <!DOCTYPE html> <html> <head> <script src="http://apps.b

  • PHP间隔一段时间执行代码的方法

    本文实例讲述了PHP间隔一段时间执行代码的方法.分享给大家供大家参考.具体分析如下: PHP如何设置每隔一段时间自动执行某段代码?例如定时生成静态文件之类的,这就需要设置休眠时间,即每隔一段时间程序就会调用某段代码. 代码如下: 复制代码 代码如下: ignore_user_abort(); //即使Client断开(如关掉浏览器),PHP脚本也可以继续执行.  set_time_limit(0); // 执行时间为无限制,php默认执行时间是30秒,可以让程序无限制的执行下去  $interv

  • 一段时间以后切换显示的广告代码 原创

    先显示广告a,一段时间以后显示广告代码b,然后就一直显示广告b 一段时间以后切换的广告显示代码 a部分内容 b部分内容 var s=5000; //5000毫秒就是5秒 function showb(){ document.getElementById('a').style.display='none'; document.getElementById('b').style.display='block'; } window.setInterval("showb()",s) [Ctrl

随机推荐