GPU在深度學(xué)習(xí)中究竟起了什么作用
點(diǎn)擊上方“小白學(xué)視覺”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)

圍繞深度學(xué)習(xí)的“噪聲”經(jīng)常誤導(dǎo)外行人以為這是一種新發(fā)明的技術(shù),使他們?yōu)橹徽竦氖钱?dāng)他們知道深度學(xué)習(xí)早在1940-1950年代就奠定了基礎(chǔ)。還有很長的歷史,其中最流行的深層神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)和理論已經(jīng)在整個(gè)20世紀(jì)后半期提出深的學(xué)問。如果是這種情況,那么你們可能會問,為什么在當(dāng)前時(shí)代發(fā)生了深度學(xué)習(xí)革命,為什么不回溯幾十年。
簡單來說,在那些時(shí)期內(nèi),不存在有效訓(xùn)練大型神經(jīng)網(wǎng)絡(luò)所需的正確硬件和計(jì)算能力。因此所有的理論大部分都在紙上,沒有實(shí)際的支持。盡管專門的研究人員繼續(xù)在神經(jīng)網(wǎng)絡(luò)上開展工作,直到2000年代下半葉,當(dāng)硬件革命開始興起時(shí),但它大部分都是不切實(shí)際的理論。
圖1 并行執(zhí)行神經(jīng)網(wǎng)絡(luò)的矩陣計(jì)算

圖2 GPU與CPU架構(gòu)
讓我們比較一下CPU和GPU的體系結(jié)構(gòu),以了解為什么GPU在神經(jīng)網(wǎng)絡(luò)上執(zhí)行操作要比CPU更好。
第一個(gè)主要的明顯區(qū)別是CPU僅具有幾個(gè)內(nèi)核來執(zhí)行算術(shù)運(yùn)算,而GPU可以具有成千上萬個(gè)這樣的內(nèi)核。從一個(gè)角度來看,一個(gè)標(biāo)準(zhǔn)的性能良好的CPU有8個(gè)內(nèi)核,而功能強(qiáng)大的CPU Intel Core i9-10980XE有18個(gè)內(nèi)核。另一方面,出色的GeForce GTX TITAN Z NVIDIA GPU具有5760個(gè)CUDA內(nèi)核。如此多的內(nèi)核使GPU可以非常高效地進(jìn)行并行計(jì)算以產(chǎn)生高吞吐量。GPU還具有比CPU高的內(nèi)存帶寬,從而使GPU可以一次在存儲單元之間移動(dòng)大量數(shù)據(jù)。
由于其高內(nèi)存帶寬和并行化,GPU可以立即加載神經(jīng)網(wǎng)絡(luò)矩陣的很大一部分,并進(jìn)行并行計(jì)算以產(chǎn)生輸出。另一方面,與GPU相比,CPU將以幾乎可以忽略的并行化順序加載數(shù)字。這就是為什么對于具有大型矩陣運(yùn)算的大型深度神經(jīng)網(wǎng)絡(luò)而言,GPU可以勝過CPU的原因。
應(yīng)該注意的是,擁有如此多的內(nèi)核并不能使GPU在所有操作上都優(yōu)于CPU。由于其低延遲,CPU可以更快地處理無法分解為并行化的任何操作。因此,CPU將比GPU更快地計(jì)算順序浮點(diǎn)運(yùn)算。

圖3 Voltas Tensor核心性能
隨著GPU在深度學(xué)習(xí)中的廣泛采用,NVIDIA在2017年推出了GPU Tesla Tesla V100,它具有新型的Voltas架構(gòu),該架構(gòu)具有稱為Tensor Core的專用內(nèi)核,以支持神經(jīng)網(wǎng)絡(luò)的特定張量操作。NVIDIA聲稱,Volta Tensor Core的吞吐率比使用常規(guī)CUDA的前代產(chǎn)品高出12倍。

