iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >pytorch显存一直变大的解决方案
  • 202
分享到

pytorch显存一直变大的解决方案

2024-04-02 19:04:59 202人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

在代码中添加以下两行可以解决: torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True

在代码中添加以下两行可以解决:


torch.backends.cudnn.enabled = True
torch.backends.cudnn.benchmark = True

补充:pytorch训练过程显存一直增加的问题

之前遇到了爆显存的问题,卡了很久,试了很多方法,总算解决了。

总结下自己试过的几种方法:

**1. 使用torch.cuda.empty_cache()

在每一个训练epoch后都添加这一行代码,可以让训练从较低显存的地方开始,但并不适用爆显存的问题,随着epoch的增加,最大显存占用仍然会提示out of memory 。

2.使用torch.backends.cudnn.enabled = True 和 torch.backends.cudnn.benchmark = True

原理不太清楚,用法和1一样。但是几乎没有效果,直接pass。

3.最重要的:查看自己的forward函数是否存在泄露。

常需要在forward函数里调用其他子函数,这时候要特别注意:

input尽量不要写在for循环里面!!!

子函数里如果有append()等函数,一定少用,能不用就不用!!!

子函数list一定少用,能不用就不用!!!

总之,子函数一般也不会太复杂,直接写出来,别各种for,嵌套,变量。!!!

补充:Pytorch显存不断增长问题的解决思路

这个问题,我先后遇到过两次,每次都异常艰辛的解决了。

在网上,关于这个问题,你可以找到各种看似不同的解决方案,但是都没能解决我的问题。所以只能自己摸索,在摸索的过程中,有了一个排查问题点的思路。

下面举个例子说一下我的思路。

大体思路

其实思路很简单,就是在代码的运行阶段输出显存占用量,观察在哪一块存在显存剧烈增加或者显存异常变化的情况。

但是在这个过程中要分级确认问题点,也即如果存在三个文件main.py、train.py、model.py。

在此种思路下,应该先在main.py中确定问题点,然后,从main.py中进入到train.py中,再次输出显存占用量,确定问题点在哪。

随后,再从train.py中的问题点,进入到model.py中,再次确认。

如果还有更深层次的调用,可以继续追溯下去。

具体例子

main.py


def train(model,epochs,data):
    for e in range(epochs):
        print("1:{}".fORMat(torch.cuda.memory_allocated(0)))
        train_epoch(model,data)
        print("2:{}".format(torch.cuda.memory_allocated(0)))
        eval(model,data)
        print("3:{}".format(torch.cuda.memory_allocated(0)))

假设1与2之间显存增加极为剧烈,说明问题出在train_epoch中,进一步进入到train.py中。

train.py


def train_epoch(model,data):
    model.train()
    optim=torch.optimizer()
    for batch_data in data:
        print("1:{}".format(torch.cuda.memory_allocated(0)))
        output=model(batch_data)
        print("2:{}".format(torch.cuda.memory_allocated(0)))
        loss=loss(output,data.target)
        print("3:{}".format(torch.cuda.memory_allocated(0)))
        optim.zero_grad()
        print("4:{}".format(torch.cuda.memory_allocated(0)))
        loss.backward()
        print("5:{}".format(torch.cuda.memory_allocated(0)))
        utils.func(model)
        print("6:{}".format(torch.cuda.memory_allocated(0)))

如果在1,2之间,5,6之间同时出现显存增加异常的情况。此时需要使用控制变量法,例如我们先让5,6之间的代码失效,然后运行,观察是否仍然存在显存爆炸。如果没有,说明问题就出在5,6之间下一级的代码中。进入到下一级代码,进行调试:

utils.py


def func(model):
print("1:{}".format(torch.cuda.memory_allocated(0)))
a=f1(model)
print("2:{}".format(torch.cuda.memory_allocated(0)))
b=f2(a)
print("3:{}".format(torch.cuda.memory_allocated(0)))
c=f3(b)
print("4:{}".format(torch.cuda.memory_allocated(0)))
d=f4(c)
print("5:{}".format(torch.cuda.memory_allocated(0)))

此时我们再展示另一种调试思路,先注释第5行之后的代码,观察显存是否存在先训爆炸,如果没有,则注释掉第7行之后的,直至确定哪一行的代码出现导致了显存爆炸。假设第9行起作用后,代码出现显存爆炸,说明问题出在第九行,显存爆炸的问题定。

