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