在深度學習任務中,雖然可以通過堆疊引數、設計更復雜的結構來提高模型的表征能力,但這也會導致模型的計算量增加,訓練時間延長,大大降低模型的產出效率,這篇文章根據博主的經驗簡單介紹一些加快模型訓練速度的方法,以及為什么需要關注模型的訓練速度,
加快深度學習模型訓練速度的方法
1. 合理的超引數設計
- BatchSize,每次迭代batch的大小是影響每次推理速度的主要因素,而batchsize并非越大越好,一個經驗性的可選數值是32、64、128,一般來說,每個batch的大小一旦超過64,繼續增大batch帶來的性能收益就微乎其微了,因此可以通過實驗嘗試一下這三個數值,在達到同樣的性能前提下讓batch盡可能的小,這也會給顯存留下更大的空間,進而可以嘗試更多的模型設計方式,
- epoch、學習率策略,迭代次數和學習率這兩個引數需要放在一起講,我們在挑選這兩個引數時,需要每100次迭代(或者其他)保存一次模型,然后把這些模型的精度曲線、loss、和當前的學習率畫到一張影像中,從影像中就可以發現,在某些學習率設定下,可能訓練幾個epoch模型的性能就不會繼續增加了,loss也不會降低,因此找到這個平衡點之后就可以將當前學習率下的后續epoch舍棄掉,進一步降低學習率訓練,一個經驗性的總結是:更小的學習率通常只需要更少的epoch,因此,可以通過修改學習率和訓練epoch的策略來達到相同精度的前提下降低訓練時間,
2. 權值共享
- 每輪迭代的推理速度和模型的引數量、計算量息息相關,而通過設定引數權值共享,可以降低總的引數量和計算量,另外如tensorflow,pytorch等深度學習框架都有針對權值共享的推理優化,所以會有相對明顯的加速效果,
3. 升級相關軟體包
- 如將cuda、tensorflow、pytorch進行升級,一般來說越新越好,舊版cuda可能只是針對一些顯卡做了適配,但是新版cuda會針對一些新的算子、顯卡做針對性優化,如常見的tesila V系列顯卡,采用cuda11的推理速度就明顯快于cuda8、9,tensorflow、pytorch等框架也是同理,并且這些軟體包都是向下兼容的,因此不用過于擔心代碼移植問題,
4. 多卡訓練、資料并行
- 在采用NVIDIA GPU進行訓練的時候,可以通過
$ watch -n 0.1 nvidia-smi
命令時刻觀察GPU顯存和利用率情況,只有當GPU 利用率處于高位的時候GPU才是在高效的作業,否則大部分時間都是在閑置,而這一般是由于資料讀取過慢導致的,可以通過自己實作多執行緒讀資料或者采用tensorflow、pytorch等框架提供的并行讀資料的方法讓GPU保持較高利用率,從而提高推理速度,降低整體訓練耗時,
5. 混合精度訓練
- 通常引數都是采用float32進行計算的,而將引數保存為float16格式理論上能加快一倍的訓練速度并且節省一倍的模型大小,同時精度損失不會太多,這就是混合精度訓練方法,具體細節可以參照常見的深度學習框架提供的混合精度訓練包,
加快模型訓練速度的價值
最后簡單說一下為什么應該關注模型訓練速度,
- 提高效率,不管是對于科研還是比賽,亦或者是實際的作業,模型的產出速度都極大的影響了實驗的效率,有人需要一周才能出一個模型,而通過上述策略加快模型訓練速度,可以將該時間降低到1天或者更快,這其中的價值不言自明,
- 省錢,不管是企業還是高校實驗室,GPU顯卡或是買來的,或是租來的,如果采用的是騰訊云的GPU服務器,騰訊云和阿里云常被選擇的企業級的GPU服務器價格通常是20,000~30,000/月,按照20,000/月計算每小時租金為28元,如果產出一個模型需要7天,那么一個模型的成本是4,704元,按照每10個模型產出一個有效模型來算,那么一個有效模型的成本就是47,040元,如果將模型訓練時間縮短三倍,那么一個有效模型成本就縮短到了15,680元,節省31,360元,按照100個研究員/工程師每個月產出兩個有效模型,每100個研究員/工程師一個月就節省了6,272,000元,也就是六百多萬,不得不說AI部門的運營成本是真滴高,
- 提高效率,節省時間,對于在校生做研究、打比賽來說,提高效率和模型產出,就能有更多實驗資料和做更多嘗試,或許paper就發出來了,比賽就拿名次了,對于企業來說,本質上還是省錢,把用人成本、運營成本都算上,提高效率就是大把大把的省錢,
所以,做實驗的時候一定要考慮好效率問題,提高模型的訓練速度,
博主會持續更新一些深度學習相關的基礎知識以及作業中遇到的問題和感悟,喜歡請關注、點贊、收藏,感謝大家,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/295556.html
標籤:AI