几种导致显存爆炸的情况

PyTorch的hook机制可能导致,显存爆炸,hook函数取出某一层的输入输出跟权重后,不可进行存储,修改等操作,这会造成hook不能回收,进而导致取出的输入输出权重都可能不被pytorch回收,所以模型的负担越来也大,最终导致显存爆炸。

这种情况是我第二次遇到显存爆炸查出来的,非常让人匪夷所思。在如下代码中,p.sub_(torch.mm(k, torch.t(k)) / (alpha + torch.mm(r, k))),导致了显存爆炸,这个问题点就是通过上面的方法确定的。

这个P是一个矩阵,在使用p.sub_的方式更新P的时候,导致了显存爆炸。

将这行代码修改为p=p-(torch.mm(k, torch.t(k)) / (alpha + torch.mm(r, k))),显存爆炸的问题解决。


  def pro_weight(p, x, w, alpha=1.0, cnn=True, stride=1):
                if cnn:
                    _, _, H, W = x.shape
                    F, _, HH, WW = w.shape
                    S = stride  # stride
                    Ho = int(1 + (H - HH) / S)
                    Wo = int(1 + (W - WW) / S)
                    for i in range(Ho):
                        for j in range(Wo):
                            # N*C*HH*WW, C*HH*WW = N*C*HH*WW, sum -> N*1
                            r = x[:, :, i * S: i * S + HH, j * S: j * S + WW].contiguous().view(1, -1)
                            # r = r[:, range(r.shape[1] - 1, -1, -1)]
                            k = torch.mm(p, torch.t(r))
                            p.sub_(torch.mm(k, torch.t(k)) / (alpha + torch.mm(r, k)))
                    w.grad.data = torch.mm(w.grad.data.view(F, -1), torch.t(p.data)).view_as(w)
                else:
                    r = x
                    k = torch.mm(p, torch.t(r))
                    p.sub_(torch.mm(k, torch.t(k)) / (alpha + torch.mm(r, k)))
                    w.grad.data = torch.mm(w.grad.data, torch.t(p.data))

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。如有错误或未考虑完全的地方,望不吝赐教。

--结束END--

本文标题: pytorch显存一直变大的解决方案

