Bug:RuntimeError: CUDA out of memory. Tried to allocate ... MiB
解決方法:
法一:
調(diào)小batch_size厂榛,設(shè)到4基本上能解決問題娶耍,如果還不行,該方法pass。
法二:
在報錯處茅特、代碼關(guān)鍵節(jié)點(一個epoch跑完...)插入以下代碼(目的是定時清內(nèi)存):
import torch, gc
gc.collect()
torch.cuda.empty_cache()
法三(常用方法):
在測試階段和驗證階段前插入代碼 with torch.no_grad()(目的是該段程序不計算參數(shù)梯度)哆料,如下:
def test(model,dataloader):
model.eval()
with torch.no_grad(): ###插在此處
for batch in tqdm(dataloader):
……
法四(使用的別人的代碼時):
如果怎么修改,都會出現(xiàn)題中bug,甚至跑了幾輪之后突然出現(xiàn) cuda out of
memory材部,查看代碼中是否存在一下代碼(通常出現(xiàn)在main.py 或者數(shù)據(jù)加載的py文件中:
kwargs = {'num_workers': 6, 'pin_memory': True} if torch.cuda.is_available() else {}
將"pin_memory": True改為False毫缆,具體原因原博:
pin_memory就是鎖頁內(nèi)存,創(chuàng)建DataLoader時乐导,設(shè)置pin_memory=True苦丁,則意味著生成的Tensor數(shù)據(jù)最開始是屬于內(nèi)存中的鎖頁內(nèi)存,這樣將內(nèi)存的Tensor轉(zhuǎn)義到GPU的顯存就會更快一些物臂。
主機中的內(nèi)存旺拉,有兩種存在方式,一是鎖頁棵磷,二是不鎖頁蛾狗,鎖頁內(nèi)存存放的內(nèi)容在任何情況下都不會與主機的虛擬內(nèi)存進行交換(注:虛擬內(nèi)存就是硬盤),而不鎖頁內(nèi)存在主機內(nèi)存不足時仪媒,數(shù)據(jù)會存放在虛擬內(nèi)存中沉桌。顯卡中的顯存全部是鎖頁內(nèi)存,當(dāng)計算機的內(nèi)存充足的時候,可以設(shè)置pin_memory=True算吩。當(dāng)系統(tǒng)卡住蒲牧,或者交換內(nèi)存使用過多的時候,設(shè)置pin_memory=False赌莺。因為pin_memory與電腦硬件性能有關(guān)冰抢,pytorch開發(fā)者不能確保每一個煉丹玩家都有高端設(shè)備,因此pin_memory默認(rèn)為False艘狭。