點擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時間送達(dá)

Pytorch有什么節(jié)省內(nèi)存(顯存)的小技巧?
在用pytorch實現(xiàn)一個tensorflow project的時候遇到了GPU顯存超出 (out of memory) 的問題,不知道有什么優(yōu)化方法。
https://www.zhihu.com/question/274635237/answer/755102181咦,大家都沒看過陳天奇的 Training Deep Nets with Sublinear Memory Cost (https://arxiv.org/abs/1604.06174)嗎?訓(xùn)練 CNN 時,Memory 主要的開銷來自于儲存用于計算 backward 的 activation,一般的 workflow 是這樣的?對于一個長度為 N 的 CNN,需要 O(N) 的內(nèi)存。這篇論文給出了一個思路,每隔 sqrt(N) 個 node 存一個 activation,中需要的時候再算,這樣顯存就從 O(N) 降到了 O(sqrt(N))。對于越深的模型,這個方法省的顯存就越多,且速度不會明顯變慢。PyTorch 我實現(xiàn)了一版,有興趣的同學(xué)可以來試試?https://github.com/Lyken17/pytorch-memongerhttps://www.zhihu.com/question/274635237/answer/573633662在不修改網(wǎng)絡(luò)結(jié)構(gòu)的情況下, 有如下操作:1. 同意?@Jiaming,?盡可能使用inplace操作, 比如relu 可以使用 inplace=True 。一個簡單的使用方法,如下:def inplace_relu(m): classname = m.__class__.__name__ if classname.find('ReLU') != -1: m.inplace=True
model.apply(inplace_relu)
2. 進(jìn)一步,比如ResNet 和 DenseNet 可以將 batchnorm 和relu打包成inplace,在bp時再重新計算。使用到了pytorch新的checkpoint特性,有以下兩個代碼。由于需要重新計算bn后的結(jié)果,所以會慢一些。3. 每次循環(huán)結(jié)束時 刪除 loss,可以節(jié)約很少顯存,但聊勝于無??梢娙缦耰ssue:Tensor to Variable and memory freeing best practices:https://discuss.pytorch.org/t/tensor-to-variable-and-memory-freeing-best-practices/6000/24. 使用float16精度混合計算。我用過?@NVIDIA英偉達(dá)apex,很好用,可以節(jié)約將近50%的顯存,但是要小心一些不安全的操作如 mean和sum,溢出fp16。NVIDIA/apex(https://github.com/NVIDIA/apex)補(bǔ)充:最近我也嘗試在我CVPR19的GAN模型中加入fp16的訓(xùn)練,可以從15G的顯存需求降到約10G,這樣大多數(shù)1080Ti等較為常見的顯卡就可以訓(xùn)練了。歡迎大家star一波:https://github.com/NVlabs/DG-Net5. 對于不需要bp的forward,如validation 請使用 torch.no_grad , 注意model.eval() 不等于 torch.no_grad() 請看如下討論:https://github.com/NVlabs/DG-Net6. torch.cuda.empty_cache() 這是del的進(jìn)階版,使用nvidia-smi 會發(fā)現(xiàn)顯存有明顯的變化。但是訓(xùn)練時最大的顯存占用似乎沒變。大家可以試試。How can we release GPU memory cache?https://discuss.pytorch.org/t/how-can-we-release-gpu-memory-cache/1453把一個batchsize=64分為兩個32的batch,兩次forward以后,backward一次。但會影響 batchnorm等和batchsize相關(guān)的層。老外寫的提高pytorch效率的方法,包含data prefetch等Optimizing PyTorch training code:https://www.sagivtech.com/2017/09/19/optimizing-pytorch-training-code/

下載1:OpenCV-Contrib擴(kuò)展模塊中文版教程
在「小白學(xué)視覺」公眾號后臺回復(fù):擴(kuò)展模塊中文教程,即可下載全網(wǎng)第一份OpenCV擴(kuò)展模塊教程中文版,涵蓋擴(kuò)展模塊安裝、SFM算法、立體視覺、目標(biāo)跟蹤、生物視覺、超分辨率處理等二十多章內(nèi)容。下載2:Python視覺實戰(zhàn)項目52講在「小白學(xué)視覺」公眾號后臺回復(fù):Python視覺實戰(zhàn)項目,即可下載包括圖像分割、口罩檢測、車道線檢測、車輛計數(shù)、添加眼線、車牌識別、字符識別、情緒檢測、文本內(nèi)容提取、面部識別等31個視覺實戰(zhàn)項目,助力快速學(xué)校計算機(jī)視覺。在「小白學(xué)視覺」公眾號后臺回復(fù):OpenCV實戰(zhàn)項目20講,即可下載含有20個基于OpenCV實現(xiàn)20個實戰(zhàn)項目,實現(xiàn)OpenCV學(xué)習(xí)進(jìn)階。交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~