详解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 相关文章推荐
pycharm 使用心得(九)解决No Python interpreter selected的问题
Jun 06 Python
举例讲解Python中的身份运算符的使用方法
Oct 13 Python
python基础之入门必看操作
Jul 26 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
tensorflow实现简单的卷积网络
May 24 Python
Python爬虫常用库的安装及其环境配置
Sep 19 Python
正确理解Python中if __name__ == '__main__'
Jan 24 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
用Python抢火车票的简单小程序实现解析
Aug 14 Python
基于Python实现拆分和合并GIF动态图
Oct 22 Python
Python urllib.request对象案例解析
May 11 Python
python3处理word文档实例分析
Dec 01 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
PHP环境搭建最新方法
2006/09/05 PHP
初品cakephp 入门基础
2012/02/16 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
JavaScript继承基础讲解(原型链、借用构造函数、混合模式、原型式继承、寄生式继承、寄生组合式继承)
2014/08/16 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
JS函数的定义与调用方法推荐
2016/05/12 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
多种方式实现js图片预览
2016/12/12 Javascript
JavaScript定义全局对象的方法示例
2017/01/12 Javascript
微信小程序实现的日期午别医生排班表功能示例
2019/01/09 Javascript
vue添加class样式实例讲解
2019/02/12 Javascript
JavaScript高阶教程之“==”隐藏下的类型转换
2019/04/11 Javascript
借助云开发实现小程序短信验证码的发送
2020/01/06 Javascript
JavaScript枚举选择jquery插件代码实例
2020/11/17 jQuery
Python中subprocess模块用法实例详解
2015/05/20 Python
Python中利用aiohttp制作异步爬虫及简单应用
2018/11/29 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
在python中对变量判断是否为None的三种方法总结
2019/01/23 Python
python 内置函数汇总详解
2019/09/16 Python
Python使用random模块生成随机数操作实例详解
2019/09/17 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
2019/10/04 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
80年代复古T恤:TruffleShuffle
2018/07/02 全球购物
俄罗斯EPL钻石珠宝店:ЭПЛ
2019/10/22 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
物流专业大学生的自我鉴定
2013/11/13 职场文书
室内设计专业学生的自我评价分享
2013/11/27 职场文书
给老婆的检讨书1000字
2015/01/01 职场文书
投资意向协议书
2015/01/29 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
士兵突击观后感
2015/06/16 职场文书
干部培训简讯
2015/07/20 职场文书
一文简单了解MySQL前缀索引
2022/04/03 MySQL