详解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 相关文章推荐
零基础写python爬虫之抓取糗事百科代码分享
Nov 06 Python
Python实现登录人人网并抓取新鲜事的方法
May 11 Python
python正则表达式之对号入座篇
Jul 24 Python
Tensorflow实现酸奶销量预测分析
Jul 19 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
Django实现图片上传功能步骤解析
Apr 22 Python
python ETL工具 pyetl
Jun 07 Python
Selenium webdriver添加cookie实现过程详解
Aug 12 Python
利用Python实现Json序列化库的方法步骤
Sep 09 Python
python 模拟登陆163邮箱
Dec 15 Python
python中操作文件的模块的方法总结
Feb 04 Python
教你怎么用Python生成九宫格照片
May 20 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
phpadmin如何导入导出大数据文件及php.ini参数修改
2013/02/18 PHP
推荐一款PHP+jQuery制作的列表分页的功能模块
2014/10/14 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
PHP实现简易用户登录系统
2020/07/10 PHP
jquery miniui 教程 表格控件 合并单元格应用
2012/11/25 Javascript
JavaScript中valueOf函数与toString方法深入理解
2012/12/02 Javascript
Ext GridPanel加载完数据后进行操作示例代码
2014/06/17 Javascript
jQuery选择器源码解读(二):select方法
2015/03/31 Javascript
jquery代码实现多选、不同分享功能
2015/07/31 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
js仿拉勾网首页穿墙广告效果
2017/03/08 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
JS写XSS cookie stealer来窃取密码的步骤详解
2017/11/20 Javascript
javascript实现小型区块链功能
2019/04/03 Javascript
JavaScript多种页面刷新方法小结
2019/04/04 Javascript
js 实现watch监听数据变化的代码
2019/10/13 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
解决vue的touchStart事件及click事件冲突问题
2020/07/21 Javascript
Python多进程同步Lock、Semaphore、Event实例
2014/11/21 Python
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Python实现的读写json文件功能示例
2018/06/05 Python
python退出循环的方法
2020/06/18 Python
python中append函数用法讲解
2020/12/11 Python
HTML5之SVG 2D入门3—文本与图像及渲染文本介绍
2013/01/30 HTML / CSS
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
FOREO斐珞尔官方旗舰店:LUNA露娜洁面仪
2018/03/11 全球购物
万户网络JAVA程序员岗位招聘笔试试卷
2013/01/08 面试题
php优化查询foreach代码实例讲解
2021/03/24 PHP
HR喜欢的自荐信格式
2013/10/08 职场文书
一封普通求职者的求职信
2013/11/20 职场文书
一名老师的自我评价
2014/02/07 职场文书
年度考核登记表个人总结
2015/03/06 职场文书
2015年超市工作总结
2015/04/09 职场文书
学校捐书活动总结
2015/05/08 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
交通处罚决定书
2015/06/24 职场文书