弄清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中如何正确使用正则表达式的详细模式(Verbose mode expression)
Nov 08 Python
Python装饰器用法示例小结
Feb 11 Python
用Python写脚本,实现完全备份和增量备份的示例
Apr 29 Python
Python单元和文档测试实例详解
Apr 11 Python
python查找重复图片并删除(图片去重)
Jul 16 Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 Python
python处理自动化任务之同时批量修改word里面的内容的方法
Aug 23 Python
Python有参函数使用代码实例
Jan 06 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
Python中Selenium库使用教程详解
Jul 23 Python
python 三种方法实现对Excel表格的读写
Nov 19 Python
Python操作CSV格式文件的方法大全
Jul 15 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/12/04 PHP
PHPMYADMIN导入数据最大为2M的解决方法
2012/04/23 PHP
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
ECshop 迁移到 PHP7版本时遇到的兼容性问题
2016/02/15 PHP
探究Laravel使用env函数读取环境变量为null的问题
2016/12/06 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
用js生产批量批处理执行命令
2008/07/28 Javascript
详解Javascript动态操作CSS
2014/12/08 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
JSONP和批量操作功能的实现方法
2016/08/21 Javascript
利用transition实现文字上下抖动的效果
2017/01/21 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
详解小程序缓存插件(mrc)
2018/08/17 Javascript
Vue中对拿到的数据进行A-Z排序的实例
2018/09/25 Javascript
浅谈Vue.js中如何实现自定义下拉菜单指令
2019/01/06 Javascript
详解Vue.js 作用域、slot用法(单个slot、具名slot)
2019/10/15 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
js和jquery判断数据类型的4种方法总结
2020/08/28 jQuery
Python实现模拟时钟代码推荐
2015/11/08 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
python实现批量解析邮件并下载附件
2018/06/19 Python
浅谈HTML5 Web Worker的使用
2018/01/05 HTML / CSS
Julep官网:美容产品和指甲油
2017/02/25 全球购物
美国最佳在线航班预订网站:LookupFare
2019/03/26 全球购物
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
英国在线定制百叶窗网站:Swift Direct Blinds
2020/02/25 全球购物
香港艺人陈冠希创办的潮流品牌:JUICESTORE
2021/03/04 全球购物
十岁生日家长答谢词
2014/01/17 职场文书
带薪年假请假条
2014/02/04 职场文书
调解协议书
2014/04/16 职场文书
政府采购方案
2014/06/12 职场文书
学雷锋志愿者活动总结
2014/06/27 职场文书
爱心捐款活动总结
2015/05/09 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
Django显示可视化图表的实践
2021/05/10 Python
基于Redis延迟队列的实现代码
2021/05/13 Redis