问题起因:笔者想把别人的torch的代码复制到笔者的代码框架下,从而引起的显存爆炸问题

该bug在困扰了笔者三天的情况下,和学长一同解决了该bug,故在此记录这次艰辛的debug之路。

尝试思路1:检查是否存在保留loss的情况下是否使用了 item() 取值,经检查,并没有

尝试思路2:按照网上的说法,添加两行下面的代码:

torch.backends.cudnn.enabled = True

torch.backends.cudnn.benchmark = True

实测发现并没有用。

尝试思路3:及时删除临时变量和清空显存的cache,例如每次训练一个batch就清除模型的输入输出。

del inputs,loss
gc.collect()
torch.cuda.empty_cache()

这样确实使得模型能够多训练几个epoch,但依旧没有解决显存持续增长的问题,而且由于频繁使用torch.cuda.empty_cache(),导致模型一个epoch的训练时长翻了3倍多。

尝试思路4:重新核对原模型代码,打印模型中所有parameters和register_buffer的require_grad,终于发现是因为模型中的某个register_buffer在训练过程中,它的require_grad本应该为False,然而迁移到我代码上的实际训练过程中变成了True,而这个buffer的占用数据空间也不大,可能是因为变为True之后,导致在显存中一直被保留,从而最终导致显存溢出。再将那个buffer在forward函数里的操作放在torch.no_grad()上下文中,问题解决!

总结:如果训练时显存占用持续增加,需要谨慎的检查forward函数中的操作,尤其是在编写复杂代码的时候,更需要更细致的检查!

pytorch学习笔记——训练时显存逐渐增加,几个epoch后out-of-memory的更多相关文章

  1. Pytorch训练时显存分配过程探究

    对于显存不充足的炼丹研究者来说,弄清楚Pytorch显存的分配机制是很有必要的.下面直接通过实验来推出Pytorch显存的分配过程. 实验实验代码如下: import torch from torch ...

  2. 深度学习中GPU和显存分析

    刚入门深度学习时,没有显存的概念,后来在实验中才渐渐建立了这个意识. 下面这篇文章很好的对GPU和显存总结了一番,于是我转载了过来. 作者:陈云 链接:https://zhuanlan.zhihu. ...

  3. ref:学习笔记 UpdateXml() MYSQL显错注入

    ref:https://www.cnblogs.com/MiWhite/p/6228491.html 学习笔记 UpdateXml() MYSQL显错注入 在学习之前,需要先了解 UpdateXml( ...

  4. matlab学习笔记7-定时器

    一起来学matlab-matlab学习笔记7-定时器 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 感谢张老师的书籍,让 ...

  5. pytorch学习笔记(6)--神经网络非线性激活

    如果神经元的输出是输入的线性函数,而线性函数之间的嵌套任然会得到线性函数.如果不加非线性函数处理,那么最终得到的仍然是线性函数.所以需要在神经网络中引入非线性激活函数. 常见的非线性激活函数主要包括S ...

  6. [PyTorch 学习笔记] 1.1 PyTorch 简介与安装

    PyTorch 的诞生 2017 年 1 月,FAIR(Facebook AI Research)发布了 PyTorch.PyTorch 是在 Torch 基础上用 python 语言重新打造的一款深 ...

  7. [PyTorch 学习笔记] 3.1 模型创建步骤与 nn.Module

    本章代码:https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson3/module_containers.py 这篇文章来看下 ...

  8. [PyTorch 学习笔记] 4.3 优化器

    本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson4/optimizer_methods.py https: ...

  9. [PyTorch 学习笔记] 6.2 Normalization

    本章代码: https://github.com/zhangxiann/PyTorch_Practice/blob/master/lesson6/bn_and_initialize.py https: ...

  10. [深度学习] pytorch学习笔记(4)(Module类、实现Flatten类、Module类作用、数据增强)

    一.继承nn.Module类并自定义层 我们要利用pytorch提供的很多便利的方法,则需要将很多自定义操作封装成nn.Module类. 首先,简单实现一个Mylinear类: from torch ...

随机推荐

  1. Azure Storage 系列(八)存储类型细化分类说明

    一,引言 Azure 存储账户功能经过官方改进迭代后,在创建的时候,存储账户的类型被分为两大类: 1)general-purpose v2 account(标准常规用途v2) Blob 存储,队列存储 ...

  2. 程序员视角下的API数据接口对接指南

    ​ 在当今互联网时代,许多应用程序和网站都需要使用第三方的API接口来获取数据.API(Application Programming Interface)允许不同的应用程序之间进行数据交互,从而提高 ...

  3. Microsoft Build 2021第二天

    C++20 Ranges are complete in Visual Studio 2019 version 16.10 https://devblogs.microsoft.com/cppblog ...

  4. 用Rust手把手编写一个Proxy(代理), 动工

    用Rust手把手编写一个Proxy(代理), 动工 项目 ++wmproxy++ gitee 传送门 github 传送门 设计流程图 flowchart LR A[客户端] -->|Http| ...

  5. Towards Network Anomaly Detection Using Graph Embedding笔记

    Towards Network Anomaly Detection Using Graph Embedding 目录 Towards Network Anomaly Detection Using G ...

  6. Docker系列——介绍、安装、镜像、容器、docker容器与镜像、数据卷、Dockerfile、docker 配置pycharm连接

    目录 1 Docker 介绍 1.1 简介 1.2 Docker平台介绍 1.3 为什么使用Docker 2 Docker 整体结构(了解) 2.1 Docker引擎介绍 (Docker Engine ...

  7. Java 位运算的解读 & | ^ ~ << >>

    Java中的位运算包括以下几种: 按位与(&):对应位上,如果两个数都是1,则结果为1,否则为0. int a = 3; // 二进制 0011 int b = 5; // 二进制 0101 ...

  8. 从输入URL到页面加载完都发生了什么

    1.浏览器的地址栏输入URL并按下回车. 2.浏览器查找当前URL是否存在缓存,并比较缓存是否过期. 3.DNS解析URL对应的IP. 4.根据IP建立TCP连接(三次握手). 5.HTTP发起请求. ...

  9. iframe用的场景

    iframe可用在以下几个场景中: 1:典型系统结构,左侧是功能树,右侧就是一些常见的table或者表单之类的.为了每一个功能,单独分离出来,采用iframe. 2:ajax上传文件. 3:加载别的网 ...

  10. Linux内存管理 | 一、内存管理的由来及思想

    1.前言 <中庸>有:"九层之台,起于垒土" 之说,那么对于我们搞技术的人,同样如此! 对于Linux内存管理,你可以说没有留意过,但是它存在于我们日常开发的方方面面, ...