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

 更新时间:2020年11月17日 08:27:31   作者:华小电  
这篇文章主要介绍了Pytorch显存动态分配规律探索,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

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

实验显存到主存

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

import torch

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

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

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

  查看主存与显存情况:

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

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

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

  查看主显存情况:

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

b = b.to('cpu') 

  查看主显存情况:

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

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

  查看主显存情况:

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

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

  主显存情况如下:

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

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

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

  主显存情况如下:

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

del d

  主显存情况:

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

主存到显存

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

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

  主显存情况如下:

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

e = e.to('cuda')

  主显存情况如下:

  主存变小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 处理数字,把大于上限的数字置零实现方法

    今天小编就为大家分享一篇python 处理数字,把大于上限的数字置零实现方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • 使用Python创建一个文件夹结构生成器

    使用Python创建一个文件夹结构生成器

    这篇文章主要为大家详细介绍了如何使用Python创建一个文件夹结构生成器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01
  • Python结合PyWebView库打造跨平台桌面应用

    Python结合PyWebView库打造跨平台桌面应用

    随着Web技术的发展,将HTML/CSS/JavaScript与Python结合构建桌面应用成为可能,本文将系统讲解如何使用PyWebView库实现这一创新方案,希望对大家有一定的帮助
    2025-04-04
  • 从安装到应用全面掌握Python与OpenCV的配置与高级功能(最新推荐)

    从安装到应用全面掌握Python与OpenCV的配置与高级功能(最新推荐)

    OpenCV的强大功能不仅限于基本的图像处理,还可以扩展到实时视频分析、复杂的图像拼接和特征匹配等应用场景,这篇文章主要介绍了从安装到应用全面掌握Python与OpenCV的配置与高级功能,需要的朋友可以参考下
    2024-08-08
  • Python中反射和描述器总结

    Python中反射和描述器总结

    这篇文章主要介绍了Python中的反射和描述器一些知识的汇总,非常的详细,有需要的小伙伴可以参考下
    2018-09-09
  • Python+Pygame实现彩色五子棋游戏

    Python+Pygame实现彩色五子棋游戏

    这篇文章主要为大家详细介绍了如何溧阳Python和Pygame实现彩色五子棋游戏,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-02-02
  • 解决pytorch rnn 变长输入序列的问题

    解决pytorch rnn 变长输入序列的问题

    这篇文章主要介绍了解决pytorch rnn 变长输入序列的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • Python PyQt5学习之自定义信号

    Python PyQt5学习之自定义信号

    PyQ5已经自动定义了很多QT自建的信号。但是在实际的使用中为了灵活使用信号与槽机制,可以根据需要自定义信号。本文就将为大家详细讲讲PyQt5自定义信号,感兴趣的可以了解一下
    2022-03-03
  • Python实现敲击木鱼积累功德小项目

    Python实现敲击木鱼积累功德小项目

    最近大家都很流行用手机敲击电子木鱼积累功德,这在很多短视频中也常常见到。本文将用Python实现这一效果,感兴趣的小伙伴可以了解一下
    2022-11-11
  • Python Web程序部署到Ubuntu服务器上的方法

    Python Web程序部署到Ubuntu服务器上的方法

    在本文记录了我在Ubuntu中部署Flask Web站点的过程, 其中包括用户创建、代码获取、Python3环境的安装、虚拟环境设置、uWSGI启动程序设置,并将Nginx作为前端反向代理,需要的朋友参考下吧
    2018-02-02

最新评论