弄清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代码(逐级优化)
May 25 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
Python 时间操作例子和时间格式化参数小结
Apr 24 Python
零基础写python爬虫之使用urllib2组件抓取网页内容
Nov 04 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
python中安装模块包版本冲突问题的解决
May 02 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
Python通用循环的构造方法实例分析
Dec 19 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
python小程序实现刷票功能详解
Jul 17 Python
python定义具名元组实例操作
Feb 28 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 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 遍历文件实现代码
2011/05/04 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
js 多浏览器分别判断代码
2010/04/01 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
JS获取地址栏参数的几种方法小结
2014/02/28 Javascript
javascript中函数作为参数调用的方法
2015/02/09 Javascript
js实现纯前端的图片预览
2016/04/27 Javascript
微信小程序 loading 详解及实例代码
2016/11/09 Javascript
JS 插件dropload下拉刷新、上拉加载使用小结
2017/04/13 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
vue.js实现点击图标放大离开时缩小的代码
2021/01/27 Vue.js
[04:10]2018年度CS GO玩家最喜爱的主播-完美盛典
2018/12/16 DOTA
使用python3.5仿微软记事本notepad
2016/06/15 Python
python+selenium 定位到元素,无法点击的解决方法
2019/01/30 Python
基于python实现查询ip地址来源
2020/06/02 Python
Python调用C语言程序方法解析
2020/07/07 Python
Python实现上下文管理器的方法
2020/08/07 Python
Django静态文件加载失败解决方案
2020/08/26 Python
python 求两个向量的顺时针夹角操作
2021/03/04 Python
毕业生幼师求职自荐信
2013/10/01 职场文书
实习生自荐信范文
2013/11/13 职场文书
银行实习的自我鉴定
2013/12/10 职场文书
小学运动会入场式解说词
2014/02/18 职场文书
商学院大学生求职的自我评价
2014/03/12 职场文书
医学专业毕业生推荐信
2014/07/12 职场文书
运动会加油稿20字
2014/11/15 职场文书
煤矿安全保证书
2015/02/27 职场文书
2015年秋季新学期寄语
2015/03/25 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
2016优秀班主任个人先进事迹材料
2016/02/26 职场文书
解决persistence.xml配置文件修改存放路径的问题
2022/02/24 Java/Android
SQLServer RANK() 排名函数的使用
2022/03/23 SQL Server
Java界面编程实现界面跳转
2022/06/16 Java/Android
SpringBoot Http远程调用的方法
2022/08/14 Java/Android