詳解Pytorch顯存動(dòng)態(tài)分配規(guī)律探索
下面通過(guò)實(shí)驗(yàn)來(lái)探索Pytorch分配顯存的方式。
實(shí)驗(yàn)顯存到主存
我使用VSCode的jupyter來(lái)進(jìn)行實(shí)驗(yàn),首先只導(dǎo)入pytorch,代碼如下:
import torch
打開(kāi)任務(wù)管理器查看主存與顯存情況。情況分別如下:


在顯存中創(chuàng)建1GB的張量,賦值給a,代碼如下:
a = torch.zeros([256,1024,1024],device= 'cpu')
查看主存與顯存情況:


可以看到主存與顯存都變大了,而且顯存不止變大了1G,多出來(lái)的內(nèi)存是pytorch運(yùn)行所需的一些配置變量,我們這里忽略。
再次在顯存中創(chuàng)建一個(gè)1GB的張量,賦值給b,代碼如下:
b = torch.zeros([256,1024,1024],device= 'cpu')
查看主顯存情況:


這次主存大小沒(méi)變,顯存變高了1GB,這是合情合理的。然后我們將b移動(dòng)到主存中,代碼如下:
b = b.to('cpu')
查看主顯存情況:


發(fā)現(xiàn)主存是變高了1GB,顯存卻只變小了0.1GB,好像只是將顯存張量復(fù)制到主存一樣。實(shí)際上,pytorch的確是復(fù)制了一份張量到主存中,但它也對(duì)顯存中這個(gè)張量的移動(dòng)進(jìn)行了記錄。我們接著執(zhí)行以下代碼,再創(chuàng)建1GB的張量賦值給c:
c = torch.zeros([256,1024,1024],device= 'cuda')
查看主顯存情況:


發(fā)現(xiàn)只有顯存大小變大了0.1GB,這說(shuō)明,Pytorch的確記錄了顯存中張量的移動(dòng),只是沒(méi)有立即將顯存空間釋放,它選擇在下一次創(chuàng)建新變量時(shí)覆蓋這個(gè)位置。接下來(lái),我們重復(fù)執(zhí)行上面這行代碼:
c = torch.zeros([256,1024,1024],device= 'cuda')
主顯存情況如下:


明明我們把張量c給覆蓋了,顯存內(nèi)容卻變大了,這是為什么呢?實(shí)際上,Pytorch在執(zhí)行這句代碼時(shí),是首先找到可使用的顯存位置,創(chuàng)建這1GB的張量,然后再賦值給c。但因?yàn)樵谛聞?chuàng)建這個(gè)張量時(shí),原本的c依然占有1GB的顯存,pytorch只能先調(diào)取另外1GB顯存來(lái)創(chuàng)建這個(gè)張量,再將這個(gè)張量賦值給c。這樣一來(lái),原本的那個(gè)c所在的顯存內(nèi)容就空出來(lái)了,但和前面說(shuō)的一樣,pytorch并不會(huì)立即釋放這里的顯存,而等待下一次的覆蓋,所以顯存大小并沒(méi)有減小。
我們?cè)賱?chuàng)建1GB的d張量,就可以驗(yàn)證上面的猜想,代碼如下:
d = torch.zeros([256,1024,1024],device= 'cuda')
主顯存情況如下:


顯存大小并沒(méi)有變,就是因?yàn)閜ytorch將新的張量創(chuàng)建在了上一步c空出來(lái)的位置,然后再賦值給了d。另外,刪除變量操作也同樣不會(huì)立即釋放顯存:
del d
主顯存情況:


顯存沒(méi)有變化,同樣是等待下一次的覆蓋。
主存到顯存
接著上面的實(shí)驗(yàn),我們創(chuàng)建直接在主存創(chuàng)建1GB的張量并賦值給e,代碼如下:
e = torch.zeros([256,1024,1024],device= 'cpu')
主顯存情況如下:


主存變大1GB,合情合理。然后將e移動(dòng)到顯存,代碼如下:
e = e.to('cuda')
主顯存情況如下:


