設置這個 flag 可以讓內置的 cuDNN 的 auto-tuner 自動尋找最適合當前配置的高效算法,來達到優化運行效率的問題。
應該遵循以下准則:
如果網絡的輸入數據維度或類型上變化不大,也就是每次訓練的圖像尺寸都是一樣的時候,設置 torch.backends.cudnn.benchmark = true 可以增加運行效率;
如果網絡的輸入數據在每次 iteration 都變化的話,會導致 cnDNN 每次都會去尋找一遍最優配置,這樣反而會降低運行效率。
torch.backends.cudnn.benchmark = true
不知道為什么好多人寫dropout和batchnormalization,這個只要稍微理解他們的原理就明白肯定要對train的值進行判斷的,train值的功能目前也僅限於這兩個層,對於別的層來說,train(True)和train(False)是沒有任何區別的。而輸入變量的volatile這個確實是個小坑,不光能加快速度,還可以大大減小內存開銷。
有幾條小技巧分享一下:
- torch.backends.cudnn.benchmark = True 在程序剛開始加這條語句可以提升一點訓練速度,沒什么額外開銷。我一般都會加有時候可能是因為每次迭代都會引入點臨時變量,會導致訓練速度越來越慢,基本呈線性增長。
2.開發人員還不清楚原因,但如果周期性的使用torch.cuda.empty_cache()的話就可以解決這個問題。這個命令是清除沒用的臨時變量的。torchvision.transforms里的各種坑,等有空再說。
作者:功長真金
鏈接:https://www.zhihu.com/question/67209417/answer/303290223
來源:知乎