详解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操作时间和日期之asctime()方法的使用
May 22 Python
Python实现简单截取中文字符串的方法
Jun 15 Python
利用python程序生成word和PDF文档的方法
Feb 14 Python
Python Socket实现简单TCP Server/client功能示例
Aug 05 Python
python中使用PIL制作并验证图片验证码
Mar 15 Python
python 计算一个字符串中所有数字的和实例
Jun 11 Python
python SQLAlchemy 中的Engine详解
Jul 04 Python
Python 实现try重新执行
Dec 21 Python
Python爬虫:Request Payload和Form Data的简单区别说明
Apr 30 Python
python文件读取失败怎么处理
Jun 23 Python
基于Django集成CAS实现流程详解
Nov 28 Python
Python探索生命起源 matplotlib细胞自动机动画演示
Apr 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
用PHP调用数据库的存贮过程
2006/10/09 PHP
php检测图片木马多进制编程实践
2013/04/11 PHP
PHP实现下载断点续传的方法
2014/11/12 PHP
Laravel实现用户注册和登录
2015/01/23 PHP
Laravel 5框架学习之数据库迁移(Migrations)
2015/04/08 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
简单实现php上传文件功能
2017/09/21 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
2020/02/18 PHP
PJ Blog修改-禁止复制的代码和方法
2006/10/25 Javascript
Jquery $.getJSON 在IE下的缓存问题解决方法
2014/10/10 Javascript
利用jquery如何从json中读取数据追加到html中
2017/12/01 jQuery
微信小程使用swiper组件实现图片轮播切换显示功能【附源码下载】
2017/12/12 Javascript
vue-cli与webpack处理静态资源的方法及webpack打包的坑
2018/05/15 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
DataFrame 将某列数据转为数组的方法
2018/04/13 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
Python3爬楼梯算法示例
2019/03/04 Python
python利用7z批量解压rar的实现
2019/08/07 Python
Tensorflow 定义变量,函数,数值计算等名字的更新方式
2020/02/10 Python
python中使用paramiko模块并实现远程连接服务器执行上传下载功能
2020/02/29 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
在Python3.74+PyCharm2020.1 x64中安装使用Kivy的详细教程
2020/08/07 Python
Lancer Skincare官方网站:抗衰老皮肤护理
2020/11/20 全球购物
Tomcat的缺省是多少,怎么修改
2014/04/09 面试题
二年级班级文化建设方案
2014/05/10 职场文书
日语专业毕业生自荐书
2014/06/18 职场文书
教育系统干部作风整顿心得体会
2014/09/09 职场文书
个人股份合作协议书
2014/10/24 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
2016自主招生教师推荐信范文
2015/03/23 职场文书
详解Vue的options
2021/05/15 Vue.js
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL