弄清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 28 Python
PyQt5每天必学之滑块控件QSlider
Apr 20 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
Aug 03 Python
python读取文件名并改名字的实例
Jan 07 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
python如何保证输入键入数字的方法
Aug 23 Python
python的faker库用法
Nov 28 Python
给 TensorFlow 变量进行赋值的方式
Feb 10 Python
使用pygame实现垃圾分类小游戏功能(已获校级二等奖)
Jul 23 Python
Python把图片转化为pdf代码实例
Jul 28 Python
Python趣味爬虫之用Python实现智慧校园一键评教
May 28 Python
Python OpenCV之常用滤波器使用详解
Apr 07 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
java EJB 加密与解密原理的一个例子
2008/01/11 PHP
PHP学习笔记之数组篇
2011/06/28 PHP
php数组中删除元素之重新索引的方法
2014/09/16 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
2016/01/28 PHP
Yii2基于Ajax自动获取表单数据的方法
2016/08/10 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
ThinkPHP 框架实现的读取excel导入数据库操作示例
2020/04/14 PHP
javascript中的array数组使用技巧
2010/01/31 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
新增加的内容是如何将div的scrollbar自动移动最下面
2014/01/02 Javascript
html文本框提示效果的示例代码
2014/06/28 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
jquery ajax 如何向jsp提交表单数据
2015/08/23 Javascript
Javascript类型系统之String字符串类型详解
2016/06/21 Javascript
AngularJS ng-bind 指令简单实现
2016/07/30 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
Vuejs第一篇之入门教程详解(单向绑定、双向绑定、列表渲染、响应函数)
2016/09/09 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
Angular2中select用法之设置默认值与事件详解
2017/05/07 Javascript
jQuery实现点击关注和取消功能
2017/07/03 jQuery
JavaScript适配器模式详解
2017/10/19 Javascript
了解ESlint和其相关操作小结
2018/05/21 Javascript
微信小程序tabbar底部导航
2018/11/05 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
Python中用函数作为返回值和实现闭包的教程
2015/04/27 Python
Python制作数据导入导出工具
2015/07/31 Python
详解python发送各类邮件的主要方法
2016/12/22 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
django 在原有表格添加或删除字段的实例
2018/05/27 Python
Python定时发送天气预报邮件代码实例
2019/09/09 Python
Python通过4种方式实现进程数据通信
2020/03/12 Python
给酒店员工的表扬信
2014/01/11 职场文书
国培教师自我鉴定
2014/02/12 职场文书
研究生考核个人自我鉴定
2014/03/27 职场文书
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
图神经网络GNN算法
2022/05/11 Python