摘要:表示,的賈揚(yáng)清對他的這一項(xiàng)目給予了很多幫助,賈揚(yáng)清告訴他,的好幾個(gè)網(wǎng)絡(luò),較大瓶頸都是,如果想要實(shí)現(xiàn)一流的性能,賈揚(yáng)清建議較好使用異步,這樣會有很大的幫助。,和則是默認(rèn)啟用這項(xiàng)功能。
微軟數(shù)據(jù)科學(xué)家Ilia Karmanov做了一個(gè)項(xiàng)目,使用高級API測試8種常用深度學(xué)習(xí)框架的性能(因?yàn)镵eras有TF,CNTK和Theano,所以實(shí)際是10種)。Karmanov希望這個(gè)項(xiàng)目能夠幫助數(shù)據(jù)科學(xué)家更好地跨框架進(jìn)行深度學(xué)習(xí)。
Karmanov表示,他這個(gè)項(xiàng)目的目標(biāo)是創(chuàng)建一個(gè)深度學(xué)習(xí)框架的羅塞塔石碑,讓數(shù)據(jù)科學(xué)家能夠輕松地將他們在一個(gè)框架上的專長轉(zhuǎn)移到另一個(gè)框架上(而不是從頭開始學(xué)習(xí))。具體說,就是在8種最常用的框架上構(gòu)建同一個(gè)神經(jīng)網(wǎng)絡(luò)。而且,有了這樣一個(gè)模型后,也就有了比較各個(gè)框架的基準(zhǔn),各個(gè)框架的訓(xùn)練時(shí)間和默認(rèn)選項(xiàng)也變得更加透明。
Karmanov發(fā)現(xiàn),許多在線教程都使用低級別的API,雖然寫很詳細(xì),但對于大多數(shù)用例而言,除非想要?jiǎng)?chuàng)建新的層,否則意義不大。因此,他在項(xiàng)目中使用了別的API,以便更容易地在框架之間進(jìn)行比較。
結(jié)果證明,一旦使用更高級的API,不同框架的代碼結(jié)構(gòu)實(shí)際上變得非常相似,并且可以粗略地表示為:
加載數(shù)據(jù);x_train,x_test,y_train,y_test = cifar_for_library(channel_first=?, one_hot=?)
生成CNN符號(通常在最后的dense層上沒有激活)
指定損失(交叉熵與softmax一起),優(yōu)化和初始化權(quán)重 + session
使用custom迭代器訓(xùn)練訓(xùn)練集中的mini-batch
從測試集中預(yù)測全新的mini-batch
評估準(zhǔn)確性
本質(zhì)上這里是在對一系列確定的數(shù)學(xué)運(yùn)算(盡管是隨機(jī)初始化的)進(jìn)行比較,因此在結(jié)果中比較各個(gè)框架的準(zhǔn)確性并沒有什么意義。Karmanov將精度作為一個(gè)去匹配(而非對比)的指標(biāo),確保比較的是相同的模型架構(gòu)。
結(jié)果:Caffe2、MXNet表現(xiàn)不俗
硬件是Nvidia K80 GPU,環(huán)境是Ubuntu,所有框架都是版本:
但是,比較訓(xùn)練速度意義不大
雖然對10大常用框架進(jìn)行了對比,但Karmanov進(jìn)一步在他的Medium文章里解釋了,比較速度并沒有意義:
使用本地?cái)?shù)據(jù)加載器可能會省掉幾秒鐘(實(shí)際上意義也不大),因?yàn)閟huffle是異步執(zhí)行的。但是,對于常規(guī)項(xiàng)目(而不是這里的這個(gè)實(shí)驗(yàn)),數(shù)據(jù)不太可能放進(jìn)RAM里,還需要大量的預(yù)處理和數(shù)據(jù)增強(qiáng)。這就是數(shù)據(jù)加載器派上用場的地方。Karmanov表示,F(xiàn)acebook的賈揚(yáng)清對他的這一項(xiàng)目給予了很多幫助,賈揚(yáng)清告訴他,F(xiàn)acebook的好幾個(gè)in-production網(wǎng)絡(luò),較大瓶頸都是I/O,如果想要實(shí)現(xiàn)一流的性能,賈揚(yáng)清建議較好使用異步I/O,這樣會有很大的幫助。
其次,Karmanov在這個(gè)示例中只使用了幾層(conv2d,max_pool2d,dropout,全連接層)。平時(shí)工作中的項(xiàng)目可能會有3D卷積、GRU,LSTMS等。
你能很輕松地添加自定義的層,這些層的運(yùn)行速度會影響你選擇用什么框架。所以在這里比較速度也沒多大用。能夠用Python代碼編寫一個(gè)自定義層并快速執(zhí)行它才是研究項(xiàng)目的關(guān)鍵
在實(shí)際應(yīng)用中,你會用到TensorBoard這樣的高級日志來查看模型是否收斂,幫助調(diào)整超參數(shù)。但在這個(gè)例子中并不涉及。
10點(diǎn)心得
以下是Karmanov在所有框架上匹配訓(xùn)練精度,參考Github上所有issue/Pull request后的一些見解:
1. 上面的框架(除了Keras),為了方便比較,都嘗試使用相同級別的API,所以都使用相同的生成函數(shù)。對于MXNet和CNTK,我嘗試了一個(gè)更高級別的API,使用框架的訓(xùn)練生成器函數(shù)。這個(gè)例子中速度的提升是可以忽略的,因?yàn)檎麄€(gè)數(shù)據(jù)集作為NumPy數(shù)組加載到RAM中,每個(gè)epoch完成的處理是就是一次shuffle。我懷疑框架的生成器運(yùn)行了異步shuffle。奇怪的是,NXNet和CNTK似乎在batch級別而不是observation級別上shuffle,因此測試精度稍微降低(至少在10個(gè)epoch之后)。如果有IO,或者有預(yù)處理和數(shù)據(jù)增強(qiáng)的情況,custom生成器對性能的影響將會更大。
2. 啟用CuDNN的auto-tune/窮舉搜索參數(shù)(為固定大小的圖像選擇最有效的CNN算法)能夠大幅提升性能。在Caffe2,PyTorch和Theano,這個(gè)功能得手動開啟。CNTK,MXNet和Tensorflow則是默認(rèn)啟用這項(xiàng)功能。Chainer是什么情況我還不清楚。揚(yáng)清說,cudnnGet(默認(rèn))和cudnnFind之間的性能提升在Titan X GPU上要小得多;在這里,K80 +新的cudnn看來使問題更加突出了。在目標(biāo)檢測時(shí),不論組合為何,運(yùn)行cudnnFind都嚴(yán)重影響了性能回歸,所以在目標(biāo)檢測時(shí)應(yīng)該禁用exhaustive_search
3. 使用Keras時(shí),選擇與后端框架匹配的[NCHW]排序非常重要。CNTK是最先是針對通道(channel)運(yùn)算的,但我不小心把Keras配置為最后用通道了。結(jié)果每個(gè)批次都必須改變順序,嚴(yán)重降低了性能。
4. Tensorflow,PyTorch,Caffe2和Theano需要向pooling層提供一個(gè)布爾值,表示有沒有在訓(xùn)練(這對測試精度有很大影響,72%比77%)。在這種情況下,不應(yīng)該使用dropout來進(jìn)行測試。
5. TensorFlow有點(diǎn)煩人,需要做兩個(gè)調(diào)整:啟用TF_ENABLE_WINOGRAD_NONFUSED,以及將維度最先(而不是最后)提供給通道(data_format="channels_first")可以提升速度。啟用WINOGRAD進(jìn)行卷積,當(dāng)然也可以提升TF做后端的Keras
6. 對大多數(shù)函數(shù)而言,Softmax通常跟cross_entropy_loss() 捆綁在一起,如果你在最后的全連接層上需要激活,較好檢查一下,這樣可以節(jié)省時(shí)間避免做兩次
7. 不同框架的內(nèi)核初始化函數(shù)可能會有所不同(我發(fā)現(xiàn)這對準(zhǔn)確性有+/- 1%的影響),只要有可能我都會指定xavier/glorot
8. SGD-momentum的實(shí)現(xiàn),我需要關(guān)閉unit_gain(在CNTK是默認(rèn)打開的)來匹配其他框架的實(shí)現(xiàn)
9. Caffe2對網(wǎng)絡(luò)的第一層(no_gradient_to_input = 1)有一個(gè)額外的優(yōu)化,通過不計(jì)算輸入的梯度,使速度有一個(gè)較小的提升。很可能,TensorFlow和MXNet是默認(rèn)啟用這項(xiàng)功能的。但是,對于一些研究目的和像DeepDream這樣的項(xiàng)目,計(jì)算這個(gè)梯度可能還是有用的
10. 在max-pooling之后(而不是之前)應(yīng)用ReLU激活意味著在降維后執(zhí)行計(jì)算,這會省掉幾秒鐘的時(shí)間。在MXNet上面,這減少了3秒鐘的時(shí)間
Karmanov對整個(gè)開源社區(qū),包括Caffe2作者、Facebook的賈揚(yáng)清表示感謝,他在Github寫了更多心得體會,并歡迎你提供提升訓(xùn)練時(shí)間的建議:
Github地址:https://github.com/ilkarman/DeepLearningFrameworks
Medium文章:https://medium.com/@iliakarmanov/neural-net-in-8-frameworks-lessons-learned-6a5e8e78b481
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉庫,數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/4634.html
摘要:下圖總結(jié)了絕大多數(shù)上的開源深度學(xué)習(xí)框架項(xiàng)目,根據(jù)項(xiàng)目在的數(shù)量來評級,數(shù)據(jù)采集于年月初。然而,近期宣布將轉(zhuǎn)向作為其推薦深度學(xué)習(xí)框架因?yàn)樗С忠苿釉O(shè)備開發(fā)。該框架可以出色完成圖像識別,欺詐檢測和自然語言處理任務(wù)。 很多神經(jīng)網(wǎng)絡(luò)框架已開源多年,支持機(jī)器學(xué)習(xí)和人工智能的專有解決方案也有很多。多年以來,開發(fā)人員在Github上發(fā)布了一系列的可以支持圖像、手寫字、視頻、語音識別、自然語言處理、物體檢測的...
摘要:第一個(gè)深度學(xué)習(xí)框架該怎么選對于初學(xué)者而言一直是個(gè)頭疼的問題。簡介和是頗受數(shù)據(jù)科學(xué)家歡迎的深度學(xué)習(xí)開源框架。就訓(xùn)練速度而言,勝過對比總結(jié)和都是深度學(xué)習(xí)框架初學(xué)者非常棒的選擇。 「第一個(gè)深度學(xué)習(xí)框架該怎么選」對于初學(xué)者而言一直是個(gè)頭疼的問題。本文中,來自 deepsense.ai 的研究員給出了他們在高級框架上的答案。在 Keras 與 PyTorch 的對比中,作者還給出了相同神經(jīng)網(wǎng)絡(luò)在不同框...
摘要:但年月,宣布將在年終止的開發(fā)和維護(hù)。性能并非最優(yōu),為何如此受歡迎粉絲團(tuán)在過去的幾年里,出現(xiàn)了不同的開源深度學(xué)習(xí)框架,就屬于其中典型,由谷歌開發(fā)和支持,自然引發(fā)了很大的關(guān)注。 Keras作者Fran?ois Chollet剛剛在Twitter貼出一張圖片,是近三個(gè)月來arXiv上提到的深度學(xué)習(xí)開源框架排行:TensorFlow排名第一,這個(gè)或許并不出意外,Keras排名第二,隨后是Caffe、...
閱讀 2808·2021-11-17 09:33
閱讀 4490·2021-09-22 15:57
閱讀 2883·2019-08-30 14:16
閱讀 3147·2019-08-29 14:07
閱讀 2428·2019-08-26 11:55
閱讀 3440·2019-08-23 17:07
閱讀 1738·2019-08-23 16:50
閱讀 2553·2019-08-23 16:08