深度學習是計算密集型的領(lǐng)域,,搭建深度學習系統(tǒng)時,,最糟糕的事情之一就是把錢浪費在并非必需的硬件上,。本文中,華盛頓大學博士生 Tim Dettmers 將一步步帶你了解搭建一個高性能經(jīng)濟系統(tǒng)所需的硬件,。
作者曾在 2015 年寫過一版深度學習硬件推薦的文章,,但如今計算機硬件的迭代速度非常快,,因此作者在近期將原來的文章進行了大幅改動,,寫出了第二版深度學習硬件推薦。
參見:深度 | 史上最全面的深度學習硬件指南
以下是博客原文的編譯,,機器之心摘取了 GPU,、RAM、CPU,、硬盤,、主板部分的全部內(nèi)容,并簡單總結(jié)了剩余部分(包括電源,、散熱,、機箱和顯示器),同時在最后給出了結(jié)論清單,,具體細節(jié)還請參閱原文,。
深度學習硬件推薦第二版:研究并行化深度學習過程中,我搭建了 7 個深度學習工作站,,為此,,我需要仔細挑選硬件。盡管經(jīng)過了仔細的研究和邏輯推理,,但是,,挑選硬件時,我還是會犯相當多的錯誤,當我在實踐中應用集群時,,錯誤就會顯現(xiàn)出來,。下面就是我想分享的所得,希望你們不會再掉入同樣的陷阱,。
GPU
在這篇博文中,,我們假設你會利用 GPU 來進行深度學習。如果你正在構(gòu)建或升級你的深度學習系統(tǒng),,忽視 GPU 是不理智的,。GPU 正是深度學習應用的核心要素——計算性能提升,收獲巨大,,不可忽視,。
我在另一篇博客中討論了 GPU 選擇推薦,對于深度學習系統(tǒng)而言,,GPU 的選擇可能是最關(guān)鍵的部分,。在選擇 GPU 的時候,人們最可能犯的三個錯誤是:(1)性價比低,;(2)沒有足夠內(nèi)存,;(3)散熱效果差。
博客地址:http://timdettmers.com/2018/11/05/which-gpu-for-deep-learning/
對于性價比高的 GPU,,我一般推薦 RTX 2070 或 RTX 2080 Ti,。如果你使用了這些顯卡,你應該使用 16 位的模型,。否則,,在 eBay 上購買 GTX 1070、GTX 1080 和 GTX 1080 Ti 會更合適,,你可以在這些顯卡上使用 32 位模型(但不能是 16 位模型),。
在選擇 GPU 的時候,要注意內(nèi)存需求問題,。RTX 顯卡可以運行 16 位模型,相比 GTX 顯卡,,可以用相同的內(nèi)存訓練兩倍大的模型,。由于其內(nèi)存優(yōu)勢,學會如何使用 RTX 顯卡高效運行 16 位模型可以帶給你很多好處,。一般而言,,內(nèi)存需求狀況如下所示:
追求當前最佳結(jié)果(SOTA)的 AI 實驗研究:≥11GB;
探究有趣架構(gòu)的 AI 實驗研究:≥8GB,;
任何其它研究:8GB,;
Kaggle:4-8GB;
初創(chuàng)公司:8GB(但需根據(jù)模型尺寸的具體用例做調(diào)整);
公司:8GB 用于原型設計,,11GB 用于訓練,。
另一個需要注意的問題是冷卻,尤其當你購買 RTX 顯卡的時候,。如果你想將 GPU 放入 PCIe 插槽中,,讓它們彼此相鄰放置,確保能為 GPU 提供鼓風式風扇,。否則你可能會遇到溫度問題,,你的 GPU 將變慢(約 30%),而且會更早報廢,。
你能否識別出因性能不佳而出現(xiàn)故障的硬件部分,?是其中一個 GPU?或者其實是 CPU 出現(xiàn)故障,?
RAM
選擇 RAM 時會犯的最大錯誤是 RAM 的時鐘頻率太高,。第二個錯誤是選擇的 RAM 不夠,導致不能獲得連續(xù)的原型設計經(jīng)驗,。
所需 RAM 時鐘頻率
RAM 時鐘頻率只是一種營銷手段,,RAM 生產(chǎn)公司想以此誘惑你購買「更快的」RAM,但實際上這并不能帶來多少性能增益,??梢栽凇窪oes RAM speed REALLY matter?」這個視頻中看到最佳的解釋。此外,,你要知道 RAM 速度與快速 CPU RAM->GPU RAM 傳輸幾乎無關(guān),。這是因為(1)如果你使用了固定內(nèi)存,模型的樣本批量不需要 CPU 參與就可以被轉(zhuǎn)移到 GPU,,以及(2)如果你不使用固定內(nèi)存,,快速 RAM 相對于慢速 RAM 的性能提升約為 0-3%,所以把錢花在別的地方,!
RAM 大小
RAM 大小不會影響深度學習性能,。但是,它可能會阻礙你輕松運行 GPU 代碼(無需交換到磁盤),。你需要有足夠的內(nèi)存來使用 GPU,。這意味著你應該至少擁有與最大 GPU 匹配的 RAM 量。例如,,如果你有一個 24 GB 內(nèi)存的 Titan RTX,,你應該至少有 24 GB 的 RAM。但是,,如果你有多塊 GPU,,則不一定需要更多 RAM,。
這種「在 RAM 中匹配最大 GPU 內(nèi)存」策略的問題在于,如果處理大型數(shù)據(jù)集,,你的 RAM 可能仍然不夠,。所以最好的策略是匹配你的 GPU,如果覺得 RAM 不夠,,再買多些就是了,。
心理學告訴我們,注意力是一種隨著時間推移而耗盡的資源,。RAM 是為數(shù)不多的可以讓你節(jié)省集中資源以解決更困難的編程問題的硬件之一,。如果你有更多的 RAM,你可以將注意力集中在更緊迫的問題上,,而不是花費大量時間來解決 RAM 瓶頸,。有了足夠的 RAM,你可以避免這些瓶頸,,節(jié)省時間并提高效率,,解決更緊迫的問題。特別是在 Kaggle 比賽中,,我發(fā)現(xiàn)額外的 RAM 對于特征工程非常有用,。因此,如果你有錢并需要進行大量預處理,,那么額外的 RAM 可能是一個不錯的選擇,。因此,根據(jù)此策略,,你需要現(xiàn)在就購買更多,、更便宜的 RAM,而不是等以后,。
CPU
人們通常犯的主要錯誤是將太多的注意力放在了 CPU 的 PCIe 通道上,。你不用太在意 PCIe 通道。你應該查看 CPU 和主板的組合能否支持你想要安裝的 GPU 數(shù)量,。第二個常見錯誤是選擇太強大的 CPU,。
CPU 和 PCI-Express
人們對 PCIe 通道過于執(zhí)著。然而,,事實上它對深度學習的性能幾乎沒有影響,。如果你有單個 GPU,PCIe 通道只是用來快速把數(shù)據(jù)從 CPU RAM 轉(zhuǎn)移到 GPU RAM,。用 16 個通道傳輸批量為 32 張圖像(32x225x225x3)的 ImageNet 到 32 位模型需要 1.1 毫秒,用 8 個通道需要 2.3 毫秒,,用 4 個通道需要 4.5 毫秒,。這些都只是理論數(shù)字,,在實踐中 PCIe 通道傳輸數(shù)據(jù)的速度通常只有一半,但這仍然很快,!PCIe 通道的延遲通常在納秒范圍內(nèi),,因此可以忽略不計。
綜合起來,,將批量為 32 的 ImageNet 圖像傳輸?shù)?ResNet-152 的時間如下所示:
正向傳遞和反向傳遞:216 毫秒
16 個 PCIe 通道的 CPU->GPU 傳輸:大約 2 毫秒(理論上為 1.1 毫秒)
8 個 PCIe 通道的 CPU->GPU 傳輸:大約 5 毫秒(理論上為 2.3 毫秒)
4 個 PCIe 通道的 CPU->GPU 傳輸:大約 9 毫秒(理論上為 4.5 毫秒)
因此,,將 PCIe 通道從 4 個增加到 16 個將會帶來大約 3.2% 的性能提升。但是,,如果你使用固定內(nèi)存來運行 PyTorch 的數(shù)據(jù)加載器,,那你將獲得 0% 的性能提升。所以,,如果你使用的是單個 GPU,,就不要把錢浪費在 PCIe 通道上了。
當你選擇 CPU PCIe 通道和主板 PCIe 通道時,,確定你選擇的組合能夠支持你想要安裝的 GPU 數(shù)量,。如果你買的主板支持 2 個 GPU,而你最終也想安裝 2 個 GPU,,那就確保你買的 CPU 支持你安裝 2 個 GPU,,但無需查看 PCIe 通道數(shù)。
PCIe 通道和多 GPU 并行化
如果你使用數(shù)據(jù)并行化在多 GPU 上訓練網(wǎng)絡,,PCIe 通道是否重要,?關(guān)于這個我在 ICLR2016 年發(fā)表過論文《Title:8-Bit Approximations for Parallelism in Deep Learning》。我可以告訴你,,如果你有 96 個 GPU,,那 PCIe 通道數(shù)真的很重要。但是,,如果你有不超過 4 個 GPU,,那 PCIe 通道數(shù)就沒那么重要了。如果在 2-3 個 GPU 上進行并行化處理,,那你完全不必在意 PCIe 通道,。如果你有 4 個 GPU,則每個 GPU 需要 8 個 PCIe 通道的支持(總共需要 32 個 PCIe 通道),。根據(jù)以往的經(jīng)驗,,幾乎沒有人會運行超過 4 個 GPU,所以完全沒必要額外花錢獲得更多的 PCIe 通道,,那不值當,!
所需 CPU 核心數(shù)
為了更好地選擇 CPU,首先要了解它以及它與深度學習的關(guān)系,。CPU 能為深度學習做什么,?當你在 GPU 上運行深度網(wǎng)絡時,,CPU 幾乎不做計算。它主要干兩件事:1)啟動 GPU 函數(shù)調(diào)用,;2)執(zhí)行 CPU 函數(shù),。
到目前為止,CPU 最有用的應用是數(shù)據(jù)預處理,。有兩種不同的通用數(shù)據(jù)處理策略,,它們有不同的 CPU 需求。
第一種策略是在訓練網(wǎng)絡時進行預處理:
循環(huán):
1. 加載小批量
2. 預處理小批量
3. 在小批量上訓練
第二種策略是在開始任何訓練之前進行預處理:
1. 預處理數(shù)據(jù)
2. 循環(huán):
a. 加載預處理的小批量
b. 在小批量上訓練
對于第一種策略,,具有多核的高性能 CPU 可以顯著提升性能,。對于第二種策略,你不需要非常好的 CPU,。至于第一個策略,,我推薦每個 GPU 至少 4 個線程——通常每個 GPU 兩個核心。對此我還沒有做硬件測試,,但每增加一個核心/GPU,,你估計會獲得 0-5% 的性能提升。
至于第二個策略,,我建議每個 GPU 最少 2 個線程——通常每個 GPU 一個核心,。如果你采用第二個策略,當你增加核心時,,性能不會顯著提升,。
所需 CPU 時鐘頻率(頻率)
當人們想到快速的 CPU 時,他們一般最先想到其時鐘頻率(clock rate),。4GHz 比 3.5GHz 快,,是這樣嗎?在比較具有相同架構(gòu)的處理器時,,這一般是對的,,例如「第三代酷睿處理器」(Ivy Bridge)。但在比較不同架構(gòu)的處理器時,,這個想法卻沒那么準確,。而且這也并非一直是測量性能的最好指標。
在深度學習中,,只有很少一部分的計算會用 CPU 來完成:增值幾個變量,、評估幾個布爾表達式、在 GPU 或在編程里面調(diào)用幾個函數(shù)——所有這些會取決于 CPU 核的頻率,。
這種推理似乎是合理的,,但當我運行深度學習編程的時候,CPU 會有 100% 的使用率,,那這是怎么回事兒,?為了找出原因,,我做了一些 CPU 核頻率降頻的實驗。
CPU 降頻后在 MNIST 及 ImageNet 的表現(xiàn):使用不同的 CPU 核頻率,,將 MNIST 數(shù)據(jù)集運行 200 遍或遍歷 1/4 的 ImageNet 數(shù)據(jù)集運行作為測量時間,我們測量 CPU 的性能,,其中每個 CPU 的最高頻率被定為參照線,。對于比較:在性能上,GTX Titan 比 GTX 680 提升了 15%,;GTX 980 比 GTX Titan 提升了 20%,;GPU 超頻比任何 GPU 提升了 5%。
請注意,,這些實驗是在過時的硬件上進行的,,但是,這些結(jié)果對現(xiàn)在的 CPU/GPU 來說應該同樣適用,。
硬盤/SSD
硬盤通常不是深度學習的瓶頸,。但是,也有例外:如果你在需要數(shù)據(jù)時直接從磁盤讀取,,那么一個 100 MB / s 的硬盤驅(qū)動器在批量為 32 的 ImageNet 上花費大約 185 毫秒,!但是,如果你在使用數(shù)據(jù)之前異步獲取數(shù)據(jù)(例如 torch vision loaders),,那么你可以在 185 毫秒內(nèi)加載批量,,而在 ImageNet 上大多數(shù)深度神經(jīng)網(wǎng)絡的計算時間約為 200 毫秒。因此,,在當前仍處于計算狀態(tài)時加載下一個批量,,你將不會面臨任何性能損失。
但是,,我推薦使用 SSD 來提高舒適度和工作效率:程序啟動和響應速度更快,,使用大文件進行預處理要快得多。你可以購買 NVMe SSD,,與普通 SSD 相比,,你將獲得更加流暢的體驗。
因此,,理想的配置是為數(shù)據(jù)集提供大而緩慢的硬盤驅(qū)動器,,并使用 SSD 提高生產(chǎn)率和舒適度。
主板
你的主板應該擁有足夠的 PCIe 端口來支持你想運行的 GPU 數(shù)量(通常最多 4 塊 GPU,,即使你有更多的 PCIe 端口),;記住大多數(shù) GPU 有兩個 PCIe 端口的寬度,因此如果你想使用多塊 GPU,,確保在 PCIe 端口之間有足夠的空間,。確保你的主板不僅有 PCIe 端口,,同時還支持你想運行的 GPU 的設置。如果你在 newegg 上搜索選擇的主板并查看規(guī)格頁面上的 PCIe 部分,,通??梢哉业较嚓P(guān)信息。
其它設備
后面作者還介紹了供電單元,、冷卻設備和機箱等,,不過限于篇幅這里只做簡要的總結(jié),更詳細的內(nèi)容請查看 Tim Dettmers 的原博客,。
1. 電源供應設備(PSU)
一般說來,,你需要一個給你未來所有 GPU 充足供應的 PSU。隨著時間的推移,,GPU 通常會更加高效節(jié)能,;因此,盡管其它組件會需要更換,,PSU 會用很久,,一個好的 PSU 是一個好的投資。CPU 加上 GPU 所需瓦特,,再加上其它組件額外所需的功率(約 10%),,我們就能計算出電力峰值所需瓦特數(shù),再加 10% 作為緩沖就行了,。
例如如果你有 4 塊 GPU,,每塊 250 瓦特,一塊 CPU 150 瓦特,,那么我們至少需要 4×250 + 150 + 100 = 1250 瓦特的 PSU,。而我們一般會再加 10% 左右以作為緩沖,即選擇 1400 瓦特 PSU,。
2.CPU 和 GPU 散熱
GPU 空氣散熱:對于單個 GPU 或者彼此之間具有空隙的多個 GPU(如可以安裝 3-4 個 GPU 的情況下安裝了 2 個)來說,,空氣散熱既安全又穩(wěn)定。但是,,當你冷卻 3-4 個 GPU 時,,可能會犯一個很大的錯誤。在這種情況下空氣散熱的冷卻效果不太好,,你要仔細考慮自己的選擇,。
GPU 水冷散熱:對于多塊 GPU,水冷能確保最強勁的 4 塊 GPU 集群設置中保持溫度,。但相對而言更貴一些,,水冷每塊 GPU 需要花費大約 100 美元和一些額外的前期成本(大約 50 美元)。水冷還需要一些額外的工作來組裝計算機,不過現(xiàn)在有很多詳細的指南,。
所以最后的散熱策略很簡單,,對于單塊 GPU,空氣散熱是最好的,,當然也可以添加水冷以提升硬件性能,。對于多塊 GPU,尤其是 GPU 間空隙比較小的設備,,比較建議使用水冷,,且你可以嘗試為 GPU 找到一體化(AIO)水冷解決方案。
3. 機箱
當你選擇機箱時,,要確保它能滿足你 GPU 的長度要求,這樣它才能在主板上放穩(wěn),。多數(shù)機箱都能滿足要求,,但如果你選的是一個小機箱,就需要多加留心,。要核查它的面積和規(guī)格,,你也可以嘗試用 google 的圖片搜索引擎,看看能不能找到 GPU 放在上面的圖片,。此外,,如果你使用定制化的水冷設備,你需要確保機箱的空間足夠裝下散熱器,。
4. 顯示器
我在我的 3'27 英寸顯示器上付出了可能是我從未有過的大代價,,買了幾個顯示器后,效率提高了很多,。如果我只能用一臺顯示器,,那我的效率肯定會大打折扣。別在這上面和自己過不去,,如果你不能有效的運轉(zhuǎn)一個快速的深度學習系統(tǒng),,那它又有什么用?
總結(jié)
GPU:RTX 2070 ,、RTX 2080 Ti,、GTX 1070、GTX 1080 和 GTX 1080 Ti,。
CPU:每個 GPU 1-2 核,,這取決于你的數(shù)據(jù)預處理。只要主頻大于 2GHz,,那 CPU 就應該支持我們想要運行的大量 GPU,,PCIe 通道并不是太重要。
RAM:
時鐘頻率無關(guān)緊要,買更便宜的 RAM,;
購入至少和你已有 GPU 內(nèi)存大小相同的 CPU 內(nèi)存,;
只有更需要時才買更多的 RAM;
如果要使用超大規(guī)模的數(shù)據(jù)集,,那么需要更多的內(nèi)存,。
硬盤驅(qū)動器/SSD:
用于存儲數(shù)據(jù)的硬盤驅(qū)動器至少需要 3TB;
使用 SSD 預處理小數(shù)據(jù)集,。
PSU:
GPU+CPU+10% 就是你必需的電源供應量,,再將總電量乘以 110% 而獲得最終所需要的電源功率;
如果使用多塊 GPU,,還要增加一些額外的電源供應量,;
確保 PSU 有足夠的 PCIe 連接器(6+8pins)。
散熱:
CPU,,使用標準的 CPU 散熱器或一體化的水冷解決方案,;
GPU,使用空氣散熱,、使用鼓風機式的散熱器,、配置風扇的速度。
主板:
盡可能獲得更多的 PCIe 插槽,,為未來增加 GPU 做好準備,。