問題
RuntimeError: [enforce fail at ..\c10\core\CPUAllocator.cpp:76] data. DefaultCPUAllocator: not enough memory: you tried to allocate 1105920 bytes.
今天在使用自己電腦跑YOLOV7的時(shí)候,因?yàn)樽约簺]有GPU所以使用CPU來跑測(cè)試模型,使用CPU來進(jìn)行一張獨(dú)立的圖像進(jìn)行預(yù)測(cè),跑一張圖像完全沒有問題,非常的nice?。。〉?,但是我接下來進(jìn)行一段視頻(多張圖像)的預(yù)測(cè),他給我說內(nèi)存分配不足,
DefaultCPUAllocator: not enough memory: you tried to allocate 1105920 bytes.
,
而且它這個(gè)不是在跑第二張圖像的是后出現(xiàn)的,是在計(jì)算第17張圖像時(shí)出現(xiàn),后面多次內(nèi)存釋放都不行~~~~~~~~
分析
在pytorch中,tensor有一個(gè)requires_grad參數(shù),如果設(shè)置為True,則反向傳播時(shí),該tensor就會(huì)自動(dòng)求導(dǎo)。tensor的requires_grad的屬性默認(rèn)為False,若一個(gè)節(jié)點(diǎn)(葉子變量:自己創(chuàng)建的tensor)requires_grad被設(shè)置為True,那么所有依賴它的節(jié)點(diǎn)requires_grad都為True(即使其他相依賴的tensor的requires_grad = False)
注
:
requires_grad是Pytorch中通用數(shù)據(jù)結(jié)構(gòu)Tensor的一個(gè)屬性,用于說明當(dāng)前量是否需要在計(jì)算中保留對(duì)應(yīng)的梯度信息,以線性回歸為例,容易知道權(quán)重w和偏差b為需要訓(xùn)練的對(duì)象,為了得到最合適的參數(shù)值,我們需要設(shè)置一個(gè)相關(guān)的損失函數(shù),根據(jù)梯度回傳的思路進(jìn)行訓(xùn)練。
當(dāng)requires_grad設(shè)置為False時(shí),反向傳播時(shí)就不會(huì)自動(dòng)求導(dǎo)了,因此大大節(jié)約了顯存或者說內(nèi)存。
那么本問題的解決方法也就隨之而來, 在測(cè)試的時(shí)候讓模型不要記錄梯度就好, 因?yàn)槠鋵?shí)也用不到。
解決方法
使用 with torch.no_grad(),在測(cè)試的時(shí)候讓模型不要保存梯度:
with torch.no_grad():
output, _ = model(image) # 在圖像計(jì)算前加入
這樣在模型對(duì)每張圖像進(jìn)行計(jì)算的時(shí)候,不會(huì)再去求導(dǎo),梯度不會(huì)保存!
完美解決!文章來源:http://www.zghlxwxcb.cn/news/detail-412293.html
希望這篇文章對(duì)你有用!
謝謝點(diǎn)贊評(píng)論!文章來源地址http://www.zghlxwxcb.cn/news/detail-412293.html
到了這里,關(guān)于RuntimeError: DefaultCPUAllocator: not enough memory: you tried to allocate 1105920 bytes.的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!