Pytorch顯存管理
在模型訓練過程中,顯存的管理是需要注意的環(huán)節(jié),盡量用滿顯存在一定程度上可以縮短訓練時間,但過于貪心往往會遇到CUDA out of memory問題,鈔能力不足的情況下,可以嘗試一下手段來減少資源需求。
減少batch_size:這是最簡單有效的方法,減少一批讀取的數(shù)據(jù),從而減少顯存的使用量,但如果每個批次都需要重新讀取新的數(shù)據(jù)而不是固定死的,又沒辦法一次性讀取完數(shù)據(jù)集(比較少見這樣的需求,但我遇到了),就得嘗試其他的方法了。
勤使用torch.cuda.empty_cache():雖然python內(nèi)部也有資源管理機制,但有時候還是笨笨的,不能及時釋放資源,此時就需要我們調(diào)用該函數(shù)手動釋放。
減少線程使用num_workers:在dataloader中將會傳入該參數(shù),可以減少該參數(shù)值從而減少內(nèi)存使用。
使用混合精度:計算機中數(shù)據(jù)存儲的格式有許多種,此處舉個簡單例子如short int和int,之間就差距很大,pytorch中有torch.cuda.amp模塊可以來實現(xiàn)混合精度訓練,需要注意的是,該方法會存在精度損失,從而影響最終迭代結(jié)果,但因為一般情況下?lián)p失微乎其微,所以基本不會對結(jié)果產(chǎn)生影響,在這方面有需求的使用者慎重,下面是示例代碼:
最后如果以上方法都無法滿足,就需要從模型入手,深度可分離卷積是一個很好地降低模型參數(shù)的方法,當然優(yōu)化數(shù)據(jù)也是可以的,相信能做到這些的同學,也不需要我過多說明。
最后希望大家都有鈔能力能免受這種瑣碎之事的困擾。