摘要:本文將告訴你如何用最省錢的方式,來搭建一個高性能深度學習系統。
由于深度學習的計算相當密集,所以有人覺得“必須要購買一個多核快速CPU”, 也有人認為“購買快速CPU可能是種浪費”。
?
那么,這兩種觀點哪個是對的? 其實,在建立深度學習系統時,最糟糕的事情之一就是把錢浪費在不必要的硬件上。 本文將告訴你如何用最省錢的方式,來搭建一個高性能深度學習系統。
當初,在我研究并行深度學習過程中,我構建了一個GPU集群 ,所以我需要仔細選擇硬件。 盡管經過了反復的研究和推理,但當我挑選硬件時,我仍然會犯許多錯誤,并且當應用于實踐中時,那些錯誤就展現出來了。 所以,在這里,我想分享一下我所學到的知識,希望你不會像我一樣再陷入同樣的陷阱。
?
GPU
本文假設您將使用GPU進行深度學習。 如果您正在建立或升級您的系統,那么忽視GPU是不明智的。 GPU才是深度學習應用的核心,它能大大提升處理速度,所以不能忽略。
我在之前的文章中詳細介紹了GPU的選擇,并且GPU的選擇可能是您的深度學習系統中最關鍵的選擇。?
一般來說,如果您的資金預算有限,我推薦您購買GTX 680,或者GTX Titan X(如果你很有錢,可用它做卷積)或GTX 980(它性價比很高,但若做大型卷積神經網絡就有些局限性了),它們在eBay上就能買得到。
另外,低成本高性價比的內存我推薦GTX Titan。 之前我支持過GTX 580,但是由于新更新的cuDNN庫顯著提升了卷積速度,故而所有不支持cuDNN的GPU都已經過時了,其中 GTX 580就是這樣一款GPU。 如果您不使用卷積神經網絡,GTX 580仍然是一個很好的選擇。
你能識別上面哪個硬件會導致糟糕的表現? 是這些GPU的其中一個? 還是CPU?
?
CPU
要選擇CPU,我們首先要了解CPU及它與深度學習的關系。
CPU對深度學習有什么作用? 當您在GPU上運行深度網絡時,CPU幾乎沒有計算,
但是CPU仍然可以處理以下事情:
在代碼中寫入和讀取變量
執行諸如函數調用的指令
在GPU上啟動函數調用
創建小批量數據
啟動到GPU的數據傳輸
?
所需CPU的數量
當我用三個不同的庫訓練深度神經網絡時,我總是看到一個CPU線程是100%(有時另一個線程會在0到100%之間波動)。 而且這一切立即告訴你,大多數深入學習的庫,以及實際上大多數的軟件應用程序,一般僅使用一個線程。?
這意味著多核CPU相當無用。 如果您運行多個GPU,并使用MPI之類的并行化框架,那么您將一次運行多個程序,同時,也需要多個線程。?
每個GPU應該是一個線程,但每個GPU運行兩個線程將會為大多數深入學習庫帶來更好的性能;這些庫在單核上運行,但是有時會異步調用函數,就使用了第二個CPU線程。?
請記住,許多CPU可以在每個內核上運行多個線程(這對于Intel 的CPU尤為如此),因此通常每個GPU對應一個CPU核就足夠了。
?
CPU和PCI-Express
這是一個陷阱! 一些新的Haswell CPU不支持那些舊CPU所支持的全部40個PCIe通道。如果要使用多個GPU構建系統,請避免使用這些CPU。 另外,如果您有一個帶有3.0的主板,則還要確保您的處理器支持PCIe 3.0。
?
CPU緩存大小
正如我們將在后面看到的那樣,CPU高速緩存大小在“CPU-GPU-管線”方面是相當無關緊要的,但是我還是要做一個簡短的分析,以便我們確保沿著這條計算機管道能考慮到每一個可能出現的瓶頸,進而我們可以全面了解整體流程。
通常人們購買CPU時會忽略緩存,但通常它是整體性能問題中非常重要的一部分。 CPU緩存的片上容量非常小,且位置非常靠近CPU,可用于高速計算和操作。 CPU通常具有緩存的分級,從小型高速緩存(L1,L2)到低速大型緩存(L3,L4)。?
作為程序員,您可以將其視為哈希表,其中每個數據都是鍵值對(key-value-pair),您可以在特定鍵上進行快速查找:如果找到該鍵,則可以對高速緩存中的值執行快速讀寫操作; 如果沒有找到(這被稱為緩存未命中),則CPU將需要等待RAM趕上,然后從那里讀取該值(這是非常緩慢的過程)。 重復的緩存未命中會導致性能顯著降低。 高效的CPU高速緩存方案和架構,通常對CPU的性能至關重要。
CPU如何確定其緩存方案,是一個非常復雜的主題,但通常可以假定重復使用的變量、指令和RAM地址將保留在緩存中,而其他不太頻繁出現的則不會。
在深度學習中,相同的內存范圍會重復被小批量讀取,直到送到GPU,并且該內存范圍會被新數據覆蓋。但是如果內存數據可以存儲在緩存中,則取決于小批量大小。?
對于128位的小批量大小,我們對應于MNIST和CIFAR分別有0.4MB和1.5 MB,這適合大多數CPU緩存;對于ImageNet,我們每個小批量有超過85 MB的數據( ),即使是較大的緩存(L3緩存不超過幾MB),也算是很大的了。
由于數據集通常太大而無法適應緩存,所以新的數據需要從RAM中每個讀取一小部分新的,并且需要能夠以任何方式持續訪問RAM。
?
RAM內存地址保留在緩存中(CPU可以在緩存中執行快速查找,并指向RAM中數據的確切位置),但是這僅限于整個數據集都存儲于RAM時才會如此,否則內存地址將改變,并且緩存也不會加速(稍后你會看到的,使用固定內存時則不會出現這種情況,但這并不重要)。
?
深度學習代碼的其他部分(如變量和函數調用),將從緩存中受益,但這些代碼通常數量較少,可輕松適應幾乎任何CPU的小型快速L1緩存。
?
從這個推理結果可以看出,CPU緩存大小不應該很重要。下一節進一步分析的結果,也與此結論相一致。
?
所需的CPU時鐘頻率(frequency)
當人們想到快速的CPU時,他們通常首先想到時鐘頻率(clockrate)。 4GHz真的比3.5GHz快嗎?這對于具有相同架構的處理器來說,通常是正確的,例如“Ivy Bridge”。但在不同架構的處理器之間,就不能這樣比較了。 此外,時鐘頻率也并非總是較佳的性能指標。
?
在深度學習上,使用CPU的計算很少:比如增加一些變量、評估一些布爾表達式、在GPU或程序中調用一些函數。以上這些都取決于CPU內核時鐘率。雖然這個推理似乎是合理的,但是當我運行深度學習程序時,CPU卻有100%的使用率,這是為什么? 為了找到原因,我做了一些CPU核頻率的降頻實驗。
在MNIST和ImageNet上的CPU降頻測試 :以上數據,是在具有不同CPU內核時鐘頻率時,對ImageNet運行200個周期MNIST數據集,或1/4 ImageNet周期所用時間,進行性能測量的。其中以較大時鐘頻率作為每個CPU的基準線。 為了比較:從GTX 680升級到GTX Titan,性能約為15%; 從GTX Titan到GTX 980提升20%; GPU超頻為所有GPU提升約5%的性能。
?
那么為什么CPU內核頻率對系統來說無關緊要,而使用率卻是100%? 答案可能是CPU緩存未命中(CPU持續忙于訪問RAM,但是同時CPU必須等待RAM以跟上其較慢的時鐘頻率,這可能會導致忙碌和等待兩者同時存在的矛盾狀態)。 如果這是真的,就像上面看到的結果一樣,那么CPU內核的降頻不會導致性能急劇下降。
?
另外,CPU還執行其他操作,如將數據復制到小批量中,并將準備復制到GPU的數據準備好,但這些操作取決于內存時鐘頻率,而不是CPU內核時鐘頻率。 所以,現在我們來看看內存方面。
?
RAM時鐘頻率
CPU-RAM,以及與RAM的其他交互,都相當復雜。 我將在這里展示一個簡化版本的過程。為了能更全面地理解,就我們先來深入了解從CPU RAM到GPU RAM這一過程。
CPU內存時鐘和RAM交織在一起。 您的CPU的內存時鐘決定了RAM的較大時鐘頻率,這兩個部分構成CPU的總體內存帶寬,但通常RAM本身確定了總體可用帶寬,原因是它比CPU內存頻率慢。?
您可以這樣確定帶寬:
(其中64是指64位CPU架構。 對于我的處理器和RAM模塊,帶寬為51.2GB / s)
?
但是,如果您復制大量的數據,這時會和帶寬相關。 通常,您的RAM上的時序(例如8-8-8)對于小數據量來說更為相關,并且決定您的CPU等待RAM追趕的時間。 但是如上所述,您深入學習程序中的幾乎所有數據都將輕松適應CPU緩存,除非因為太大,才無法從緩存中獲益。 這意味著計時器將是不重要的,而帶寬可能才是重要的。
?
那么這與深度學習程序有什么關系呢? 我剛剛只是說帶寬可能很重要,但是在下一步里,它就不是很重要了。 您的RAM的內存帶寬決定了一個小批量可以被重寫和分配用于初始化GPU傳輸的速度,但下一步,CPU-RAM到GPU-RAM是真正的瓶頸,這一步使用直接內存存取(DMA)。 如上所述,我的RAM模塊的內存帶寬為51.2GB/ s,但DMA帶寬只有12GB / s!
?
DMA帶寬與常規帶寬有關,但細節并不一定必須了解。如果您想詳細了解,可到該維基百科詞條查看,您可以在詞條內查找RAM模塊的DMA帶寬(峰值傳輸限制)。 但是先讓我們看看DMA是如何工作的吧。
(地址:https://en.wikipedia.org/wiki/DDR3_SDRAM#JEDEC_standard_modules)?
?
直接內存存取(DMA)
具有RAM的CPU只能通過DMA與GPU進行通信。?
在第一步中,CPU RAM和GPU RAM都保留特定的DMA傳輸緩沖區;?
在第二步,CPU將請求的數據寫入CPU側的DMA緩沖區;?
在第三步中,保留的緩沖區無需CPU的幫助即可傳輸到GPURAM。?
這里有人可能會想:你的PCIe帶寬是8GB / s(PCIe 2.0)或15.75GB / s(PCIe 3.0),所以你應該買一個像上面所說的良好峰值傳輸限制的RAM嗎?
答案是:不必要。 軟件在這里會扮演重要角色。 如果你以一種聰明的方式進行一些傳輸,那么你就不再需要那些便宜且慢的內存。?
?
異步迷你批量分配(Asynchronousmini-batch allocation)
一旦您的GPU完成了當前迷你批量的計算,它就想立即計算下一迷你批次(mini-batch)。 您現在可以初始化DMA傳輸,然后等待傳輸完成,以便您的GPU可以繼續處理數字。
但是有一個更有效的方法:提前準備下一個迷你批量,以便讓您的GPU不必等待。 這可以輕松且異步地完成,而不會降低GPU性能。
用于異步迷你批次分配的CUDA代碼:當GPU開始處理當前批次時,執行前兩次調用; 當GPU完成當前批處理時,執行最后兩個調用。 數據傳輸在數據流的第二步同步之前就已經完成,因此GPU處理下一批次將不會有任何延遲。
??
Alex Krishevsky的卷積網絡的ImageNet 2012迷你批次的大小為128,僅需要0.35秒就能完成它的完整的反向傳遞。 我們能夠在如此短時間內分配下一批嗎?
如果我們采用大小為128的批次,并且維度244x244x3大小的數據,總量大約為0.085 GB( )。 若使用超慢內存,我們有6.4 GB / s,即每秒75個迷你批次! 所以使用異步迷你批量分配,即使是最慢的RAM對深入學習也將足夠。如果使用異步迷你批量分配,購買更快的RAM模塊沒有任何優勢。
該過程也間接地意味著CPU緩存是無關緊要的。 您的CPU的快速覆蓋速度(在快速緩存中),以及準備(將緩存寫到RAM)一個迷你批次其實并不重要,因為在GPU請求下一個迷你批次之前,整個傳輸就已經完成了,所以一個大型緩存真的沒那么重要。
所以底線確實是RAM的時鐘頻率是無關緊要的,所以買便宜的就行了。
但你需要買多少個呢?
?
RAM大小
您應該至少具有與GPU內存大小相同的RAM。 當然,您可以使用較少的RAM,但這樣的話可能需要一步一步地傳輸數據。 然而,從我的經驗來看,使用更大的RAM會更加方便。
心理學告訴我們,專注力是隨著時間的推移會慢慢耗盡的一種資源。有些為數不多的硬件,可以幫您節省注意力資源以解決更困難的編程問題, RAM就是其中之一。 如果您有更多的RAM,您可以將更多的時間投入到更緊迫的事情上,而不是花費大量的時間來彌補RAM瓶頸。?
有了很多RAM,您可以避免這些瓶頸,節省時間并提高生產率,使注意力投入到更緊迫的地方。 特別是在Kaggle比賽中,我發現額外的RAM對于特征操作非常有用。 所以如果你資金充裕,并做了大量的預處理,那么額外的RAM可能是一個不錯的選擇。
?
硬盤驅動器/SSD
在某些情況下,硬盤驅動器可能是深度學習的重大瓶頸。 如果您的數據集很大,您通常會在SSD /硬盤驅動器上放一些數據,RAM中也有一些,以及GPURAM中也會放兩個迷你批量(mini-batch)。 為了不斷地供給GPU,我們需要以GPU可以運行完的速度提供新的的迷你批量(mini-batch)。
?
為此,我們需要使用與異步迷你批量分配相同的想法。 我們需要異步讀取多個小批量的文件,這真的很重要! 如果我們不這樣做,結果表現會被削弱很多(約5-10%),并且你精心設計的硬件優勢將毫無作用(好的深入學習軟件在GTX 680也能運行很快,而壞的深入學習軟件即使用GTX 980也會步履維艱)
?
考慮到這一點,如果我們將數據保存為32位浮點數據,就會遇到Alex的ImageNet卷積網絡遇到的數據傳輸速率的問題,約每0.3秒0.085GB( ?)即290MB / s。 如果我們把它保存為jpeg數據,我們可以將它壓縮5-15倍,將所需的讀取帶寬降低到約30MB / s。 如果我們看硬盤驅動器的速度,我們通常會看到速度為100-150MB / s,所以這對于壓縮為jpeg的數據是足夠的。?
類似地,一個人可以使用mp3或其他壓縮技術處理的聲音文件,但是對于處理原始32位浮點數據的其他數據組,難以很好地壓縮數據(只能壓縮32位浮點數據10-15%)。 所以如果你有大的32位數據組,那么你肯定需要一個SSD,因為速度為100-150 MB / s的硬盤會很慢,難以跟上GPU。
所以如果你今后有可能遇到這樣的數據,那就買一個一個SSD;如果不會遇到那樣的數據,一個硬盤驅動器就足夠用了。
?
?許多人購買SSD是為了感覺上更好:程序啟動和響應更快,并且使用大文件進行預處理也更快一些。但是對于深入學習,僅當輸入維度很高且無法充分壓縮數據時,才用得到SSD。
?
如果您購買SSD,您應該買一個能夠容納您常用大小的數據組的SSD,另外還需要額外留出幾十GB的空間。其實,讓硬盤驅動器來存儲未使用的數據組也是個好主意。
?
電源單元(PSU)
一般來說,您需要一個足夠的PSU來滿足未來的所有GPU。 GPU通常會隨著時間的推移而更加節能,所以即使當其他組件到了更換的時候,PSU也能繼續工作很長時間,所以良好的PSU是一個明智的投資。
?
您可以通過將CPU和GPU的所需瓦數,與其他組件所需瓦數相加,再加上作為電源峰值緩沖的100-300瓦,就能計算出所需的瓦數。?
?
要注意的一個重要部分,是留意您的PSU的PCIe連接器是否支持帶有連接線的8pin + 6pin的接頭。 我買了一個具有6x PCIe端口的PSU,但是只能為8pin或6pin連接器供電,所以我無法使用該PSU運行4個GPU。
?
另一個重要的事情是購買具有高功率效率等級的PSU,特別是當您運行多個GPU并想要運行很長時間。
??
在全功率(1000-1500瓦特)下運行4個GPU系統,對卷積網進行兩個星期的訓練,將消耗300-500千瓦時,而在德國的電力成本還要高出20美分/ kWh,即60~100
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/4571.html
摘要:在此之前,我們要為此做一些準備工作搭建本地測試節點,方便以后編寫和部署合約。摘要這篇,我們將簡單學習如何搭建本地測試節點大家就不要花錢去買了,以及如何使用超級賬戶創建新賬戶以及加載基礎的系統合約。可以說,擁有了這個賬戶,就擁有了整個測試網絡 之前三篇我們掌握了如何使用EOS源碼搭建環境、連接主網以及如何創建賬戶。自此,我們對EOS就有了一個感性的認知,對EOS中公鑰、賬戶以及權限有了新...
摘要:接下來,介紹了使用深度學習的計算機視覺系統在農業零售業服裝量身定制廣告制造等產業中的應用和趨勢,以及在這些產業中值得關注的企業。 嵌入式視覺聯盟主編Brian Dipert今天發布博文,介紹了2016年嵌入式視覺峰會(Embedded Vision Summit)中有關深度學習的內容:谷歌工程師Pete Warden介紹如何利用TensorFlow框架,開發為Google Translate...
摘要:然而目前的問題是,光互連硬件的成本隨著其功能的增加而增加,并且其增長快于其他數據中心硬件的成本。如今,維護和升級數據中心硬件是一項優化工作。對于管理數據中心硬件的工作人員來說,這一點很重要數據需求將會持續增長。對于許多企業的數據中心團隊來說,所面臨困難的現實是需要支持更多的商業級應用:提高業務敏捷性,實現基礎設施的現代化以提高能源效率,加強網絡安全等等。與此同時,即使面臨明確長期節省成本和業...
摘要:基準測試我們比較了和三款,使用的深度學習庫是和,深度學習網絡是和。深度學習庫基準測試同樣,所有基準測試都使用位系統,每個結果是次迭代計算的平均時間。 購買用于運行深度學習算法的硬件時,我們常常找不到任何有用的基準,的選擇是買一個GPU然后用它來測試。現在市面上性能較好的GPU幾乎都來自英偉達,但其中也有很多選擇:是買一個新出的TITAN X Pascal還是便宜些的TITAN X Maxwe...
摘要:很明顯這臺機器受到了英偉達的部分啟發至少機箱是這樣,但價格差不多只有的一半。這篇個文章將幫助你安裝英偉達驅動,以及我青睞的一些深度學習工具與庫。 本文作者 Roelof Pieters 是瑞典皇家理工學院 Institute of Technology & Consultant for Graph-Technologies 研究深度學習的一位在讀博士,他同時也運營著自己的面向客戶的深度學習產...
閱讀 1385·2019-08-30 12:54
閱讀 1870·2019-08-30 11:16
閱讀 1612·2019-08-30 10:50
閱讀 2447·2019-08-29 16:17
閱讀 1266·2019-08-26 12:17
閱讀 1377·2019-08-26 10:15
閱讀 2387·2019-08-23 18:38
閱讀 784·2019-08-23 17:50