本文链接: https://www.lsjlt.com/news/123132.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • pytorch显存一直变大的解决方案
    在代码中添加以下两行可以解决: torch.backends.cudnn.enabled = True torch.backends.cudnn.benchmark = True...
    99+
    2024-04-02
  • 如何解决pytorch显存一直变大的问题
    本篇内容介绍了“如何解决pytorch显存一直变大的问题”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在代码中添加以下两行可以解决:torc...
    99+
    2023-06-14
  • winform内存一直增大怎么解决
    在WinForms应用程序中,内存持续增长可能是由于内存泄漏引起的。内存泄漏指的是应用程序无法释放不再使用的内存,导致内存占用不断增...
    99+
    2023-10-10
    winform
  • Win10重启一直转圈的解决方案
    有时候在重新启动计算机时,我们可能会遇到Win10系统的屏幕旋转导致启动速度变慢的问题。在这种情况下我们该怎么办?让我们来看看小编的解决方案。Win10重启一直转圈的解决方案。需要多次启动win10系统重启,然后进入恢复页面,点击查看高级恢...
    99+
    2023-07-12
  • 大数据存储解决方案
    大数据存储解决方案主要包括以下几个方面:1. 分布式文件系统:大数据存储需要搭建分布式文件系统来存储海量数据,常用的分布式文件系统有...
    99+
    2023-09-21
    大数据
  • pytorch DistributedDataParallel 多卡训练结果变差的解决方案
    DDP 数据shuffle 的设置 使用DDP要给dataloader传入sampler参数(torch.utils.data.distributed.DistributedSamp...
    99+
    2024-04-02
  • go path 与大数据存储:一种新的解决方案?
    随着大数据的快速发展,越来越多的企业开始面临存储和管理海量数据的挑战。同时,Go语言也在逐渐成为大数据领域的热门语言。在这篇文章中,我们将探讨Go Path与大数据存储的结合,以及它可能成为一种新的解决方案的原因。 Go Path是什么? ...
    99+
    2023-10-01
    path 大数据 存储
  • win7屏幕一直是闪屏的解决方案
    win7系统是一个非常好的使用体验!强大的稳定性确保了系统的平稳运行,但最近,许多win7合作伙伴回应说,他们遇到了屏幕闪烁的问题。今天,小编将为您带来win7电脑屏幕闪烁的解决方案。让我们看看。win7屏幕一直闪屏的解决方案:在电脑桌面空...
    99+
    2023-07-24
  • pytorch训练神经网络爆内存的解决方案
    训练的时候内存一直在增加,最后内存爆满,被迫中断。 后来换了一个电脑发现还是这样,考虑是代码的问题。 检查才发现我的代码两次存了loss,只有一个地方写的是loss.item()。...
    99+
    2024-04-02
  • oracle shutdown immediate 一直没反应解决方案
    oracle shutdown immediate 一直没反应解决方案 数据库监听突然出现了问题,重新配置之后,重启数据库。发现不管是用shutdown  还是跟上参数 imme...
    99+
    2024-04-02
  • oracle shutdown immediate一直没反应解决方案
    如果使用`SHUTDOWN IMMEDIATE`命令没有任何反应,可能是由于以下几个原因导致的:1. 有其他会话或进程阻塞了关机进程...
    99+
    2023-09-02
    oracle
  • 阿里云服务器一直闪退的解决方案
    在使用阿里云服务器的过程中,如果遇到服务器一直闪退的问题,可能会给我们的工作和生活带来很大的影响。那么,我们应该如何解决这个问题呢?本篇文章将提供一些阿里云服务器一直闪退的解决方案。 首先,我们需要检查阿里云服务器的网络连接是否正常。如果服...
    99+
    2023-12-10
    阿里 解决方案 服务器
  • win7一直卡在还原更改的解决方案中
    现在有很多朋友使用win7系统,所以在win7系统的过程中会遇到一些问题,比如配置update失败,恢复和更改。不要关闭计算机,也就是说,win7一直被卡在恢复和更改中。如果win7被卡在恢复和更改中怎么办?许多朋友仍然不知道。让我们来看看...
    99+
    2023-07-10
  • mybatis一直加载xml,找到错误的解决方案
    目录mybatis一直加载xml,找到错误今天终于找到了一种解决方法mybatis延迟加载(xml)在mybatis的配置文件中mybatis一直加载xml,找到错误 我们在写spr...
    99+
    2024-04-02
  • 阿里云ECS与OSS一种强大的数据存储解决方案
    阿里云ECS( Elastic Compute Service)和OSS(Object StorageService)是两个重要的云计算服务,它们可以为用户提供高效、安全的数据存储解决方案。 阿里云ECS是一种弹性计算服务,它可以提供大量的...
    99+
    2024-01-26
    阿里 数据存储 强大
  • Pytorch训练网络过程中loss突然变为0的解决方案
    问题 // loss 突然变成0 python train.py -b=8 INFO: Using device cpu INFO: Network: 1 inp...
    99+
    2024-04-02
  • win10启动一直打转该怎么办win10启动一直打转解决方案
    win10启动一直打转这个问题许多客户都是有遇到过,那麼win10启动一直打转怎么办呢,客户们最先要进到msconfig中,随后根据系统设置节面的设备开展设定,根据一些简易的改动随后就可以将此解决问题,那麼下边便是实际的win10启动一直打...
    99+
    2023-07-15
  • pytorch 梯度NAN异常值的解决方案
    pytorch 梯度NAN异常值 gradient 为nan可能原因: 1、梯度爆炸 2、学习率太大 3、数据本身有问题 4、backward时,某些方法造成0在分母上, 如:使用方...
    99+
    2024-04-02
  • pytorch训练时的显存占用递增的问题解决
    目录遇到的问题:解决方法:补充:Pytorch显存不断增长问题的解决思路遇到的问题: 在pytorch训练过程中突然out of memory。 解决方法: 1. 测试的时候爆显存有...
    99+
    2023-01-15
    pytorch 显存占用递增 pytorch 显存占用
  • Win10输入开机密码却一直转圈的解决方案
    许多用户会为他们的win10计算机设置密码,但一些朋友遇到了打开和输入密码的情况,所以win10输入打开密码一直在转圈怎么办?让我们来看看win10输入打开密码的解决方案。Win10输入开机密码却一直转圈的解决方案。开机界面重启三次后,即可...
    99+
    2023-07-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作