弄清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实现遍历windows所有窗口并输出窗口标题的方法
Mar 13 Python
python 如何快速找出两个电子表中数据的差异
May 26 Python
python获取多线程及子线程的返回值
Nov 15 Python
python shell根据ip获取主机名代码示例
Nov 25 Python
Python实现简单遗传算法(SGA)
Jan 29 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
python爬虫之模拟登陆csdn的实例代码
May 18 Python
kali中python版本的切换方法
Jul 11 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
PageFactory设计模式基于python实现
Apr 14 Python
scrapy在python爬虫中搭建出错的解决方法
Nov 22 Python
python实现图片转字符画的完整代码
Feb 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类
2006/10/09 PHP
PHP配置心得包含MYSQL5乱码解决
2006/11/20 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
浅析51个PHP处理字符串的函数
2013/08/02 PHP
PHP中echo和print的区别
2014/08/28 PHP
javascript 表格排序和表头浮动效果(扩展SortTable)
2009/04/07 Javascript
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
js验证是否为数字的总结
2013/04/14 Javascript
javascript的动态加载、缓存、更新以及复用(一)
2014/06/09 Javascript
深入理解JavaScript系列(37):设计模式之享元模式详解
2015/03/04 Javascript
JavaScript获取数组最小值和最大值的方法
2015/06/09 Javascript
JS动态添加iframe的代码
2015/09/14 Javascript
JS实现刷新父页面不弹出提示框的方法
2016/06/22 Javascript
JS给swf传参数的实现方法
2016/09/13 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
nodejs multer实现文件上传与下载
2017/05/10 NodeJs
Javascript将图片的绝对路径转换为base64编码的方法
2018/01/11 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
bootstrap-table实现表头固定以及列固定的方法示例
2019/03/07 Javascript
关于NodeJS中的循环引用详解
2019/07/23 NodeJs
js+canvas实现转盘效果(两个版本)
2020/09/13 Javascript
用Python给文本创立向量空间模型的教程
2015/04/23 Python
在Python的Django框架中调用方法和处理无效变量
2015/07/15 Python
Python3安装Pymongo详细步骤
2017/05/26 Python
python实现图片批量压缩程序
2018/07/23 Python
python实现证件照换底功能
2019/08/20 Python
python装饰器的特性原理详解
2019/12/25 Python
详解HTML5如何使用可选样式表为网站或应用添加黑暗模式
2020/04/07 HTML / CSS
联想印度官方网上商店:Lenovo India
2019/08/24 全球购物
团队精神演讲稿
2013/12/31 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
2015国庆节66周年标语
2015/07/30 职场文书
2016暑期社会实践心得体会范文
2016/01/14 职场文书
如何写好开幕词?
2019/06/24 职场文书