解决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中的字符串知识点
Apr 14 Python
Python中的sort()方法使用基础教程
Jan 08 Python
Python数据结构之栈、队列的实现代码分享
Dec 04 Python
学生信息管理系统Python面向对象版
Jan 30 Python
python添加菜单图文讲解
Jun 04 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 Python
基于keras中的回调函数用法说明
Jun 17 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
Jul 18 Python
Anaconda使用IDLE的实现示例
Sep 23 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
python 实现Requests发送带cookies的请求
Feb 08 Python
python基础之爬虫入门
May 10 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 的 __FILE__ 常量
2007/01/15 PHP
快速配置PHPMyAdmin方法
2008/06/05 PHP
phplock(php进程锁) v1.0 beta1
2009/11/24 PHP
PHP 删除文件与文件夹操作 unlink()与rmdir()这两个函数的使用
2011/07/17 PHP
PHP类与对象中的private访问控制的疑问
2012/11/01 PHP
PHP自定义大小验证码的方法详解
2013/06/07 PHP
php中in_array函数用法分析
2014/11/15 PHP
php生成html文件方法总结
2014/12/01 PHP
PHP借助phpmailer发送邮件
2015/05/11 PHP
Symfony核心类概述
2016/03/17 PHP
php操作路径的经典方法(必看篇)
2016/10/04 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
js 程序执行与顺序实现详解
2013/05/13 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
用nodejs实现PHP的print_r函数代码
2014/03/14 NodeJs
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
Bootstrap精简教程
2015/11/27 Javascript
深入理解选择框脚本[推荐]
2016/12/13 Javascript
Vue.js上下滚动加载组件的实例代码
2017/07/17 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
Node.js中DNS模块学习总结
2018/02/28 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
[00:26]TI7不朽珍藏III——冥界亚龙不朽展示
2017/07/15 DOTA
[36:20]KG vs SECRET 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Django如何实现密码错误报错提醒
2020/09/04 Python
汽车技术服务英文求职信范文
2014/01/02 职场文书
社区八一活动方案
2014/02/03 职场文书
《广玉兰》教学反思
2014/04/14 职场文书
住院医师规范化培训实施方案
2014/06/12 职场文书
老员工辞职信范文
2015/05/12 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
Python图片处理之图片裁剪教程
2021/05/27 Python
使用 MybatisPlus 连接 SqlServer 数据库解决 OFFSET 分页问题
2022/04/22 SQL Server