弄清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 24 Python
Python中集合类型(set)学习小结
Jan 28 Python
简单谈谈Python的pycurl模块
Apr 07 Python
Django实战之用户认证(用户登录与注销)
Jul 16 Python
Python WSGI的深入理解
Aug 01 Python
在python里面运用多继承方法详解
Jul 01 Python
10行Python代码计算汽车数量的实现方法
Oct 23 Python
django实现模型字段动态choice的操作
Apr 01 Python
Python可以实现栈的结构吗
May 27 Python
如何在Windows中安装多个python解释器
Jun 16 Python
聊聊python在linux下与windows下导入模块的区别说明
Mar 03 Python
Python turtle编写简单的球类小游戏
Mar 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的正则处理函数总结分析
2008/06/20 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
php打开文件fopen函数的使用说明
2013/07/05 PHP
跟我学Laravel之请求与输入
2014/10/15 PHP
javascript实现的listview效果
2007/04/28 Javascript
javascript中基本类型和引用类型的区别分析
2015/05/12 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
js中unicode转码方法详解
2015/10/09 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
Json对象和字符串互相转换json数据拼接和JSON使用方式详细介绍(小结)
2016/10/25 Javascript
详解ES6中的let命令
2020/04/05 Javascript
JS计算距当前时间的时间差实例
2017/12/29 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
[11:42]2018DOTA2国际邀请赛寻真——OG卷土重来
2018/08/17 DOTA
python实现同时给多个变量赋值的方法
2015/04/30 Python
在Python中用keys()方法返回字典键的教程
2015/05/21 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
解决Pytorch 加载训练好的模型 遇到的error问题
2020/01/10 Python
tensorflow 实现自定义梯度反向传播代码
2020/02/10 Python
Python文件时间操作步骤代码详解
2020/04/13 Python
基于python连接oracle导并出数据文件
2020/04/28 Python
Python尾递归优化实现代码及原理详解
2020/10/09 Python
调用HTML5的Canvas API绘制图形的快速入门指南
2016/06/17 HTML / CSS
酒店工作职员求职简历的自我评价
2013/10/23 职场文书
管理科学大学生求职信
2013/11/13 职场文书
数学与统计学院学生个人职业生涯规划书
2014/02/10 职场文书
公交公司毕业生求职信
2014/02/15 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
商家认证委托书格式
2014/10/16 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
工作经历证明范本
2015/06/15 职场文书
科级干部培训心得体会
2016/01/06 职场文书
党员公开承诺书(2016最新版)
2016/03/24 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript