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