如何評估神經網路演算法的計算量,從而來確定需要多少GPU的投入?

想知道神經網路演算法訓練需要多少計算力的支持,它們之間大致是怎樣的對應關係?有個量級的概念就可以了,謝謝。


作為大致的估計,可以參見 Jeff Dean 的 Large Scale Deep Learning with TensorFlow http://www.slideshare.net/JenAman/large-scale-deep-learning-with-tensorflow


深度學習難道不應該給定計算資源,達到最好效果嗎?按照樓主的問題,如果可以估算,並且估算出來需要10000個gpu, 樓主怎麼辦?

具體來說,感覺和內存顯存關係比較大,通過數據量和全部內存顯存來估算一下


我認為這個問題的解答者本身應該是實踐者自己,需要在實踐中判斷。

這取決於:單個輸入樣本維度大小(例如圖像大小、RNN樣本長度*樣本維度等)、需要一次性裝載入GPU顯存的訓練集大小(通常是指batch size大小)、自己所期望的單epoch訓練時長(不緊急的項目沒必要在極短時間內跑完,小項目1小時和3、4小時沒什麼區別)。

通常在實踐中碰到的大瓶頸是顯存,這往往初步會在工程層面來解決,例如按需載入。

在初期神經網路網路結構選擇(例如VGG,Resnet或RNN各種變體)和初步簡單的調參期間(各種超參選擇、以及正則化、dropout、early stopping等策略使用),根本不用考慮幾塊GPU的問題。先購置一塊顯卡(例如GTX1080),確定網路結構之後,將batch size調到撐滿顯存(撐到報錯),然後再看某個固定量的數據訓練需要多久。那麼可以大致可以線性地計算全部訓練集需要多長時間。判斷這個訓練時間長度自己是否可以接受,通常可以糾結一下性價比。

如果可以接受,那麼還有一些細節工作可以壓縮訓練時間,例如進一步考慮調整網路結構,很多新的結構設計目的就是為了減少參數量從而增加訓練時間。也可以考慮對於一些特徵數據從float64轉成float32可以減少一半的顯存消耗(意味著可以增加些batch size,同時時精度降低一些dl框架也會加快訓練速度。但是需要特別注意這裡有個坑,如果某些業務的輸入特徵數據敏感於微小的變化,那麼用float32會導致難以收斂到理想位置),加快訓練速度。當然了,雖然深度學習時代已經很少做降維了,但如果是高維非圖像業務數據,的確可以考慮通過降維減少特徵量。

如果不可以接受,那麼就擴GPU。就我所知,少量GPU疊加或並行(不同應用場景不同,有些顯示十幾二十塊以內,有些3塊以上就非線性增長了)會線性提升算力,而GPU數量多了之後提升並非線性,需要自己實際驗證。如Google Research Blog的一張圖所示,到15塊就非線性了:

一次性投入大批GPU是土豪行為,把單塊GPU榨乾最後一點顯存和算力後再考慮多GPU架構,在這個過程也會進一步加深自己對神經網路的理解。一步步走,走到一定階段自然可以判斷對GPU的需求了。若是還沒上手就先考慮買多少GPU的問題,與那剛做個小網站就買一堆伺服器生怕明天就會訪客蜂擁而至撐爆無異:)


推薦閱讀:

在神經網路中,激活函數sigmoid和tanh除了閾值取值外有什麼不同嗎?
你心中的deep learning(深度學習)領域世界十大名校是哪些?
scikit learn 里沒有神經網路?
神經網路中,bias有什麼用,為什麼要設置bias,當加權和大於某值時,激活才有意義?
深度學習在自然語言處理中到底發揮了多大作用?有哪些不足或局限?

TAG:人工智慧 | GPU通用計算 | 神經網路 | 高性能計算 |