弄清Pytorch显存的分配机制


Posted in Python onDecember 10, 2020

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

实验实验代码如下:

import torch 
from torch import cuda 

x = torch.zeros([3,1024,1024,256],requires_grad=True,device='cuda') 
print("1", cuda.memory_allocated()/1024**2) 
y = 5 * x 
print("2", cuda.memory_allocated()/1024**2) 
torch.mean(y).backward()   
print("3", cuda.memory_allocated()/1024**2)  
print(cuda.memory_summary())

输出如下:

弄清Pytorch显存的分配机制

代码首先分配3GB的显存创建变量x,然后计算y,再用y进行反向传播。可以看到,创建x后与计算y后分别占显存3GB与6GB,这是合理的。另外,后面通过backward(),计算出x.grad,占存与x一致,所以最终一共占有显存9GB,这也是合理的。但是,输出显示了显存的峰值为12GB,这多出的3GB是怎么来的呢?首先画出计算图:

弄清Pytorch显存的分配机制

下面通过列表的形式来模拟Pytorch在运算时分配显存的过程:

弄清Pytorch显存的分配机制

如上所示,由于需要保存反向传播以前所有前向传播的中间变量,所以有了12GB的峰值占存。

我们可以不存储计算图中的非叶子结点,达到节省显存的目的,即可以把上面的代码中的y=5*x与mean(y)写成一步:

import torch 
from torch import cuda 

x = torch.zeros([3,1024,1024,256],requires_grad=True,device='cuda') 
print("1", cuda.memory_allocated()/1024**2)  
torch.mean(5*x).backward()   
print("2", cuda.memory_allocated()/1024**2)  
print(cuda.memory_summary())

 占显存量减少了3GB:

弄清Pytorch显存的分配机制

以上就是弄清Pytorch显存的分配机制的详细内容,更多关于Pytorch 显存分配的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python中使用items()方法返回字典元素对的教程
May 21 Python
Python中的条件判断语句基础学习教程
Feb 07 Python
Python 实现数据库更新脚本的生成方法
Jul 09 Python
Python多继承顺序实例分析
May 26 Python
python里dict变成list实例方法
Jun 26 Python
python开头的coding设置方法
Aug 08 Python
wxpython+pymysql实现用户登陆功能
Nov 19 Python
解决pycharm debug时界面下方不出现step等按钮及变量值的问题
Jun 09 Python
django下创建多个app并设置urls方法
Aug 02 Python
python 列表推导和生成器表达式的使用
Feb 01 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
如何在C++中调用Python
May 21 Python
python实现经纬度采样的示例代码
Dec 10 #Python
Python urlopen()参数代码示例解析
Dec 10 #Python
Python urllib request模块发送请求实现过程解析
Dec 10 #Python
Python APScheduler执行使用方法详解
Dec 10 #Python
flask项目集成swagger的方法
Dec 09 #Python
python的dict判断key是否存在的方法
Dec 09 #Python
python RSA加密的示例
Dec 09 #Python
You might like
让PHP显示Facebook的粉丝数量方法
2014/01/08 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
2017/06/08 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
PHP命名空间namespace及use的简单用法分析
2018/08/03 PHP
js 替换
2008/02/19 Javascript
jQuery1.4.2与老版本json格式兼容的解决方法
2011/02/12 Javascript
MultiSelect左右选择控件的设计与实现介绍
2013/06/08 Javascript
Egret引擎开发指南之视觉编程
2014/09/03 Javascript
javascript实现在指定元素中垂直水平居中
2015/09/13 Javascript
九种原生js动画效果
2015/11/11 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
2017/03/08 Javascript
微信小程序实现轮播图效果
2017/09/07 Javascript
解决vue+webpack打包路径的问题
2018/03/06 Javascript
Vue2.2.0+新特性整理及注意事项
2018/08/22 Javascript
angular4自定义组件非input元素实现ngModel双向数据绑定的方法
2018/12/28 Javascript
Vue的props父传子的示例代码
2020/05/20 Javascript
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
在centos7中分布式部署pyspider
2017/05/03 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
全面分析Python的优点和缺点
2018/02/07 Python
TensorFlow实现随机训练和批量训练的方法
2018/04/28 Python
关于Pytorch的MNIST数据集的预处理详解
2020/01/10 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
2020/05/09 Python
如何对python的字典进行排序
2020/06/19 Python
Python改变对象的字符串显示的方法
2020/08/01 Python
Python实现钉钉/企业微信自动打卡的示例代码
2021/02/02 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
可靠的数据流传输TCP
2016/03/15 面试题
重阳节活动总结
2014/08/27 职场文书
2014年十八届四中全会思想汇报范文
2014/10/17 职场文书
教师听课评语大全
2014/12/31 职场文书
天那边观后感
2015/06/09 职场文书
《最后一头战象》教学反思
2016/02/16 职场文书
Python sklearn分类决策树方法详解
2022/09/23 Python