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


Posted in Python onAugust 19, 2019

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

下面举个栗子:

上代码:

total_loss=0
for i in range(10000):
  optimizer.zero_grad()
  output=model(input)
  loss=criterion(output)
  loss.backward()
  optimizer.step()
  total_loss+=loss
  #这里total_loss是跨越循环的变量,起着累加的作用,
  #loss变量是带有梯度的tensor,会保持历史梯度信息,在循环过程中会不断积累梯度信息到tota_loss,占用内存

以上例子的修正方法是在循环中的最后一句修改为:total_loss+=float(loss),利用类型变换解除梯度信息,这样,多次累加不会累加梯度信息。

局部变量逗留导致内存泄露

局部变量通常在变量作用域之外会被Python自动销毁,在作用域之内,不需要的临时变量可以使用del x来销毁。

在设计Linear Layers 的时候,尽量让其规模小点

对于nn.Linear(m,n)这样规模的线性函数,他的空间规模为O(mn),除此规模的空间来容纳参数意外,还需要同样规模的空间来存储梯度,由此很容易造成GPU空间溢出。

相关的进程管理bash cmd

nvidia-smi监控GPU,

watch -n 1 nvidia-smi实时监控GPU,

watch -n 1 lscpu实时监控CPU,

ps -elf进程查看,

ps -elf | grep python查看Python子进程,

kill -9 [PID]杀死进程PID。

Referance:

Pytorch documentations

以上这篇解决pytorch GPU 计算过程中出现内存耗尽的问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python切换pip安装源的方法详解
Nov 18 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
python接口自动化(十六)--参数关联接口后传(详解)
Apr 16 Python
python获取网络图片方法及整理过程详解
Dec 20 Python
Python namedtuple命名元组实现过程解析
Jan 08 Python
tensorflow实现训练变量checkpoint的保存与读取
Feb 10 Python
Python编程快速上手——强口令检测算法案例分析
Feb 29 Python
django queryset 去重 .distinct()说明
May 19 Python
python 简单的调用有道翻译
Nov 25 Python
Python 把两层列表展开平铺成一层(5种实现方式)
Apr 07 Python
用Python远程登陆服务器的步骤
Apr 16 Python
Python中22个万用公式的小结
Jul 21 Python
将Pytorch模型从CPU转换成GPU的实现方法
Aug 19 #Python
pytorch 使用单个GPU与多个GPU进行训练与测试的方法
Aug 19 #Python
在pytorch中为Module和Tensor指定GPU的例子
Aug 19 #Python
pytorch使用指定GPU训练的实例
Aug 19 #Python
关于pytorch多GPU训练实例与性能对比分析
Aug 19 #Python
pytorch 更改预训练模型网络结构的方法
Aug 19 #Python
pytorch打印网络结构的实例
Aug 19 #Python
You might like
php正则表达匹配中文问题分析小结
2012/03/25 PHP
php下载文件源代码(强制任意文件格式下载)
2014/05/09 PHP
PHP的AES加密算法完整实例
2016/07/20 PHP
php+js实现点赞功能的示例详解
2020/08/07 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
基于jquery库的tab新形式使用
2012/11/16 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
在HTML中插入JavaScript代码的示例
2015/06/03 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
AngularJS实现表单手动验证和表单自动验证
2015/12/09 Javascript
angular.js之路由的选择方法
2016/09/24 Javascript
有关文件上传 非ajax提交 得到后台数据问题
2016/10/12 Javascript
Javascript for in的缺陷总结
2017/02/03 Javascript
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
JS实现骰子3D旋转效果
2019/10/24 Javascript
Vue防止白屏添加首屏动画的实例
2019/10/31 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
2020/02/13 Javascript
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
2015/03/05 Python
python 简单备份文件脚本v1.0的实例
2017/11/06 Python
python 字典中取值的两种方法小结
2018/08/02 Python
python 列表转为字典的两个小方法(小结)
2019/06/28 Python
flask/django 动态查询表结构相同表名不同数据的Model实现方法
2019/08/29 Python
tensorflow没有output结点,存储成pb文件的例子
2020/01/04 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
python数字类型math库原理解析
2020/03/02 Python
python中前缀运算符 *和 **的用法示例详解
2020/05/28 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
凯普林包包西班牙官网:Kipling西班牙
2019/04/12 全球购物
车队司机个人自我鉴定
2014/04/17 职场文书
小学生安全演讲稿
2014/04/25 职场文书
行政处罚决定书
2015/06/24 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书
openstack云计算keystone组件工作介绍
2022/04/20 Servers