1. 引言
多年以后,面對(duì)圖形處理器(GPU)在人工智能、加密貨幣、高性能計(jì)算、自動(dòng)駕駛等多研究領(lǐng)域的廣泛應(yīng)用,如今的游戲發(fā)燒友們是否會(huì)回想起,1999年Nvidia發(fā)布專業(yè)游戲顯卡GeForce256時(shí)那個(gè)炎熱的夏天?
GPU應(yīng)用
GeForce256發(fā)布以后GPU一詞才被大眾所接受,實(shí)際上1994年索尼發(fā)布PS1的時(shí)候就提出了GPU的概念,當(dāng)時(shí)使用的是由東芝為索尼設(shè)計(jì)的GPU。
而后來(lái)在2002年ATI(已被AMD收購(gòu))提出的VPU(Visual Processing Unit)一詞則在時(shí)代的浪潮中消失無(wú)蹤。
從GeForce256發(fā)布至今的21年時(shí)間,GPU實(shí)現(xiàn)了從PC游戲時(shí)代到AI時(shí)代的巨大跨越。本文將和大家一起揭秘GPU為何能夠撬動(dòng)計(jì)算機(jī)圖形學(xué)和人工智能這兩個(gè)博大精深的領(lǐng)域。
2. GPU與計(jì)算機(jī)圖形學(xué)
今年3月18日,國(guó)際計(jì)算機(jī)學(xué)會(huì)ACM官方公布了2019年度圖靈獎(jiǎng)(計(jì)算機(jī)界的諾貝爾獎(jiǎng))獲得者Hanrahan和Catmull,以表彰他們對(duì)3D計(jì)算機(jī)圖形學(xué)的貢獻(xiàn)。
Hanrahan提出的renderMan很大程度上對(duì)GPU產(chǎn)生了影響。例如著色器(Shader)一詞的出現(xiàn),最先是由Pixar與1988年五月發(fā)布的renderMan接口規(guī)范中提出。
renderMan技術(shù)制作了一系列成功電影,其中包括《阿凡達(dá)》、《玩具總動(dòng)員》、《泰坦尼克號(hào)》等。
renderMan渲染的阿凡達(dá)
另外,Hanrahan和他的學(xué)生還開發(fā)了一種用于 GPU 的語(yǔ)言:Brook,并最終催生了 NVIDIA的CUDA。
事實(shí)上,計(jì)算機(jī)圖形學(xué)是一個(gè)廣泛的學(xué)科,其中包括:
- 物理模擬:涉及各個(gè)物理分支相關(guān)數(shù)學(xué)。
- 模型處理:微積分,線性代數(shù)、微分幾何、優(yōu)化理論。
- 渲染:微積分、概率、光學(xué)中相關(guān)數(shù)學(xué)。
而我們的GPU,正是用來(lái)為計(jì)算機(jī)圖形學(xué)中實(shí)時(shí)圖像渲染加速的。
GPU的硬件設(shè)計(jì)上引入了圖形管線,使得各任務(wù)可以通過流水線進(jìn)行并行處理。
同時(shí)通過可編程的著色器,使得GPU硬件能夠根據(jù)圖形學(xué)算法更好的被使用。
通過下一節(jié)我們可以詳細(xì)的了解到什么是GPU圖形管線和可編程著色器。
2.1 GPU圖形管線
GPU圖形管線共分為三個(gè)部分,分別是應(yīng)用程序階段、幾何階段、光柵化階段。
我們?cè)谧罱K在屏幕上看到的畫面,就是3D模型經(jīng)過這三個(gè)階段渲染后得到的。
GPU圖形管線
- 應(yīng)用程序階段
圖形渲染管線概念上的第一個(gè)階段,開發(fā)者通過程序的方式對(duì)圖元數(shù)據(jù)等信息進(jìn)行配置和調(diào)控,最后傳輸?shù)较聜€(gè)階段。
- 幾何階段
幾何階段分為模型視點(diǎn)變換、頂點(diǎn)著色、裁剪、屏幕映射等步驟。
模型視點(diǎn)變換 :由每個(gè)模型自己的局部坐標(biāo)系轉(zhuǎn)換到世界坐標(biāo)系,然后到視覺空間,通過將每個(gè)模型的各頂點(diǎn)坐標(biāo)與相應(yīng)的變換矩陣相乘來(lái)實(shí)現(xiàn)。
下圖是一個(gè)模型視點(diǎn)變換的實(shí)例,每個(gè)建模好的立方體的坐標(biāo)是以原點(diǎn)為中心的局部坐標(biāo)系,可以通過矩陣變換將各模型放到同一個(gè)世界坐標(biāo)系中。
模型視點(diǎn)變換
頂點(diǎn)著色:著色是指確定材質(zhì)的顏色,材質(zhì)的顏色實(shí)際上和光照有關(guān)。目前常用的光照模型是馮氏光照模型,包括環(huán)境、漫反射和鏡面光照。
裁剪 :對(duì)于在屏幕空間外的物體,我們并沒有必要去計(jì)算它的顏色等信息
屏幕映射:是將之前步驟得到的坐標(biāo)映射到對(duì)應(yīng)的屏幕坐標(biāo)系上。
- 光柵化階段
給定經(jīng)過變換和投影之后的頂點(diǎn),顏色以及紋理坐標(biāo)(均來(lái)自于幾何階段),給每個(gè)像素正確配色,以便正確繪制整幅圖像,這個(gè)過程叫光柵化。
光柵化包括三角形設(shè)定、三角形遍歷、像素著色、融合階段(如下圖所示)。
光柵化階段
三角形設(shè)定階段:計(jì)算三角形表面的差異和三角形表面的其他相關(guān)數(shù)據(jù)。
三角形遍歷階段:到那些采樣點(diǎn)或像素在三角形中的過程通常叫三角形遍歷。
像素著色階段:主要目的是計(jì)算所有需要逐像素計(jì)算操作的過程。
融合階段:合成當(dāng)前儲(chǔ)存于緩沖器中的由之前的像素著色階段產(chǎn)生的片段顏色。
2.2 可編程著色器
可編程著色器(shader),簡(jiǎn)單來(lái)說(shuō)就是可以運(yùn)行在GPU上的程序,這種程序會(huì)使用特定的著色語(yǔ)言(類似于C語(yǔ)言)。
2.2.1 著色器語(yǔ)言
不同圖形編程接口對(duì)應(yīng)不同的著色語(yǔ)言,Windows平臺(tái)上的圖形編程接口DirectX使用的是HLSL,而跨平臺(tái)的圖形編程接口OpenGL則是使用的GLSL,HLSL與GLSL的語(yǔ)法與C語(yǔ)言十分相似。而新一代圖形編程接口Vulkan則是直接定義了一套二進(jìn)制中間語(yǔ)言SPIR-V。
HLSL與GLSL都可以編譯成獨(dú)立于機(jī)器的中間語(yǔ)言(SPIR-V本身就是中間語(yǔ)言),然后在驅(qū)動(dòng)中通過編譯器轉(zhuǎn)換成實(shí)際的機(jī)器語(yǔ)言。這樣可以實(shí)現(xiàn)對(duì)不同硬件的兼容,因?yàn)椴煌?a target="_blank">廠商可以在驅(qū)動(dòng)中調(diào)用自己的編譯器生成自家GPU識(shí)別的指令。
有了著色語(yǔ)言以后,我們的工程師就可以通過高級(jí)語(yǔ)言來(lái)控制GPU對(duì)圖形進(jìn)行實(shí)時(shí)渲染。
但實(shí)際上我們的GPU一開始支持的Shader并沒有那么多。這與GPU硬件的可編程渲染架構(gòu)發(fā)展有關(guān)。
GPU可編程渲染架構(gòu)經(jīng)歷了分離渲染架構(gòu)到統(tǒng)一渲染架構(gòu)的進(jìn)化過程。
如下圖所示,左邊是分離渲染架構(gòu),右邊是統(tǒng)一渲染架構(gòu)。
分離架構(gòu) vs 統(tǒng)一渲染架構(gòu)
分離渲染架構(gòu):頂點(diǎn)著色器與像素著色器在兩個(gè)不同的著色器核(紅色部分)上運(yùn)行。
統(tǒng)一渲染架構(gòu):所有的著色器程序都可以在同一個(gè)著色器核上運(yùn)行。
與分離渲染架構(gòu)相比,統(tǒng)一渲染架構(gòu)更加靈活且利用率更高。
下面以DirectX(openGL也有對(duì)應(yīng)的版本)發(fā)布為線索,分別介紹分離渲染架構(gòu)與統(tǒng)一渲染架構(gòu)的發(fā)展歷史。
2.2.2 分離渲染架構(gòu)
- 1999年微軟DirectX7提供了硬件頂點(diǎn)變換的編程接口,NV的Geforc256對(duì)此進(jìn)行了支持,從此NV公司從眾多顯卡制造商中殺出重圍,逐漸占據(jù)了龍頭老大的地位。
- 2001年DirectX8發(fā)布,包含Shader Model 1.0標(biāo)準(zhǔn)。遵循這一模型的GPU可以具備頂點(diǎn)和像素的可編程性。同年,NVIDIA發(fā)布了Geforce3,ATI發(fā)布了Radeon8500,這兩種GPU支持頂點(diǎn)編程。但是這一時(shí)期的GPU都不支持像素編程,只是提供了簡(jiǎn)單的配置功能。
- 2002年,DirectX9.0公布,包含Shader Model 2.0。此模型是真正的可編程頂點(diǎn)著色器及像素著色器。頂點(diǎn)著色器主要執(zhí)行頂點(diǎn)的變換、完成光照與材質(zhì)的運(yùn)用及計(jì)算等相關(guān)操作。
- 2003年,NVIDIA和ATI發(fā)布的新產(chǎn)品都同時(shí)具備了可編程頂點(diǎn)處理和可編程像素處理器。從此,GPU具備了可編程屬性,也叫做可編程圖形處理單元。
2.2.3 統(tǒng)一渲染架構(gòu)
- 2006年包含DirectX10的 Shader Model4.0發(fā)布,采用統(tǒng)一渲染架構(gòu),使用統(tǒng)一的流處理器。這一時(shí)期,比較有代表性的GPU有NVIDIA的Geforce9600和ATI的Radeon 3850。
- 2010年,包含DirectX11的Shader Model 5.0 發(fā)布,增加了曲面細(xì)分著色器、外殼著色器、鑲嵌單元著色器、域著色器、計(jì)算著色器。這一時(shí)期比較有代表性的GPU是GeForece405
- 2014年,DirectX 12發(fā)布,主要特性有輕量化驅(qū)動(dòng)層、硬件級(jí)多線程渲染支持、更完善的硬件資源管理,比較有代表性的GPU有GeForceGT 710
- 2018,DirectX 12.1發(fā)布,代表性GPU是TITAN RTX,擁有1770MHz主頻,24G顯存,384位帶寬,支持8K分辨率。
以上僅列舉了部分Shader Model的特性,如要查看完整特性,有興趣的同學(xué)可以參考這個(gè)鏈接Shader Model
2.3 小結(jié)
上一節(jié)介紹了GPU渲染架構(gòu)發(fā)展歷史、GPU圖形管線、以及能夠在GPU上運(yùn)行的高級(jí)著色語(yǔ)言。
可以看到,GPU對(duì)圖形渲染的過程需要并行處理海量數(shù)據(jù),涉及大量矩陣運(yùn)算,這一特性使得GPU能夠在人工智能應(yīng)用中發(fā)揮巨大的作用。
下一節(jié)我們將看到GPU的這些特性是如何為深度學(xué)習(xí)加速的。
3. GPU與人工智能
2018年,國(guó)際計(jì)算機(jī)學(xué)會(huì)將圖靈獎(jiǎng)?lì)C發(fā)給了深度學(xué)習(xí)領(lǐng)域的三位大師Hinton,LeCun 和 Bengio。
深度學(xué)習(xí)剛被提出的時(shí)候曾經(jīng)遭到學(xué)術(shù)屆的質(zhì)疑,而如今卻成為了人工智能領(lǐng)域的熱點(diǎn)。
人工智能的三大要素:算法、算力、大數(shù)據(jù)。
深度學(xué)習(xí)被質(zhì)疑的一部分原因正是因?yàn)楫?dāng)時(shí)的計(jì)算能力無(wú)法滿足深度學(xué)習(xí)的要求,而如今異構(gòu)計(jì)算則成為了深度學(xué)習(xí)的重要支柱。
使用不同的類型指令集、不同的體系架構(gòu)的計(jì)算單元,組成一個(gè)混合的系統(tǒng),執(zhí)行計(jì)算的特殊方式,就叫做異構(gòu)計(jì)算。
3.1 異構(gòu)計(jì)算
目前關(guān)于深度學(xué)習(xí)流行的異構(gòu)解決方案共三種,分別是ASIC、FPGA、GPU。
但是從開發(fā)人員數(shù)量和受歡迎程度以及生態(tài)系統(tǒng)來(lái)說(shuō),GPU無(wú)疑是最有優(yōu)勢(shì)的。
通過下面三種方案的對(duì)比,我們可以看到這三種方案各自的優(yōu)缺點(diǎn)。
- CPU+ASIC
ASIC即專用集成電路,是指應(yīng)特定用戶要求和特定電子系統(tǒng)的需要而設(shè)計(jì)、制造的集成電路。
優(yōu)點(diǎn)::體積小、功耗低、計(jì)算性能高、計(jì)算效率高、芯片出貨量越大成本越低。
缺點(diǎn):算法固定,一旦算法變化就無(wú)法使用。目前人工智能算法遠(yuǎn)沒有到算法平穩(wěn)期,ASIC專用芯片如何做到適應(yīng)各種算法是個(gè)最大的問題。
實(shí)例:寒武紀(jì)的NPU、地平線的BPU、Google的TPU都是屬于ASIC。如圖是Google的TPU,兼具了CPU與ASIC的特點(diǎn)。
Google TPU
- CPU+FPGA
FPGA是一種硬件可重構(gòu)的體系結(jié)構(gòu)。它的英文全稱是Field Programmable Gate Array,中文名是現(xiàn)場(chǎng)可編程門陣列。
CPU+FPGA
優(yōu)點(diǎn):靈活性高、無(wú)需取指令、譯碼,執(zhí)行效率高。FPGA中的寄存器和片上內(nèi)存由各自的邏輯進(jìn)行控制無(wú)需仲裁和緩存。多個(gè)邏輯單元之間的通信已經(jīng)確定,無(wú)需通過共享內(nèi)存進(jìn)行通信。
缺點(diǎn):總體性價(jià)比和效率不占優(yōu)勢(shì)。FPGA的大規(guī)模開發(fā)難度偏高,從業(yè)人員相對(duì)較少,生態(tài)環(huán)境不如GPU。
實(shí)例:微軟使用FPGA為Bing搜索智能化進(jìn)行加速。
- CPU+GPU
CPU+GPU
GPU具有更好的生態(tài)環(huán)境,例如具備CUDA支持的GPU為用戶學(xué)習(xí)Caffe、Theano等研究工具提供了很好的入門平臺(tái)。為初學(xué)者提供了相對(duì)更低的應(yīng)用門檻。
除此之外,CUDA在算法和程序設(shè)計(jì)上相比其他應(yīng)用更加容易,通過NVIDIA多年的推廣也積累了廣泛的用戶群,開發(fā)難度更小。
最后則是部署環(huán)節(jié),GPU通過PCI-e接口可以直接部署在服務(wù)器中,方便快速。得益于硬件支持與軟件編程、設(shè)計(jì)方面的優(yōu)勢(shì),GPU才成為了目前應(yīng)用最廣泛的平臺(tái)。
3.2 GPU與深度學(xué)習(xí)
與大多機(jī)器學(xué)習(xí)算法一樣,深度學(xué)習(xí)依賴于數(shù)學(xué)和統(tǒng)計(jì)學(xué)計(jì)算。人工神經(jīng)網(wǎng)絡(luò)(ANN),卷積神經(jīng)網(wǎng)絡(luò)(CNN)和循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)是一些現(xiàn)代深度學(xué)習(xí)的實(shí)現(xiàn)。
這些算法都有以下基本運(yùn)算:
- 矩陣相乘:所有的深度學(xué)習(xí)模型中都包括這一運(yùn)算,計(jì)算十分密集。
- 卷積:也是深度學(xué)習(xí)中常用的運(yùn)算,占用了模型中大部分的浮點(diǎn)運(yùn)算。
上節(jié)中提到,GPU在進(jìn)行圖像渲染時(shí)間需要處理每秒大量的矩陣乘法運(yùn)算,
下圖是一個(gè)簡(jiǎn)單直觀的例子:將一幅圖像倒置,在我們?nèi)庋劭磥?lái)是一幅連續(xù)的圖形,在GPU看來(lái)實(shí)際上是由多個(gè)離散的像素組成,將圖像倒置實(shí)際上對(duì)每個(gè)像素做矩陣乘法。
當(dāng)然這只是一個(gè)簡(jiǎn)單的例子,實(shí)際上的3D渲染處理的數(shù)據(jù)比這更多也更加復(fù)雜。
GPU并行處理
深度學(xué)習(xí)同樣需要并行處理,因?yàn)樯窠?jīng)網(wǎng)絡(luò)是一種典型的并行結(jié)構(gòu),每個(gè)節(jié)點(diǎn)的計(jì)算簡(jiǎn)單且獨(dú)立,但是數(shù)據(jù)龐大,通常深度學(xué)習(xí)的模型需要幾百億甚至幾萬(wàn)億的矩陣運(yùn)算。
神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
可以看到,圖形渲染與深度學(xué)習(xí)有著相似之處。這兩種場(chǎng)景都需要處理每秒大量的矩陣乘法運(yùn)算。
而GPU擁有數(shù)千個(gè)內(nèi)核的處理器,能夠并行執(zhí)行數(shù)百萬(wàn)個(gè)數(shù)學(xué)運(yùn)算。
因此GPU完美地與深度學(xué)習(xí)技術(shù)相契合。使用GPU做輔助計(jì)算,能夠更快地提高AI的性能。
總的來(lái)說(shuō),GPU做深度學(xué)習(xí)有三大優(yōu)勢(shì):
- 每一個(gè)GPU擁有大量的處理器核心,允許大量的并行處理。
- 深度學(xué)習(xí)需要處理大量的數(shù)據(jù),需要大量的內(nèi)存帶寬(最高可達(dá)到750GB/S,而傳統(tǒng)的CPU僅能提供50GB/S),因此GPU更適合深度學(xué)習(xí)。
- 更高的浮點(diǎn)運(yùn)算能力。浮點(diǎn)運(yùn)算能力是關(guān)系到3D圖形處理的一個(gè)重要指標(biāo)?,F(xiàn)在的計(jì)算機(jī)技術(shù)中,由于大量多媒體技術(shù)的應(yīng)用,浮點(diǎn)數(shù)的計(jì)算大大增加了,比如3D圖形的渲染等工作,因此浮點(diǎn)運(yùn)算的能力是考察處理器計(jì)算能力的重要指標(biāo)。
3.3 小結(jié)
本節(jié)介紹了異構(gòu)計(jì)算對(duì)深度學(xué)習(xí)加速的優(yōu)缺點(diǎn),主要包括FPGA、ASIC、GPU三種硬件解決方案。
最后通過比較GPU進(jìn)行圖形渲染與深度學(xué)習(xí)計(jì)算時(shí)的相似之處,解釋了GPU為何能夠加速深度學(xué)習(xí),以及GPU加速深度學(xué)習(xí)的優(yōu)勢(shì)。
4. 總結(jié)
計(jì)算機(jī)圖形學(xué)與人工智能是兩個(gè)博大精深的領(lǐng)域,本文僅從GPU實(shí)時(shí)渲染與GPU并行加速的角度進(jìn)行了闡述。
寫這篇文章的初衷是因?yàn)槁?lián)想到GPU與近三年來(lái)的圖靈獎(jiǎng)?lì)I(lǐng)域息息相關(guān)。
2019年圖靈獎(jiǎng)授予了計(jì)算機(jī)圖形學(xué)領(lǐng)域、2018年授予了深度學(xué)習(xí)領(lǐng)域,2017年授予了計(jì)算機(jī)體系結(jié)構(gòu)領(lǐng)域。
GPU實(shí)時(shí)渲染、GPU并行加速、GPU架構(gòu)分別與這三個(gè)領(lǐng)域有著千絲萬(wàn)縷的聯(lián)系,因此想到了寫這樣一篇GPU探秘的文章。
5. 推薦閱讀
-
gpu
+關(guān)注
關(guān)注
28文章
4777瀏覽量
129360 -
算法
+關(guān)注
關(guān)注
23文章
4630瀏覽量
93364 -
可編程
+關(guān)注
關(guān)注
2文章
874瀏覽量
39933
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論