详解Pytorch显存动态分配规律探索


Posted in Python onNovember 17, 2020

下面通过实验来探索Pytorch分配显存的方式。

实验显存到主存

我使用VSCode的jupyter来进行实验,首先只导入pytorch,代码如下:

import torch

打开任务管理器查看主存与显存情况。情况分别如下:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

在显存中创建1GB的张量,赋值给a,代码如下:

a = torch.zeros([256,1024,1024],device= 'cpu')

查看主存与显存情况:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

可以看到主存与显存都变大了,而且显存不止变大了1G,多出来的内存是pytorch运行所需的一些配置变量,我们这里忽略。

再次在显存中创建一个1GB的张量,赋值给b,代码如下:

b = torch.zeros([256,1024,1024],device= 'cpu')

查看主显存情况:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

这次主存大小没变,显存变高了1GB,这是合情合理的。然后我们将b移动到主存中,代码如下:

b = b.to('cpu') 

查看主显存情况:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

发现主存是变高了1GB,显存却只变小了0.1GB,好像只是将显存张量复制到主存一样。实际上,pytorch的确是复制了一份张量到主存中,但它也对显存中这个张量的移动进行了记录。我们接着执行以下代码,再创建1GB的张量赋值给c:

c = torch.zeros([256,1024,1024],device= 'cuda')

查看主显存情况:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

发现只有显存大小变大了0.1GB,这说明,Pytorch的确记录了显存中张量的移动,只是没有立即将显存空间释放,它选择在下一次创建新变量时覆盖这个位置。接下来,我们重复执行上面这行代码:

c = torch.zeros([256,1024,1024],device= 'cuda') 

主显存情况如下:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

明明我们把张量c给覆盖了,显存内容却变大了,这是为什么呢?实际上,Pytorch在执行这句代码时,是首先找到可使用的显存位置,创建这1GB的张量,然后再赋值给c。但因为在新创建这个张量时,原本的c依然占有1GB的显存,pytorch只能先调取另外1GB显存来创建这个张量,再将这个张量赋值给c。这样一来,原本的那个c所在的显存内容就空出来了,但和前面说的一样,pytorch并不会立即释放这里的显存,而等待下一次的覆盖,所以显存大小并没有减小。

我们再创建1GB的d张量,就可以验证上面的猜想,代码如下:

d = torch.zeros([256,1024,1024],device= 'cuda') 

主显存情况如下:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

显存大小并没有变,就是因为pytorch将新的张量创建在了上一步c空出来的位置,然后再赋值给了d。另外,删除变量操作也同样不会立即释放显存:

del d

主显存情况:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

显存没有变化,同样是等待下一次的覆盖。

主存到显存

接着上面的实验,我们创建直接在主存创建1GB的张量并赋值给e,代码如下:

e = torch.zeros([256,1024,1024],device= 'cpu')

主显存情况如下:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

主存变大1GB,合情合理。然后将e移动到显存,代码如下:

e = e.to('cuda')

主显存情况如下:

详解Pytorch显存动态分配规律探索

详解Pytorch显存动态分配规律探索

主存变小1GB,显存没变是因为上面张量d被删除没有被覆盖,合情合理。说明主存的释放是立即执行的。

总结

通过上面的实验,我们了解到,pytorch不会立即释放显存中失效变量的内存,它会以覆盖的方式利用显存中的可用空间。另外,如果要重置显存中的某个规模较大的张量,最好先将它移动到主存中,或是直接删除,再创建新值,否则就需要两倍的内存来实现这个操作,就有可能出现显存不够用的情况。

实验代码汇总如下:

#%% 
import torch
#%%
a = torch.zeros([256,1024,1024],device= 'cuda') 
#%%
b = torch.zeros([256,1024,1024],device= 'cuda') 
#%%
b = b.to('cpu')
#%%
c = torch.zeros([256,1024,1024],device= 'cuda') 
#%%
c = torch.zeros([256,1024,1024],device= 'cuda') 
#%% 
d = torch.zeros([256,1024,1024],device= 'cuda') 
#%%
del d 
#%% 
e = torch.zeros([256,1024,1024],device= 'cpu') 
#%%
e = e.to('cuda')

到此这篇关于Pytorch显存动态分配规律探索的文章就介绍到这了,更多相关Pytorc显存分配规律内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Ubuntu下安装PyV8
Mar 13 Python
python 性能优化方法小结
Mar 31 Python
python针对excel的操作技巧
Mar 13 Python
numpy.std() 计算矩阵标准差的方法
Jul 11 Python
Python日期时间模块datetime详解与Python 日期时间的比较,计算实例代码
Sep 14 Python
在Python中构建增广矩阵的实现方法
Jul 01 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
解决numpy矩阵相减出现的负值自动转正值的问题
Jun 03 Python
Python读取Excel数据并生成图表过程解析
Jun 18 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
用python批量下载apk
Dec 29 Python
Python-OpenCV教程之图像的位运算详解
Jun 21 Python
Python调用ffmpeg开源视频处理库,批量处理视频
Nov 16 #Python
python tkinter实现连连看游戏
Nov 16 #Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 #Python
Python 删除List元素的三种方法remove、pop、del
Nov 16 #Python
python 从list中随机取值的方法
Nov 16 #Python
python实现在列表中查找某个元素的下标示例
Nov 16 #Python
python如何获得list或numpy数组中最大元素对应的索引
Nov 16 #Python
You might like
实例(Smarty+FCKeditor新闻系统)
2007/01/02 PHP
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
解析htaccess伪静态的规则
2013/06/18 PHP
php判断邮箱地址是否存在的方法
2016/02/13 PHP
Zend Framework实现留言本分页功能(附demo源码下载)
2016/03/22 PHP
php解决约瑟夫环算法实例分析
2019/09/30 PHP
laravel 实现登陆后返回登陆前的页面方法
2019/10/03 PHP
php实现简单四则运算器
2020/11/29 PHP
获取焦点时,利用js定时器设定时间执行动作
2010/04/02 Javascript
查看源码的工具 学习jQuery源码不错的工具
2011/12/26 Javascript
分享10个优化代码的CSS和JavaScript工具
2016/05/11 Javascript
JavaScript 链式结构序列化详解
2016/09/30 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
vue element-ui之怎么封装一个自己的组件的详解
2019/05/20 Javascript
p5.js临摹动态图形的方法
2019/10/23 Javascript
js实现贪吃蛇游戏 canvas绘制地图
2020/09/09 Javascript
[04:07]显微镜下的DOTA2第八期——英雄复活动作
2014/06/24 DOTA
[02:22:36]《加油!DOTA》总决赛
2014/09/19 DOTA
Python将xml和xsl转换为html的方法
2015/03/10 Python
基于Python如何使用AIML搭建聊天机器人
2016/01/27 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
Python django搭建layui提交表单,表格,图标的实例
2019/11/18 Python
解决python图像处理图像赋值后变为白色的问题
2020/06/04 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
Python如何使用27行代码绘制星星图
2020/07/20 Python
python 生成器需注意的小问题
2020/09/29 Python
用canvas做一个DVD待机动画的实现代码
2019/04/12 HTML / CSS
美国购买新书和二手书网站:Better World Books
2018/10/31 全球购物
安全生产演讲稿
2014/05/09 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
承诺保证书格式
2015/02/28 职场文书
小学生读书笔记
2015/07/01 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
GPU服务器的多用户配置方法
2022/07/07 Servers