弄清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文件夹与文件的操作实现代码
Jul 13 Python
Python选择排序、冒泡排序、合并排序代码实例
Apr 10 Python
Python编程中实现迭代器的一些技巧小结
Jun 21 Python
python爬取NUS-WIDE数据库图片
Oct 05 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
Python运算符重载详解及实例代码
Mar 07 Python
Python3 加密(hashlib和hmac)模块的实现
Nov 23 Python
Python系统监控模块psutil功能与经典用法分析
May 24 Python
对Python w和w+权限的区别详解
Jan 23 Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 Python
python 实现百度网盘非会员上传超过500个文件的方法
Jan 07 Python
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
May 31 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 define函数的使用说明
2008/08/27 PHP
php 字符串中的\n换行符无效、不能换行的解决方法
2014/04/02 PHP
PHP中比较时间大小实例
2014/08/21 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
javascript 动态table添加colspan\rowspan 参数的方法
2009/07/25 Javascript
js判断鼠标同时离开两个div的思路及代码
2013/05/31 Javascript
深入解析JavaScript中的变量作用域
2013/12/06 Javascript
jquery中获得元素尺寸和坐标的方法整理
2014/05/18 Javascript
jquery 取子节点及当前节点属性值的方法
2014/08/24 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
Javascript学习之谈谈JS的全局变量跟局部变量(推荐)
2016/08/28 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
javascript 内置对象及常见API详细介绍
2016/11/01 Javascript
无法获取隐藏元素宽度和高度的解决方案
2017/03/07 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
详解基于Node.js的微信JS-SDK后端接口实现代码
2017/07/15 Javascript
微信小程序template模板实例详解
2017/10/27 Javascript
微信小程序实现图片上传放大预览删除代码
2020/06/28 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
vue获取data数据改变前后的值方法
2019/11/07 Javascript
[01:00:30]TFT vs VGJ.T Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python过滤函数filter()使用自定义函数过滤序列实例
2014/08/26 Python
python基础教程之对象和类的实际运用
2014/08/29 Python
Linux下python制作名片示例
2018/07/20 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
python 实现敏感词过滤的方法
2019/01/21 Python
html5 Web SQL Database 之事务处理函数transaction与executeSQL解析
2013/11/07 HTML / CSS
德购商城:德国进口直邮商城
2017/06/13 全球购物
解释一下钝化(Swap out)
2016/12/26 面试题
行政文员岗位职责
2013/11/08 职场文书
幼儿教师小班个人总结
2015/02/05 职场文书
幼师大班个人总结
2015/02/13 职场文书
英语投诉信范文
2015/07/03 职场文书
如何写好一份优秀的工作总结?
2019/06/21 职场文书