GPU和AI越來越火,引起了大批投資者和開發(fā)者的注意。百度前首席科學家Andrew Ng提到,AI的春天已經(jīng)到來,其重要因素之一是GPU處理能力,能讓神經(jīng)網(wǎng)絡的智能可以隨數(shù)據(jù)增加而提升,突破了過去的AI所能達到的平臺。
圖片來自“視覺中國”
最近Google在ISCA2017上披露了TPU(Tensor Processing Unit)的細節(jié),繼Haswell CPU,Tesla K80 GPU之后,又增加了一種專門用于機器學習和神經(jīng)網(wǎng)絡的高性能武器。
數(shù)據(jù)分析和GPU
GPU不僅能實現(xiàn)數(shù)據(jù)庫的許多功能,而且其強大的計算能力,能實現(xiàn)實時分析。MapD和Kinetica是這方面比較有名的兩家公司。MapD用NVIDIA Tesla K40/K80實現(xiàn)了基于SQL和列式存儲的數(shù)據(jù)庫,無需索引,擅長任意多組合的條件查詢(Where)、聚合(Groupby)等,實現(xiàn)傳統(tǒng)關系型數(shù)據(jù)庫的BI功能,方便用戶自由地進行多條件查詢。性能優(yōu)勢也很明顯(尤其是響應時間)。
比如,MapD將1987-2008年全美國進出港航班的數(shù)據(jù)擴大10倍后,執(zhí)行全表掃描的報表任務,如"SELECT...GROUP BY...”。一臺帶有8張Tesla K40顯卡的服務器(8核/384G RAM/SSD)比3臺服務器(32核/244G RAM/SSD)組成的內(nèi)存數(shù)據(jù)庫集群快50-100倍。
GPU數(shù)據(jù)庫的另一大特色是可視化渲染和繪制。將OpenGL等的緩沖區(qū)直接映射成GPU CUDA里的顯存空間,原地渲染,無需將結(jié)果從內(nèi)存拷到GPU,可以實現(xiàn)高幀頻的動畫。也可以原地繪制成PNG或視頻stream,再發(fā)給客戶端,大大減少網(wǎng)絡傳輸?shù)臄?shù)據(jù)量。這些優(yōu)勢吸引了很多開發(fā)者。
在實時分析上比較有名的一家公司是Kinetica。他們開始時為美國情報機構(gòu)實時分析250個數(shù)據(jù)流。現(xiàn)在能用10個節(jié)點,基于20萬個傳感器,為美國郵政服務(USPS)提供15000個并行的實時分析、物流路由計算和調(diào)度等。
我國用GPU進行分析和挖掘的用戶也越來越多,想深入學習的朋友也不少。最快速的入門辦法是重復前人的實驗。弗吉尼亞大學的Accelerating SQL Database Operations on a GPU with CUDA里的開發(fā)環(huán)境和實驗,值得借鑒。他們用一張4G顯存的NVIDIA Tesla C1060,在一臺低配的服務器上(Xeon X5550(2.66GHz/4核),5G RAM),用5百萬行的表做查詢和匯總,響應時間30-60毫秒。
我們測過的最低配置是NVidia GTX 780,一千多塊,適合用來嘗試查詢和聚合。先用SQLite將SQL解析成多個OpCode步驟,然后在CUDA上實現(xiàn)一個虛機,來逐一實現(xiàn)每個步驟,直至將整個表逐行遍歷完。其中一些步驟可以并行,因此可用CUDA起幾萬個線程,每個線程處理一行。
深度學習和GPU
深度需要較高的計算能力,所以對GPU的選擇會極大地影響使用者體驗。在GPU出現(xiàn)之前,一個實驗可能需要等幾個月,或者跑了一天才發(fā)現(xiàn)某個試驗的參數(shù)不好。好的GPU可以在深度學習網(wǎng)絡上快速迭代,幾天跑完幾個月的試驗,或者幾小時代替幾天,幾分鐘代替幾小時。
快速的GPU可以幫助剛開始學習的朋友快速地積累實踐經(jīng)驗,并用深度學習解決實際問題。如果不能快速得到結(jié)果,不能快速地從失誤中汲取教訓,學起來會比較讓人灰心。Tim Dettmers利用GPU,在一系列Kaggle比賽里應用了deep learning,并在Partly Sunny with a chance of Hashtags比賽中獲了亞軍。他用了兩個較大的兩層深度神經(jīng)網(wǎng)絡,采用了ReLU激活函數(shù),用Dropout來實現(xiàn)正則化。這個網(wǎng)絡勉強能加載到6GB的GPU顯存里。
是否需要多個GPU?
Tim曾用40Gbit/s的InfiniBand搭建了一個小GPU集群,但他發(fā)現(xiàn)很難在多個GPU上實現(xiàn)并行的神經(jīng)網(wǎng)絡,而且在密集的神經(jīng)網(wǎng)絡上,速度提升也不明顯。小網(wǎng)絡可以通過數(shù)據(jù)并行更有效地并行,但對比賽里所用的這個大網(wǎng)絡,幾乎沒有提速。
后來又開發(fā)了一個8-bit壓縮方法,按理說,能比32-bit更有效地并行處理密集或全互聯(lián)的網(wǎng)絡層。但是結(jié)果也不理想。即使對并行算法進行優(yōu)化,自己專門寫代碼在多顆GPU上并行執(zhí)行,效果和付出的努力相比仍然得不償失。要非常了解深度學習算法和硬件之間具體如何互動,才能判斷是否能從并行里真的得到好處。
對GPU的并行支持越來越常見,但還遠未普及,效果也未必很好。僅有CNTK這一種深度學習庫通過Microsoft特殊的1-bit量化并行算法(效率較高)和塊動量算法(效率很高),能在多個GPU和多臺計算機上高效地執(zhí)行算法。
在96顆GPU的集群上用CNTK,可以獲得90-95倍的速度提升。下一個能高效地多機并行的庫可能是Pytorch,但還沒完全做好。如果想在單機上并行,可以用CNTK,Torch或Pytorch。速度可提升3.6-3.8倍。這些庫包含了一些算法,能在4顆GPU的單機上并行執(zhí)行。其他支持并行的庫,要么慢,要么這兩個問題都有。
多GPU,非并行
用多個GPU的另一個好處是,即使不并行執(zhí)行算法,也可以在每個GPU上分別運行多個算法或?qū)嶒?。雖然不能提速,但可以一次性了解多個算法或參數(shù)的性能。當科研人員需要盡快地積累深度學習經(jīng)驗,嘗試一個算法的不同版本時,這很有用。
這對深度學習的過程也很有好處。任務執(zhí)行得越快,越能更快地得到反饋,腦子就從這些記憶片段里總結(jié)出完整的結(jié)論。在不同的GPU上用小數(shù)據(jù)集訓練兩個卷積網(wǎng)絡,可以更快地摸索到如何能執(zhí)行得更好。也能更順地找到交叉驗證誤差(Cross validation error)的規(guī)律,并正確地解讀它們。還能發(fā)現(xiàn)某種規(guī)律,來找到需要增加、移除或調(diào)整的參數(shù)或?qū)印?/p>
總的來說,單GPU幾乎對所有的任務都夠了,不過用多個GPU來加速深度學習模型變得越來越重要。多顆便宜的GPU也能用來更快地學習深度學習。因此,建議用多個小GPU,而不是一個大的。
選哪種?
NVIDIA GPU,AMD GPU還是Intel Xeon Phi
用NVIDIA的標準庫很容易搭建起CUDA的深度學習庫,而AMD的OpenCL的標準庫沒這么強大。而且CUDA的GPU計算或通用GPU社區(qū)很大,而OpenCL的社區(qū)較小。從CUDA社區(qū)找到好的開源辦法和可靠的編程建議更方便。
而且,NVIDIA從深度學習的起步時就開始投入,回報頗豐。雖然別的公司現(xiàn)在也對深度學習投入資金和精力,但起步較晚,落后較多。如果在深度學習上采用NVIDIA-CUDA之外的其他軟硬件,會走彎路。
據(jù)稱,Intel的Xeon Phi上支持標準C代碼,而且要在Xeon Phi上加速,也很容易修改這些代碼。這個功能聽起來有意思。但實際上只支持很少一部分C代碼,并不實用。即使支持,執(zhí)行起來也很慢。Tim曾用過500顆Xeon Phi的集群,遇到一個接一個的坑,比如Xeon Phi MKL和Python Numpy不兼容,所以沒法做單元測試。因為Intel Xeon Phi編譯器無法正確地對模板進行代碼精簡,比如對switch語句,很大一部分代碼需要重構(gòu)。因為Xeon Phi編譯器不支持一些C++11功能,所以要修改程序的C接口。既麻煩,又花時間,讓人抓狂。
執(zhí)行也很慢。當tensor大小連續(xù)變化時,不知道是bug,還是線程調(diào)度影響了性能。舉個例子,如果全連接層(FC)或剔除層(Dropout)的大小不一樣,Xeon Phi比CPU慢。
預算內(nèi)的最快GPU
用于深度學習的GPU的高速取決于什么?是CUDA核?時鐘速度?還是RAM大?。窟@些都不是。影響深度學習性能的最重要的因素是顯存帶寬。
GPU的顯存帶寬經(jīng)過優(yōu)化,而犧牲了訪問時間(延遲)。CPU恰恰相反,所用內(nèi)存較小的計算速度快,比如幾個數(shù)的乘法(3*6*9);所用內(nèi)存較大的計算慢,比如矩陣乘法(A*B*C)。GPU憑借其顯存帶寬,擅長解決需要大內(nèi)存的問題。當然,GPU和CPU之間還有更復雜的區(qū)別,可以參見Tim在Quora上的回答。
所以,購買快速GPU的時候,先看看帶寬。
對比CPU和GPU的帶寬發(fā)展
芯片架構(gòu)相同時,帶寬可以直接對比。比如,Pascal顯卡GTX 1080和1070的性能對比,只需看顯存帶寬。GTX 1080(320GB/s)比GTX 1070(256GB/s)快25%。不過如果芯片架構(gòu)不同,不能直接對比。比如Pascal和Maxwell(GTX 1080和Titan X),不同的生產(chǎn)工藝對同樣帶寬的使用不一樣。不過帶寬還是可以大概體現(xiàn)GPU有多快。另外,需要看其架構(gòu)是否兼容cnDNN。絕大多數(shù)深度學習庫要用cuDNN來做卷積,因此要用Kepler或更好的GPU,即GTX 600系列或以上。一般來說,Kepler比較慢,所以從性能角度,應考慮900或1000系列。為了比較不同顯卡在深度學習任務上的性能,Tim做了個圖。比如GTX 980和0.35個Titan X Pascal一樣快,或者說Titan X Pascal比GTX快了差不多3倍。
這些結(jié)果并不來自于每張卡的深度學習benchmark測試,而是從顯卡參數(shù)和計算型benchmark(在計算方面,一些加密貨幣挖掘任務和深度學習差不多)。所以這只是粗略估計。真實數(shù)字會有些不同,不過差距不大,顯卡排名應該是對的。同時,采用沒有用足GPU的小網(wǎng)絡會讓大GPU看上去不夠好。比如128個隱藏單元的LSTM(批處理>64)在GTX 1080 Ti上跑的速度不比GTX 1070快多少。要得到性能區(qū)別,需要用1024個隱藏單元的LSTM(批處理>64)。
GPU跑大型深度學習網(wǎng)絡的性能比較
一般來說,Tim建議用GTX 1080 Ti或GTX 1070。這兩者都不錯。如果預算夠的話,可以用GTX 1080 Ti。GTX 1070便宜一點,比普通GTX Titan X(Maxwell)更快。兩者都比GTX 980 Ti更適合,因為顯存更大——11GB和8GB,而不是6GB。
8GB有點小,但對很多任務都足夠了,比如足夠應付Kaggle比賽里大多數(shù)圖像數(shù)據(jù)集合自然語言理解(NLP)的任務。
剛開始接觸深度學習時,GTX 1060是最好的選擇,也可以偶爾用于Kaggle比賽。3GB太少,6GB有時不太夠,不過能應付很多應用了。GTX 1060比普通Titan X慢,但性能和二手價格都和GTX 980差不多。
從性價比來看,10系列設計很好。GTX 1060,1070和1080 Ti更好。GTX 1060適合初學者,GTX 1070的用途多,適合初創(chuàng)公司和某些科研和工業(yè)應用,GTX 1080 Ti是不折不扣的全能高端產(chǎn)品。
Tim不太建議NVIDIA Titan X(Pascal),因為性價比不太好。它更適合計算機視覺的大數(shù)據(jù)集,或視頻數(shù)據(jù)的科研。顯存大小對這些領域的影響非常大,而Titan X比GTX 1080 Ti大1GB,因此更適合。不過,從eBay上買GTX Titan X(Maxwell)更劃算——慢一點,但12GB的顯存夠大。
GTX 1080Ti對大多數(shù)科研人員夠用了。額外多1GB的顯存對很多科研和應用的用處不大。
在科研上,Tim個人會選多張GTX 1070.他寧可多做幾次實驗,稍微慢一點,而不是跑一次實驗,快一點。NLP對顯存的要求不像計算機視覺那么緊,因此GTX 1070足夠了。他現(xiàn)在處理的任務和方式?jīng)Q定了最合適的選擇——GTX 1070。
選擇GPU時可以用類似的思路。先想清楚所執(zhí)行的任務和實驗方法,再找滿足要求的GPU?,F(xiàn)在AWS上的GPU實例比較貴且慢。GTX 970比較慢,而且二手的也比較貴而且啟動時顯卡有內(nèi)存問題??梢远嗷c錢買GTX 1060,速度更快,顯存更大,而且沒有顯存問題。如果GTX 1060太貴,可以用4G顯存的GTX 1050 Ti。4GB有點小,但也深度學習的起步也夠了。如果在某些型號上做調(diào)整,可以得到較好性能。GTX 1050 Ti適合于大多數(shù)Kaggle比賽,不過可能在一些比賽里發(fā)揮不出選手優(yōu)勢。