弄清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 相关文章推荐
利用Psyco提升Python运行速度
Dec 24 Python
Python的另外几种语言实现
Jan 29 Python
如何在python字符串中输入纯粹的{}
Aug 22 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 Python
Python实现图像的垂直投影示例
Jan 17 Python
Python networkx包的实现
Feb 14 Python
Python作用域与名字空间原理详解
Mar 21 Python
keras 回调函数Callbacks 断点ModelCheckpoint教程
Jun 18 Python
python把一个字符串切开的实例方法
Sep 27 Python
Python离线安装openpyxl模块的步骤
Mar 30 Python
python字典的元素访问实例详解
Jul 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
福利彩票幸运号码自动生成器
2006/10/09 PHP
php feof用来识别文件末尾字符的方法
2010/08/01 PHP
测试PHP连接MYSQL成功与否的代码
2013/08/16 PHP
PHP的构造方法,析构方法和this关键字详细介绍
2013/10/22 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
如何在Laravel5.8中正确地应用Repository设计模式
2019/11/26 PHP
ajaxControlToolkit AutoCompleteExtender的用法
2008/10/30 Javascript
javascript一些实用技巧小结
2011/03/18 Javascript
javascript针对DOM的应用分析(二)
2012/04/15 Javascript
iframe异步加载实现点击左边菜单加载右边内容实例讲解
2013/03/04 Javascript
P3P Header解决Cookie跨域的问题
2013/03/12 Javascript
js改变img标签的src属性在IE下没反应的解决方法
2013/07/23 Javascript
js生成验证码并直接在前端判断
2015/05/15 Javascript
jquery调整表格行tr上下顺序实例讲解
2016/01/09 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
2016/06/12 Javascript
jQuery实现三级联动效果
2017/03/02 Javascript
Node.js 8 中的 util.promisify的详解
2017/06/12 Javascript
详解layui中的树形关于取值传值问题
2018/01/16 Javascript
JavaScript实现的九种排序算法
2019/03/04 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
JavaScript动画实例之粒子文本的实现方法详解
2020/07/28 Javascript
详解Swift中属性的声明与作用
2016/06/30 Python
python常见的格式化输出小结
2016/12/15 Python
Python入门之后再看点什么好?
2018/03/05 Python
记录Python脚本的运行日志的方法
2019/06/05 Python
elasticsearch python 查询的两种方法
2019/08/04 Python
python用requests实现http请求代码实例
2019/10/31 Python
Python常用模块os.path之文件及路径操作方法
2019/12/03 Python
python的Jenkins接口调用方式
2020/05/12 Python
python中xlutils库用法浅析
2020/12/29 Python
大学生标准推荐信范文
2013/11/25 职场文书
阅兵口号
2014/06/19 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
小学端午节活动总结
2015/02/11 职场文书
医学生自荐信范文
2015/03/05 职场文书
Python中Cookies导出某站用户数据的方法
2021/05/17 Python