編者按:在各大技術公司紛紛開源框架的背景下,人工智慧日益成為普通開發者也能折騰的東西。當然,要想自己也能玩玩人工智慧,你需要一套合適的硬體。如何才能搭建一套合適的人工智慧,尤其是當今最火的深度學習的硬體呢?為了幫助大家避免一些硬體配置的坑,深度學習的資深玩家Tim Dettmers將自己的經驗教訓總結成了這篇深度學習的完全硬體指南,供各位玩家參考。
深度學習是一項非常耗算力的工作,所以你得有一個帶很多內核的CPU,對吧?或者買高速CPU也許是浪費?在開發深度學習系統的時候,你能夠做的最糟糕的事情之一就是在不必要的硬體上浪費錢。以下我將一步步地引導你了解搭建一套廉價的高性能系統所需的硬體。
這些年來,我總共搭建了7臺不同的深度學習工作站。雖然進行了精心的研究和論證,但我在選擇硬體部件方面還是犯了不少錯誤。在本篇指南中,我希望分享一下我在這些年學到的經驗,以便你不再犯我犯過的那些錯誤。
本文將按照錯誤的嚴重程度來排序。這意味著通常最浪費錢的錯誤排在前面。
GPU圖形處理器
本文假設你使用GPU來做深度學習。如果你正在為深度學習搭建或者升級系統的話,省掉GPU是不明智的做法。GPU是深度學習應用的核心——它對處理速度的改進實在是太大了,容不得無視它的存在。
我之前在GPU推薦的博文中已經詳細討論過GPU的選擇,挑選GPU大概是你做深度學習系統最關鍵的選擇了。在選擇GPU時你可能會犯額錯誤主要有3個:(1)糟糕的性價比,(2)內存不足,(3)冷卻不好。
要想有好的性價比,我一般建議用RTX 2070或者 RTX 2080 Ti。如果你用這些板卡你得用16位的型號。否則的話,去eBay淘GTX 1070、GTX 1080、GTX 1070 Ti是不錯的選擇,這些GPU你可以用於32位(但不是16位)。
選擇GPU的時候要當心內存需求。在內存相同的情況系,與GTX板卡相比,可以跑16位的RTX板卡能訓練的模型規模可以是前者的2倍。而且此類RTX板卡還有內存優勢,選擇RTX板卡並學習如何有效地使用16位模型能帶你走很遠的路。一般而言,對內存的需求大概是這樣的:
追求最高水準的研究:>=11 GB探索有趣架構的研究:>=8 GB任何其他研究:8 GBKaggle競賽:4 – 8 GB初創企業:8 GB(不過要根據特定應用領域情況來確定模型規模)公司: 8GB用於原型開發, >=11 GB用於訓練冷卻是要留意的另一個問題,尤其是如果你買多塊RTX板卡的話。如果你想把GPU插在相互挨在一起的PCIe槽的話,你的確保自己的GPU有一塊風力強勁的風扇。否則的話你可能就要遇到溫度問題,然後你的GPU就會變慢(約30%)並且死得更快。
排成一排的嫌疑犯
RAM
你認得出哪個硬體部件要對性能糟糕負責任嗎?或者也許是CPU的錯?RAM的主要錯誤是買時鐘頻率太高的RAM。第二個錯誤是買的RAM不足,沒法獲得流暢的原型體驗。
所需的RAM時鐘頻率
RAM時鐘頻率是內存公司推銷的噱頭,引誘你買「更快」的RAM其實得到的性能好處寥寥。最好的解釋可以看看Linus Tech Tips的視頻《RAM速度真的重要嗎?》
此外,重要的一點是要知道RAM速度對於更快的CPU RAM->GPU RAM傳輸來說並不相干。這是因為(1)如果你用的是固定內存,你的小批量(mini-batches)數據會在不需要CPU參與的情況下傳輸給GPU,以及(2)如果你不用固定內存,那麼用高頻內存和低頻內存的性能差別大概在0-3%之間——所以還是把你的錢花在其他地方吧!
RAM大小
RAM大小並不影響深度學習的性能。然而,它有可能妨礙你舒服地執行你的GPU代碼(不需要交換到硬碟去)。為了舒服地使用GPU,你應該要有足夠的RAM。這意味著你至少應該有匹配最大GPU的RAM容量。比方說,如果你有一塊代24GB內存的Titan RTX,那你至少應該有24 GB的RAM。然而,如果你的GPU不止一塊的話,你不需要有更多的RAM。
「RAM匹配最大的GPU內存」這條策略的問題是,如果你處理的是大型數據集的話,你可能仍然會RAM不足。這裡的最佳策略是匹配你的GPU,如果你覺得自己的RAM不足的話就多買點。
另一項策略則受心理影響:心理學告訴我們,專注是一種會隨著時間流逝而減少的資源。RAM是你可以預留注意力資源給更困難的編程問題的少數硬體之一。如果你有更多RAM的話,就不需要花費大量時間去繞開RAM瓶頸,而是把你的注意力集中在更緊迫的事情上。RAM多的話你就可以避開那些瓶頸,節省時間並提高更迫切問題的生產力。尤其是在Kaggle競賽上。我發現額外的RAM對於特徵工程非常有用。所以如果你有錢並且要做大量的預處理的話,則額外的RAM也許是個好的選擇。所以如果採取這項策略的話,你會想馬上要更多的廉價RAM而不是等到後面。
CPU
大家犯的主要錯誤是把太多的注意力放在了CPU的PCIe通道上。你不應該太過關注PCIe通道。相反,只需要看看你的CPU和主板組合是否支持你想要跑的GPU數量即可。第二個最常見的錯誤是CPU過於強大。
CPU與PCIe(串行總線)
對於PCIe通道大家都瘋了!然而,事實上它對深度學習性能幾乎毫無影響。如果你有一個GPU,只有在需要迅速將你的數據從CPU RAM傳輸到GPU RAM時才用到PCIe通道。但是,一批32張的ImageNet圖像(32x225x225x3)以及32位模型用16通道需要1.1毫秒,8通道需要2.3毫秒,4通道需要4.5毫秒。這些都是理論數字,實際上你經常會看到PCIe速度要慢一半——但是這仍然是非常快了!PCIe的時延通常是納秒級的,所以時延可以忽略不計。
那麼小批量的32張ImageNet圖像和RestNet-152模型的時間窗口是這樣的:
前向與反向過程:216毫秒16通道PCIe CPU->GPU傳輸:約2毫秒(1.1毫秒理論值)8通道PCIe CPU->GPU傳輸:約5毫秒(2.3毫秒理論值)4通道PCIe CPU->GPU傳輸:約9毫秒(4.5毫秒理論值)也就是說,從4通道增加到16通道性能提升只有3.2%左右。然而,如果你用的是PyTorch的數據加載器+固定內存的話,性能提升為0%。所以如果你用單GPU的話就不要浪費錢到PCUe通道上了!
當你選擇CPU PCIe通道以及主板PCIe通道時,確保你選擇的組合支持你想要數量的GPU。如果你買的主板支持2GPU,並且你最終想要兩塊GPU的話,確保你買的CPU支持2塊GPU,但未必需要看PCIe通道的情況。
PCIe通道與多GPU並行
如果你採用數據並行機制利用多個GPU來訓練網絡的話,PCIe通道重要嗎?我曾經在ICLR2016上發表過一篇文章談這個問題,可以告訴你的是,如果你有96個GPU,那PCIe就真的很重要。然而,如果捏GPU數量在4個及以下的話,那通道就沒太大關係。如果你用23個GPU做並行化,我根本就不在意通道的事情。GPU的情況下,我會確保每GPU可得到PCIe通道的支持(總計就是32通道)。既然根據經驗法則幾乎沒人會跑超過4GPU的系統:所以就不要為了爭取更多PCIe通道數/GPU多花錢了——因為花了也是白花!
所需CPU內核數
要想對CPU做出明智選擇我們首先需要理解CPU以及CPU與深度學習的關係。CPU對深度學習有何貢獻呢?當你在GPU上跑深度學習網絡時CPU幾乎不做什麼計算。基本上它(1)發起GPU功能調用,(2)執行CPU功能。
目前為止CPU最有用的應用是數據處理。有兩種不同的常見數據處理策略,它們各有不同的CPU需求。
第一種策略是在訓練時進行預處理:
循環:
加載小批量數據
預處理小批量數據
訓練小批量數據
第二種策略是在進行任何訓練前預處理:
處理數據循環: 1、加載預處理小批量數據
2、訓練小批量數據
對於第一種策略,帶多核的好的CPU可顯著提升性能。對於第二種策略,你就不需要好的CPU了。對於第一種策略,我建議每GPU最少配置4線程——通常是每GPU 2內核。對此我沒有做過嚴格的硬體測試,但你應該得到每額外內核/GPU 0-5%的性能提升。
對於第二種策略,我建議每GPU最小配置2線程——通常就是每GPU一個內核。如果你採用的是第二種策略並且內核數很多的話在性能方面你不會看到太明顯的提升。
所需的時鐘頻率
大家一想到高速CPU往往首先想到的是時鐘頻率。4GHz要比3.5GHz好對吧?在比較相同架構(比如英特爾Ivy Bridge)的處理器這個結論一般是對的,但是架構不同的就不好比了。此外,這個也未必都是最好的性能評測指標。
深度學習的情況下CPU完成的計算其實是很少的:一般就是這裡增加幾個變量,那裡計算一下布爾表達式,對GPU或者在程序內進行一些函數調用——這些都要靠CPU的內核時鐘頻率。
雖說這些理由似乎通情達理,但事實上我在跑深度學習程序時CPU利用率卻達到了100%,問題出在哪裡呢?我試著對CPU核心時鐘頻率做了一些降頻處理來一探究竟。
MNIST與ImageNet數據集的CPU降頻:性能用不同CPU核心時鐘頻率跑200次MNIST或者50次ImageNet所需時間來衡量,以最快時鐘頻率所得結果作為每塊CPU的基線。比較結果:從GTX 680升到GTX Titan大概有+15%的性能提升;GTX Titan升級到GTX 980又有+20%的提升;對於任何GPU來說GPU超頻可帶來約+5%的性能提升。
注意,這些實驗都是在過時的硬體上進行的,不過,這些結果對於相同的CPU/GPU應該還是一樣的。
硬碟/SSD
硬碟通常不是深度學習的瓶頸。不過,如果你幹蠢事的話它就會傷害到你:如果你有時候需要從硬碟讀取數據(阻塞等待)的話,則一個100MB/s的硬碟會讓你付出代價——大小為32的小批量ImageNet數據集就要185毫秒!然而,如果你在使用前採取異步獲取數據的話(比如torch vision加載器),儘管這個小批量的加載時間還是185毫秒,但是並不會影響性能,因為大多數ImageNet的深度神經網絡計算時間都是200毫秒左右,也就是說上一批計算完時下一次的預加載已經完成了。
不過,出於舒心和生產力的考慮我建議用SSD:這樣程序啟動和響應會更快,對大文件的預處理也要快一點。如果你買的是NVMe SSD,那麼相對於一般SSD體驗還會更加流暢。
因此理想的配置是用一塊大但慢的硬碟來裝數據集,用SSD來改善舒適度和生產力。
電源
一般來說,你當然希望電源可以適應所以將來要用的GPU。GPU的能效通常會逐步變高:所以儘管其他的部件可能需要替換,但電源可以用很久,一次買個好電源是不錯的投資。
電源功率要買多大呢?你可以把CPU、GPU所需功率加起來再考慮10%的其他部件開銷並作為用電高峰的緩衝。比方說,如果你有4個GPU,每個是250瓦TDP,以及一個150瓦TDP的CPU的話,則對電源的最小需求為4×250 + 150 + 100 = 1250瓦。我通常會再加10%以確保萬無一失,這樣的話需求就是1375瓦。取整就是1400瓦的電源。
還有重要的一點要注意,有時候即便電源功率足夠,但可能它額8針或6針接線不夠。確保電源的接線數量足以連上你所有的GPU!
還有一點就是要買高功效的電源——尤其是如果你要跑很多GPU並且跑很久的話。
滿功率(1000-1500瓦)跑4GPU的系統來訓練卷積神經網絡2周需要消耗300-500kWh,德國的電費是20分/kWh,所以大概就是600-100歐元。如果這個價格是針對100%能效的話,用80%能效比電源訓練這樣一個網絡還要額外多18-26歐元!單GPU的就少很多,但道理是一樣的——多花點錢到高能效電源上面是有道理的。
沒完沒了地跑幾個GPU會顯著增加你的碳排放。如果你想做個負責任的人的話,可以考慮採用碳平衡方案,比如紐約大學的Machine Learning for Language Group (ML2)——實現簡單、廉價,應該成為深度學習研究人員的標準。
CPU與GPU製冷
製冷很重要,而且會成為降低性能的重大瓶頸,其影響甚至比糟糕的硬體選擇還要大。標準的散熱器或者一體式水冷解決方案對你的CPU來說也許就OK了,但是GPU需要特別考慮。
風冷GPU
對於單GPU,或者雖然有多個GPU但間距足夠的話(3-4 GPU插槽裝2個GPU),風冷安全可靠。不過,這也是你在對3-4個GPU進行冷卻可能會犯的最大錯誤之一,這種情況下你需要仔細考慮你的選項。
跑算法的時候,現代GPU會提高速度——以及能耗——到極限,但只要GPU達到溫度閾值(一般是80°),GPU就會降速一面突破溫度閾值。這既保證了最佳性能同時又保證了GPU不會過熱。
然而,風扇速度典型的預編程調度安排對於深度學習來說設計得都很糟糕,所以這種溫度閾值在啟動深度學習程序幾秒鐘之內就達到了。其結果是性能下降(0-10%),如果是多GPU熱量相互影響的話會更加顯著(10-25%)。
由於英偉達的GPU首先是遊戲GPU,所以是針對Windows優化的。用Windows幾個點擊就能改變風扇轉速的調度,但是Linux就沒那麼簡單了,鑑於大多數深度學習庫都是針對Linux編寫的,這會成為問題。
Linux下的唯一選項是給你的Xorg伺服器(Ubuntu)加一個「coolbits」的配置。這個辦法對單GPU很有效,但如果你有多個GPU而且有些是無頭(headless)的話,比如沒有連顯示器的話,你就得模擬一個顯示器,而這是很麻煩的。我嘗試過很久,後來用一張live boot CD弄了幾個小時才恢復我的圖形設置——我一直都不能讓無頭GPU正確工作。
如果你用風冷跑3-4個GPU的話,要考慮的最重要的一點是要留意風扇設計。鼓風式設計是將空氣從機箱後背排出,讓新鮮的更涼快的空氣進入GPU。非鼓風式風扇則是吸收GPU附近的空氣來冷卻GPU。不過,如果你有幾個GPU挨著的話,周圍就沒有冷空氣可言了,帶非鼓風式風扇的GPU就會越來越熱,直到它們自己降速來冷卻溫度。在3-4GPU的配置下要不惜一切代價避免非鼓風式風扇。
多GPU的水冷
製冷還有個選項,那就是水冷,這個辦法更貴,也更講究技巧。如果你只有單GPU或者雙GPU有一定間距的話我不推薦用水冷。不過,水冷可以保證4GPU配置下最強悍的GPU保持涼爽,這是風冷不可能做到的。水冷的另一個優勢是靜音,如果你的GPU環境是有人工作的話這是個加分項。水冷成本大概是每GPU100美元左右,還有一些額外的預付成本(大概50美元)。水冷還需要費點功夫去組裝計算機,但是網上有很多詳細指南,所以只需要多幾個小時就行。維護不應該那麼複雜或者費力。
大機箱製冷?
為了我的深度學習集群,我買來了大機箱,因為GPU區配置了額外的風扇,但我發現這基本上沒什麼用:大概就降了2-5°,不值得那麼大的投資,而且機箱又笨重。最重要的是對GPU直接製冷的解決方案——不要想為了GPU製冷能力而選擇昂貴的機箱。買便宜的,機箱應該裝得下GPU,僅此而已!
關於製冷的結論
所以說到底很簡單:對於單GPU來說風冷是最好額。對於多GPU來說,你應該採用鼓風機式的風冷並且接受一點點的性能下降(10-15%),或者多花點錢搞水冷,性能不會受損,但這個配置起來要難點。在特定情況下風冷、水冷都是合理的選擇。不過出於簡單性的考慮一般推薦風冷——跑多GPU的話買鼓風式散熱的GPU。如果你想用水冷,那就試試GPU一體式水冷解決方案。
主板
你的主板應該有足夠的PCIe埠來支持你想跑得到GPU數量(通常限制在4個GPU以內,即便你的PCIe插槽不止);記住,大多數GPU都要佔2個PCIe插槽,所以你想用多GPU的話買的主板PCIe插槽間距要足夠。確保你的主板不僅有PCIe插槽,也要支持你想跑的GPU設置。如果你上newegg搜索你選的主板然後看看規範頁的PCIe板塊的話通常會找到信息的。
計算機機箱
當你選擇機箱時,應該要確保它支持標準長度的GPU。大多數機箱都支持標準長度GPU,不過如果你買的是小機箱的話你應該保持警惕。要看看它的尺寸和規範;你還可以試試Google圖像搜索一下那個型號,看看能否在結果中找到帶GPU的圖片。
如果你用定製的水冷系統,確保你的機箱又足夠空間留給冷卻水箱。尤其是如果你用水冷來給GPU散熱的話。每個GPU的冷卻水箱都需要一些空間——確保你的配置能放得進去。
顯示器
我一開始也覺得寫顯示器是很蠢的,但其實有沒有顯示器大不一樣,其重要性足以需要寫一寫。
我在3個顯示器上面花的錢也許是我最划算的一筆投資了。在使用多顯示器時我的生產力提高了很多,如果我只有一個顯示器的話我會覺得像殘廢了一樣的。如果你不能以高效的方式操作的話,深度學習系統快又有何用呢?
我做深度學習時的典型布局:左:文字工作,Google搜索,gmail,stackoverflow;中:編碼;右:輸出窗口, R文件夾,系統監控,GPU監控,待辦事宜,其他小應用。
搭建PC的一些建議
很多人害怕自己組裝計算機。硬體部件很貴,你又不想做錯事情。但其實是很簡單的,因為組件相互之間並沒有捆綁關係。主板手冊通常對如何組裝一切都有詳細的說明,網上也有大量的指導和步驟演示,就算你沒有經驗也能完成整個過程。
組裝計算機的好處是,裝過一次之後你就了解了組裝計算機需要了解的一切,因為所有的計算機組裝原理都是一樣的——所以組裝一臺計算機會成為一項你可以不斷運用的生活技能。所以沒理由退縮!
結論/摘要
GPU:RTX 2070 或者RTX 2080 Ti。淘二手的 GTX 1070、 GTX 1080、 GTX 1070 Ti以及GTX 1080 Ti也不錯!
CPU:視處理數據方式而定,每GPU 1-2核。> 2GHz;CPU應該支持你想跑的GPU數量。PCIe通道不影響。
內存:
—時鐘頻率不影響——買最便宜的RAM。
—至少買跟最大的GPU RAM匹配的CPU RAM。
—只有在需要的適合才多買RAM。
—更多的RAM可能有用,如果你頻繁操作大數據集的話。
硬碟/SSD:
—硬碟用於數據(>= 3TB)
—要想舒適或處理小數據集用SSD
電源:
—累計GPU+CPU的功耗。然後總數乘以110%作為功耗需求。
如果用多GPU的話用高功效電源。
確保你的電源有足夠的PCIe連接器(6+8針)
冷卻:
—CPU:用標準CPU散熱器或者一體式水冷解決方案
—GPU:的
—用風冷
—用「鼓風式」風扇的GPU,如果你買多個GPU的話
—在你的Xorg配置文件裡面設置coolbit標誌來控制風扇速度
主板:
—根據未來GPU需要儘可能多地配置PCIe插槽(一個GPU佔2個插槽;每小題最多4GPU)
顯示器:
—額外的顯示器也許能讓你比額外的GPU更有效率。
原文連結:http://timdettmers.com/2018/12/16/deep-learning-hardware-guide/
編譯組出品。編輯:郝鵬程。