主存變小1GB,顯存沒(méi)變是因?yàn)樯厦鎻埩縟被刪除沒(méi)有被覆蓋,合情合理。說(shuō)明主存的釋放是立即執(zhí)行的。
總結(jié)
通過(guò)上面的實(shí)驗(yàn),我們了解到,pytorch不會(huì)立即釋放顯存中失效變量的內(nèi)存,它會(huì)以覆蓋的方式利用顯存中的可用空間。另外,如果要重置顯存中的某個(gè)規(guī)模較大的張量,最好先將它移動(dòng)到主存中,或是直接刪除,再創(chuàng)建新值,否則就需要兩倍的內(nèi)存來(lái)實(shí)現(xiàn)這個(gè)操作,就有可能出現(xiàn)顯存不夠用的情況。
實(shí)驗(yàn)代碼匯總?cè)缦拢?/p>
#%%
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')
到此這篇關(guān)于Pytorch顯存動(dòng)態(tài)分配規(guī)律探索的文章就介紹到這了,更多相關(guān)Pytorc顯存分配規(guī)律內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C語(yǔ)言?xún)?nèi)存的動(dòng)態(tài)分配比較malloc和realloc的區(qū)別
- 實(shí)例代碼分析c++動(dòng)態(tài)分配
- tensorflow指定GPU與動(dòng)態(tài)分配GPU memory設(shè)置
- python內(nèi)存動(dòng)態(tài)分配過(guò)程詳解
- 關(guān)于C++動(dòng)態(tài)分配內(nèi)存的介紹
- C#訪(fǎng)問(wèn)C++動(dòng)態(tài)分配的數(shù)組指針(實(shí)例講解)
- C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之動(dòng)態(tài)分配實(shí)現(xiàn)串
- C語(yǔ)言 動(dòng)態(tài)分配數(shù)組案例詳解
相關(guān)文章
python 處理數(shù)字,把大于上限的數(shù)字置零實(shí)現(xiàn)方法
今天小編就為大家分享一篇python 處理數(shù)字,把大于上限的數(shù)字置零實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
使用Python創(chuàng)建一個(gè)文件夾結(jié)構(gòu)生成器
這篇文章主要為大家詳細(xì)介紹了如何使用Python創(chuàng)建一個(gè)文件夾結(jié)構(gòu)生成器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
Python結(jié)合PyWebView庫(kù)打造跨平臺(tái)桌面應(yīng)用
隨著Web技術(shù)的發(fā)展,將HTML/CSS/JavaScript與Python結(jié)合構(gòu)建桌面應(yīng)用成為可能,本文將系統(tǒng)講解如何使用PyWebView庫(kù)實(shí)現(xiàn)這一創(chuàng)新方案,希望對(duì)大家有一定的幫助2025-04-04
從安裝到應(yīng)用全面掌握Python與OpenCV的配置與高級(jí)功能(最新推薦)
OpenCV的強(qiáng)大功能不僅限于基本的圖像處理,還可以擴(kuò)展到實(shí)時(shí)視頻分析、復(fù)雜的圖像拼接和特征匹配等應(yīng)用場(chǎng)景,這篇文章主要介紹了從安裝到應(yīng)用全面掌握Python與OpenCV的配置與高級(jí)功能,需要的朋友可以參考下2024-08-08
Python+Pygame實(shí)現(xiàn)彩色五子棋游戲
這篇文章主要為大家詳細(xì)介紹了如何溧陽(yáng)Python和Pygame實(shí)現(xiàn)彩色五子棋游戲,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02
解決pytorch rnn 變長(zhǎng)輸入序列的問(wèn)題
這篇文章主要介紹了解決pytorch rnn 變長(zhǎng)輸入序列的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-05-05
Python PyQt5學(xué)習(xí)之自定義信號(hào)
PyQ5已經(jīng)自動(dòng)定義了很多QT自建的信號(hào)。但是在實(shí)際的使用中為了靈活使用信號(hào)與槽機(jī)制,可以根據(jù)需要自定義信號(hào)。本文就將為大家詳細(xì)講講PyQt5自定義信號(hào),感興趣的可以了解一下2022-03-03
Python實(shí)現(xiàn)敲擊木魚(yú)積累功德小項(xiàng)目
最近大家都很流行用手機(jī)敲擊電子木魚(yú)積累功德,這在很多短視頻中也常常見(jiàn)到。本文將用Python實(shí)現(xiàn)這一效果,感興趣的小伙伴可以了解一下2022-11-11
Python Web程序部署到Ubuntu服務(wù)器上的方法
在本文記錄了我在Ubuntu中部署Flask Web站點(diǎn)的過(guò)程, 其中包括用戶(hù)創(chuàng)建、代碼獲取、Python3環(huán)境的安裝、虛擬環(huán)境設(shè)置、uWSGI啟動(dòng)程序設(shè)置,并將Nginx作為前端反向代理,需要的朋友參考下吧2018-02-02