圖4 矩陣的計(jì)算操作支持張量核心
其背后的基本方法是Tensor Core專門用于將兩個(gè)4x4 FP16矩陣相乘并在其中添加4x4 FP16或FP32矩陣(FP代表浮點(diǎn)數(shù))。這樣的矩陣運(yùn)算在神經(jīng)網(wǎng)絡(luò)中非常普遍,因此具有一個(gè)專用的Tensor Core進(jìn)行優(yōu)化的優(yōu)勢,以使其比傳統(tǒng)的CUDA內(nèi)核執(zhí)行得更快。
到目前為止,我們的討論集中在GPU的硬件方面?,F(xiàn)在讓我們了解程序員如何利用NVIDIA GPU進(jìn)行深度學(xué)習(xí)。在前面的部分中,我們討論了CUDA,其中討論了CUDA是供程序員在GPU上執(zhí)行通用計(jì)算的API。CUDA具有對C / C ++和Fortran等編程語言的本機(jī)支持,以及對其他編程語言(如Python,R,Matlab,Java等)的第三方包裝支持。
CUDA的發(fā)布是為了牢記圖形設(shè)計(jì)社區(qū),盡管深度學(xué)習(xí)社區(qū)開始使用CUDA,但對于他們而言,專注于CUDA的低級復(fù)雜性而不是專注于神經(jīng)網(wǎng)絡(luò)是一項(xiàng)艱巨的任務(wù)。因此,NVIDIA在2014年發(fā)布了CUDNN,這是一個(gè)基于CUDA的專用于深度學(xué)習(xí)的庫,為神經(jīng)網(wǎng)絡(luò)的原始操作提供了功能,例如反向傳播,卷積,池化等。
只有認(rèn)真使用GPU,GPU才能加速深度學(xué)習(xí)管道,否則也會造成瓶頸。當(dāng)用戶嘗試通過GPU推送所有代碼而不考慮是否可以在GPU上并行執(zhí)行所有這些操作時(shí),通常會發(fā)生這種情況。
根據(jù)經(jīng)驗(yàn),只有可以并行執(zhí)行的計(jì)算密集型代碼才應(yīng)推送到GPU,其余所有序列代碼都應(yīng)發(fā)送到CPU。例如,用于數(shù)據(jù)清理,預(yù)處理的代碼應(yīng)在CPU上執(zhí)行,而用于神經(jīng)網(wǎng)絡(luò)訓(xùn)練的代碼應(yīng)在GPU上運(yùn)行,只有這樣,您才能看到性能的提升。

圖5 GPU加速
在本文中,我們了解了GPU如何在重新激發(fā)ML社區(qū)對神經(jīng)網(wǎng)絡(luò)的興趣并將深度學(xué)習(xí)帶入主流方面發(fā)揮如此重要的作用。以下是針對深度神經(jīng)網(wǎng)絡(luò)進(jìn)行編程時(shí)要考慮的一些要點(diǎn):
GPU用于大規(guī)模并行計(jì)算,因此應(yīng)用于大量數(shù)據(jù)處理。
僅當(dāng)將可分解為并行計(jì)算的操作發(fā)送到GPU,而其他操作應(yīng)在CPU上執(zhí)行時(shí),GPU才是有益的。
在使用大數(shù)據(jù)進(jìn)行模型訓(xùn)練時(shí),GPU更為有利,你們可以在其中對數(shù)據(jù)進(jìn)行分塊處理并利用并行計(jì)算。推論可能并非如此。如果推斷是在非??斓囊慌鷶?shù)據(jù)上發(fā)生的,但是如果推斷在每個(gè)數(shù)據(jù)點(diǎn)上是一個(gè)接一個(gè)地發(fā)生(實(shí)時(shí)推斷),則在GPU上加載模型可能不會導(dǎo)致性能提高。
盡管GPU支持研究人員和大公司通過深度學(xué)習(xí)創(chuàng)造奇跡,但它們的成本很高,超出了大多數(shù)愛好者的能力范圍。但是,Google Colab和Kaggle上有免費(fèi)的GPU免費(fèi)層選項(xiàng),但資源有限,初學(xué)者可以嘗試動(dòng)手。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測、分割、識別、醫(yī)學(xué)影像、GAN、算法競賽等微信群(以后會逐漸細(xì)分),請掃描下面微信號加群,備注:”昵稱+學(xué)校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進(jìn)入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

