Deep Learning中如何選擇GPU?(一)

作者:Redflashing

文中圖像均來自於NVIDIA官方檔案或NVIDIA社區部落格

深度學習通常需要大規模的計算需求,作為主要運算硬體的GPU的選擇決定了深度學習的體驗。但是如何去選擇新的GPU,哪些GPU屬性十分重要?GPU RAM,核心(Core)數量,張量核心(Tensor Core)數量?如何做出最具性價比的選擇?本文透過深入探討這些問題,主要針對Ampere系列顯卡為選購適用於深度學習GPU的小夥伴們給出最合適的建議。

總結

  • 避免在礦潮期間購置價格高昂的顯卡。同樣,在礦難後避免買到翻新礦卡

  • 盡量避免使用筆記本進行深度學習訓練,同種顯卡型號下桌上型電腦和筆記本會有明顯差距

  • **總體最好的 GPU:**RTX 3080 和 RTX 3090。

  • 對於個人使用者而言避免使用的 GPU: 任何 Tesla 卡;任何專業繪圖顯卡(如Quadro 卡);任何 Founders Edition 卡;Titan RTX、Titan V、Titan XP,除此之外無Tensor Core(rtx20系顯卡之前)的二手消費級顯卡需要斟酌。

  • 頗具成本效益而價格高昂:RTX 3080。

  • 頗具成本效益而價格較便宜:RTX 3070、RTX 2060 Super。

  • 預算不夠的情況下: 購買二手卡,RTX 2070($400)、RTX 2060($300)、GTX 1070(?$220)、GTX 1070 Ti($230)、GTX 1650 Super(?$190)。

  • 沒錢: 百度的AI Studio ,Kaggle等均有免費GPU算力提供

  • Kaggle競賽:RTX 3070

  • 電腦視覺(CV)、預訓練或機器翻譯研究人員:4路RTX 3090(推薦渦輪顯卡)。注意配備相應的大功率電源以及扇熱裝置

  • 神經語言程式學(NLP) 研究人員: 如果不從事機器翻譯、語言建模或任何型別的預訓練工作,那麼 RTX 3080 就足夠了而且頗具性價比。

  • 相關專業學生/從業者: 從一塊 RTX 3070 開始。進一步學習,賣掉你的 RTX 3070,併購買多路RTX 3080。根據下一步選擇的領域(初創公司、Kaggle、研究、深度學習應用),賣掉你的 GPU,三年後再買更合適的(下一代 RTX 40s GPU)。

  • 嘗鮮小白:RTX 2060 Super 就很好,但可能需要使用新電源。如果你的主板有一個 PCIe x16 插槽,並且有一個大約 300W 的電源,那麼 GTX 1050 Ti 是一個很好的選擇。

  • 用於模型並行化的、少於 128 個 GPU 的 GPU 叢集: 如果你可以為你的叢集購買 RTX GPU:66% 的 8路RTX 3080 和 33% 的 8路RTX 3090(要確保能有效地冷卻)。如果解決不了 RTX 3090 的冷卻問題,那麼可以購買 33% 的 RTX 6000 GPU 或 8路Tesla A100。如果不能購買 RTX GPU,那麼可能會選擇 8路A100 Supermicro 節點或 8路RTX 6000 節點。

  • 用於模型並行化的、128 個 GPU 的 GPU 叢集: 考慮下 8路Tesla A100 設定。如果你使用超過 512 個 GPU,那麼你應該考慮配置一個 DGX A100 SuperPOD 系統,以匹配你的規模。

1. 相比於CPU,為什麼GPU更適合深度學習?為什麼要選擇Nvidia GPU?

? 對於深度學習訓練來說,GPU已經成為加速器的最佳選擇。大多數計算本質上是並行的浮點計算,即大量的矩陣乘法,其最佳效能需要大量的記憶體頻寬和大小,這些需求與HPC的需求非常一致,GPU正好可以提供高精度浮點計算、大量VRAM和平行運算能力,NVIDIA的CUDA可謂恰逢其時。

? CUDA和NVIDIA的計算業務的發展與機器學習的研究進展相吻合,機器學習在2006年左右才重新成為「深度學習」。GPU加速神經網路模型相比CPU可提供數量級的加速,反過來又將深度學習重新推廣到如今的流行辭彙。與此同時,NVIDIA的圖形競爭對手ATI在2006年被AMD收購;OpenCL 1.0在2009年才釋出,同年AMD剝離了他們的GlobalFoundries晶圓廠。

? 隨著Deep Learning的研究人員和學者們成功地使用CUDA來更快地訓練神經網路模型,NVIDIA才釋出了他們的cuDNN庫的調校深度學習原語,其中有很多以HPC為中心的BLAS(基本線性代數子常式)和相應的cuBLAS先例,cuDNN將研究人員建立和調校CUDA程式碼以提高DL效能的需求抽象出來。至於AMD的同類產品MIOpen,2017年才在ROCm保護傘下釋出,目前依據支援並不全面。

? 所以從這個意義上講,儘管NVIDIA和AMD的底層硬體都適合DL加速,但NVIDIA GPU最終成為了深度學習的參考實現。

? Nvidia曾經有一個非常直觀的科普影片(原影片地址:https://www.youtube.com/watch?reload=9&v=-P28LKWTzrI&feature=emb_title&ab_channel=NVIDIA),這裡搬運了過來。

<iframe id="7e54TiDa-1615046868750" src="//i2.wp.com/v.qq.com/txp/iframe/player.html?vid=e3232pvxz1u" allowfullscreen="true" data-mediaembed="tencent"></iframe>

Demo GPU vs CPU

? 正如某些科普文章提到過,GPU之所以快的原因是因為高效的平行運算,對矩陣乘法和卷積具有極大的計算優勢。但鮮有對其進行解釋,其真正的原因是在於記憶體頻寬,但不一定是平行運算。

? 首先,CPU是延遲調校的,而GPU是頻寬調校的。通常我們會打這樣的比方。把CPU比作一輛法拉利,而GPU則為貨運卡車。兩者的任務是從任意位置A取貨,並將這些貨物運輸到另一個任意位置B。CPU(法拉利)可以在RAM中快速取得一些記憶體資料(貨物),而GPU(貨運卡車)執行速度較慢(延遲更高)。然而CPU(法拉利)需要來回多次運輸完成工作

L

o

c

a

t

i

o

n

A

p

i

c

k

u

p

2

p

a

c

k

a

g

e

s

L

o

c

a

t

i

o

n

B

.

.

.

R

e

p

e

a

t

Location A
ightarrow pick up 2 packages
ightarrow Location B ... Repeat

Location A→ pick up 2 packages→Location B ... Repeat)

然而GPU(貨運卡車)則可以一次取得更多記憶體資料進行運輸

L

o

c

a

t

i

o

n

A

p

i

c

k

u

p

100

p

a

c

k

a

g

e

s

L

o

c

a

t

i

o

n

B

.

.

.

R

e

p

e

a

t

Location A
ightarrow pick up 100 packages
ightarrow Location B ... Repeat

Location A → pick up 100 packages →Location B ... Repeat)

? 換句話說,CPU更傾向於快速快速處理少量資料(例如算術運算:

5

?

3

?

7

5*3*7

5?3?7),而GPU更擅長處理大量資料(例如矩陣運算:

(

A

?

B

)

?

C

(A*B)*C

(A?B)?C),最好的CPU記憶體頻寬大約50GB/s?,而常見的GPU(RTX2060)記憶體頻寬為336GB/s(RTX3090的GDDR6X顯存更是高達912GB/s-1006GB/s)。因此,計算操作需要的記憶體空間越大,GPU優勢就越顯著。但是,在GPU的情況下,最大的問題在於延遲對效能的影響。結合CPU的低延遲和GPU的高頻寬可以有效隱藏延遲充分發揮互補優勢。但對於深度學習的典型任務場景,資料一般佔用大塊連續的記憶體空間,GPU可以提供最佳的記憶體頻寬,並且執行緒並行帶來的延遲幾乎不會造成影響。

? 除此之外,GPU還存在其他優勢。除了第一步資料從主存(RAM)上選取到L1快取和暫存器的效能優勢。第二步雖然對效能不太重要,但依舊會增加GPU的領先優勢。通常來說與執行單元(指的是CPU的核心或者GPU的流處理器)的距離越近,則訪問速度越快,其中暫存器和L1快取與CPU距離最近。**GPU的優勢在於:GPU為每個處理單元(流處理器或者SM)均配備了一些暫存器,而GPU成百上千個處理單元就使得暫存器總的數量非常多(為CPU的30倍,高達14MB)且速度達到80TB/s。**相比之下,CPU的暫存器大小通常為64-128KB,執行速度為10-20TB/s。當然以上的比較在數值上會有欠缺,並且CPU暫存器和GPU暫存器並不相同。兩者的大小和速度的差異是主要關鍵點。

? 最後一點GPU的優勢在於:**大量且快速的暫存器和L1快取的易於程式設計性,使得GPU非常適合用於深度學習。**這一點就不展開細說了,具體可以參考資料(https://www.quora.com/Why-are-GPUs-well-suited-to-deep-learning/answer/Tim-Dettmers-1)

2.用於深度學習處理深度重要的GPU引數

2.1. 張量核心(Tensor Core)

下圖(來源:Nvidia)為帕斯卡架構和第二代Tensor Core(圖靈架構)進行比較

首先總結出以下結論:

  • Tensor Core將計算乘法和加法操作所需的計算週期減少到

    1

    16

    frac{1}{16}

    161?。正如對於

    32

    ?

    32

    32*32

    32?32矩陣,從128個週期縮短到8個週期。

  • Tensor Core減少了對重複共享記憶體訪問的依賴,從而節省了額外的記憶體訪問。
  • Tensor Core的高速使得計算不再是效能瓶頸。唯一的瓶頸是將資料載入到Tensor Cores。

? 了解Tensor Core是如何執行計算任務是非常有幫助的。在這裡我們舉一個簡單的範例–計算

A

?

B

+

C

A*B+C

A?B+C的矩陣乘法範例(其中矩陣均為

32

?

32

32*32

32?32)。我們討論矩陣乘法在是否有Tensor Core的兩種情境下是什麼樣子的。當然這是個簡單的範例,並不是高效能矩陣乘法的真正執行情況,但它可以形象展示所有的知識。通常來說撰寫CUDA程式的軟體工程師會以此為基礎,加上諸如雙緩衝/暫存器調校/佔用調校/指令層面並行性等方法進行進一步的調校,這裡就不再做過多敘述。

? 要想展示範例前,我們必須了解電腦中週期的概念。如果一個處理器執行在1GHz的頻率下,則該處理器每秒進行

1

0

9

10^9

109個週期,每個週期代表一次運算機會。通常來說,一個操作所需的執行時間都超過一個週期。因此,將建立一個管線(Pipeline),其中一個操作啟動所需要等待前一個操作完成所需的週期數稱為操作的延遲。

? 以下是一些重要的操作週期數(以GA100顯卡為例):

  • 全域記憶體訪問(高達48GB):約200個週期
  • 共享記憶體訪問(每個SM最多164KB):約20個週期
  • Fused multiplication and addition (FFMA):4個週期
  • Tensor Core矩陣乘法:1個週期

此外,GPU上最小執行緒單元是32個執行緒的組合-被稱為Warp。Warp通常以同步模式執行-Warp中的執行緒必須相互等待。GPU上所有的記憶體操作都針對Warp進行了調校。例如,從全域記憶體載入的粒度為

32

?

4

32*4

32?4位元組,正好32個單精度浮點,正好是Warp中每個執行緒分得一個浮點。在SM中最多有32個Warp=1024個執行緒,SM的資源在活動的Warp中分配。這意味著有時候我們會希望去執行較少的Warp以便每個Warp獲得更多暫存器/共享記憶體/Tensor Core資源。

? 對於下面的兩個範例,假定在相同的計算資源的情況下,對於

32

?

32

32*32

32?32矩陣乘法的範例,我們使用了8個SM(大約為RTX 3090的10%)每個SM呼叫8個Warp。

2.1.1.不使用Tensor Core的矩陣乘法

? 對於

A

?

B

=

C

A*B=C

A?B=C(其中矩陣均為

32

?

32

32*32

32?32)的矩陣乘法,那麼我們會將重複訪問的資料載入到共享記憶體中,因為在它的延遲低了10倍左右(200個週期與20個週期的差距)。載入2個

32

?

32

32*32

32?32的單精度浮點到共享記憶體塊能用

2

?

32

2*32

2?32個Warp進行並行工作。共呼叫8個SM,每個SM8個Warp,因為是並行工作,我們只需要將這些資料單個順序載入到共享記憶體中,耗用200個週期。

? 然後我們進行矩陣乘法,我們需要從共享記憶體A和共享記憶體B載入含32個向量,並執行FFMA(Fused multiply-and-accumulate)運算。最後將輸出儲存在暫存器C中。我們將工作劃分每個SM執行 8x 點乘(

32

?

32

32*32

32?32)以計算C的8個輸出。為什麼正好是8(在舊演算法中為4)是非常技術性的。這裡有關於通用矩陣乘法(GEMM,General Matrix Multiplication)的部落格文章加深理解(https://github.com/NervanaSystems/maxas/wiki/SGEMM)。這意味著8次的共享記憶體訪問空間(每次訪問耗時20個週期)並執行8次FFMA操作(訪問耗時4個週期)。總的來說一共所需的週期數為:

200

c

y

c

l

e

s

(

)

+

8

?

20

c

y

c

l

e

s

(

)

+

8

?

4

c

y

c

l

e

s

(

F

F

M

A

)

=

392

c

y

c

l

e

s

200cycles(全域記憶體)+8*20cycles(共享記憶體)+8*4cycles(FFMA)= 392cycles

200cycles(全域記憶體)+8?20cycles(共享記憶體)+8?4cycles(FFMA)=392cycles

2.1.2.使用Tensor Core的矩陣乘法

? 使用Tensor Core,我們可以在一共週期內執行

4

?

4

4*4

4?4矩陣乘法。為此,我們首先需要把資料載入Tensor Core。與上述類似,我們需要從全域記憶體(200個週期)讀取資料並儲存在共享記憶體中。要執行

32

?

32

32*32

32?32矩陣乘法,我們需要執行

8

?

8

=

64

8*8=64

8?8=64次Tensor Core操作。單個SM具有8個Tensor Core,使用8個SM,我們有64個Tensor Core恰好是我們所需的Tensor Core數量。我們可以透過一次記憶體傳輸(20個週期)將資料從共享記憶體傳輸到張量核,然後進行64次並行Tensor Core操作(1個週期)。這意味著,在這種情況下,Tensor Core矩陣乘法的總開銷為:

200

c

y

c

l

e

s

(

)

+

20

c

y

c

l

e

s

(

)

+

1

c

y

c

l

e

s

(

T

e

n

s

o

r

C

o

r

e

)

=

221

c

y

c

l

e

s

200cycles(全域記憶體)+20cycles(共享記憶體)+1cycles(Tensor Core)= 221cycles

200cycles(全域記憶體)+20cycles(共享記憶體)+1cycles(Tensor Core)=221cycles

因此,我們透過張量核將矩陣乘法的開銷從 392 個 cycle 大幅降低到 221 個 cycle。在這種情況下,張量核降低了共享記憶體訪問和 FFMA 操作的成本。

在這個範例中,有和沒有張量核都大致遵循相同的計算步驟,請注意,這是一個非常簡化的範例。在實際情況下,矩陣乘法涉及到更大的共享記憶體塊,計算模式也稍微不同。不過我相信,透過這個範例,我就很清楚為什麼記憶體頻寬對於配備張量核的 GPU 來說如此重要。在使用張量核進行矩陣乘法時,全域記憶體是 cycle 開銷中最重要的部分,如果可以降低全域記憶體延遲,我們甚至可以擁有速度更快的 GPU。要做到這一點,我們可以透過增加記憶體的時鐘頻率(增加每秒 cycle 數,但也會增加發熱和電量耗用)或增加每次可以轉移的元素數量(匯流排寬度)。

2.2. 記憶體頻寬

? Tensor Core的速度如此之快,以至於在實際的執行過程中Tensor Core在大多數時間都是閑置狀態。例如在BERT的大規模訓練期間,Tensor Core使用率大約在30%,這意味著70%的時間Tensor Core處於閑置。

? 這意味著,將兩個GPU的Tensor Core進行比較時,每個GPU效能的最佳指標之一是它們的記憶體頻寬。例如,A100 GPU的記憶體頻寬為1555GB/s,而V100的記憶體頻寬為900GB/s。因此可以粗略地計算A100於V100的加速比為

1555

/

900

=

1.73

1555/900=1.73

1555/900=1.73倍。

2.3. 共享記憶體/L1快取/暫存器

? 由於向Tensor Core的資料傳輸是效能的限制因素。而共享記憶體/L1快取/暫存器數量與記憶體傳輸密切相關。若要了解記憶體層次結構如何實現更快的記憶體傳輸,它有助於了解矩陣乘法如何在GPU上執行。

? 要了解GPU的記憶體層次結構,我們先來聊聊A100的SM架構(SM,相當於 GPU 上的一個「CPU 內核」)。下圖為Nvidia GPU GA100及其SM結構(來源:Nvidia)。新的GA100 SM顯著提高了效能,除了Volta和Turing架構引入的功能之外還增加了許多新功能和增強功能。相比於Volta和Turing每SM有8個Tensor Core(每個Tensor Core每個時鐘週期執行64個FP16/FP32 FMA操作,

64

?

8

=

512

64*8=512

64?8=512),而GA100 每個SM包括4個第三代的Tensor Core(每個Tensor Core每個時鐘週期執行256個FP16/FP32 FMA操作,

256

?

4

=

1024

256*4=1024

256?4=1024),與Volta和Turing相比SM的算力增加2倍。共享記憶體大小:

  • Volta:96kb 共享記憶體/32kb L1快取
  • Turing:64kb 共享記憶體/32kb L1快取
  • Ampere(A100):192kb 共享記憶體/L1快取

? GPU的記憶體層次結構,從相對緩慢的全域記憶體到快速共享記憶體,再到閃電般的暫存器。但由於成本因素的制約,記憶體越快,其容量越小。因此我們需要將大矩陣分成較小的矩陣。在共享記憶體中的切片執行矩陣乘法,該操作十分快速。進一步將這些切片的一部分載入到Tensor Core中。由上文可知SM共享記憶體的矩陣Memory Tile比GPU全域記憶體快大約10-50倍,而Tensor Core的暫存器比GPU全域記憶體快200倍。擁有更大的Tile意味著可以復用更多的記憶體。實際上,你可以將 TPU 看作是每個張量核都有非常非常大的 Tile。因此,TPU 在每次從全域記憶體傳輸資料時都可以重用更多的記憶體,這使得它們在矩陣乘法計算方面比 GPU 更有效率。每個塊的大小是由每個SM的記憶體大小決定的。

? 由上可得,Ampere架構的共享記憶體更大,塊大小也就更大,這就減少了全域記憶體訪問延遲。因此,Ampere可以更好地利用GPU儲存的總體記憶體頻寬。這將提高約2~5%的效能。對於大型矩陣矩陣,效能的提升尤其明顯。

? Ampere架構的Tensor Core的另一個優點在於執行緒間共享更多資料。這減少了暫存器的使用。通常來說,GPU暫存器被限制為每個SM為64K或者每個執行緒 255 。比較Volta和Ampere架構的Tensor Core,在相同情況下Ampere架構僅需1/3的暫存器,這允許共享記憶體的每個Tile有更多Tensor Core活動。然而效能的瓶頸還是在於頻寬,所以以實際的TFLOPS(每秒所執行的浮點運算萬億次數)和理論TFLOPS相比,只會有微小的提高。Ampere架構的Tensor Core提高了大約1~3%的效能。

總的來說,我們可以看到,Ampere 的架構經過調校,它使用改進後的儲存層次結構(從全域記憶體到共享記憶體塊,再到張量核暫存器),使可用記憶體頻寬更加有效。

3. Ampere架構的深度學習效能

要點

  • 根據記憶體頻寬和Ampere GPU改進的儲存結構來估計,理論上,其提升1.78倍到1.87倍。
  • NVIDIA提供了Tesla A100和V100 GPU的準確測試資料。雖然資料存在行銷目的,但可以透過這些資料建立去偏差模型。
  • 去偏基準測試的資料顯示,Tesla A100在NLP方面比V100快1.70倍,在CV方面比V100快1.45倍。

如果你想了解更多關於A100的技術細節,可以參考NVIDIA官方檔案(https://www.nvidia.com/content/dam/en-zz/Solutions/Data-Center/nvidia-ampere-architecture-whitepaper.pdf)

3.1. Ampere速度的理論估計

? 綜上所述,我們可以得到結論,兩種配備Tensor Core的GPU架構之間的差異主要在於記憶體頻寬。除此之外,使用Tensor Core的還能擁有更多共享記憶體/L1快取以及更好的暫存器。

? 如果我們將Tesla A100GPU頻寬與Tesla V100 GPU頻寬相比較,我們得到的提升為1555/900=1.73倍。此外,從更大的共享記憶體中得到 2-5% 的加速,從第三代的Tensor Core得到1-3%的加速。這使得速度提升在1.78和1.87倍之間。用類似的推理方法,我們就可以估計Ampere架構GPU同其他GPU(尤其是Tesla V100)的速度提升。

3.2. Ampere速度的實際估計

? NVIDIA已經在A100和V100進行了基準測試。但NVIDIA使用了不同的Batch Size和GPU數量,使得這些資料無法直接進行比較(NVIDIA的基準測試有意使得結果有利於A100)。所以在某種意義上,這些基準資料是真實的。通常來說,我們可能會認為更大的Batch Size才公平,因為A100有更多的記憶體,但為了比較GPU架構,我們應該評估Batch Size相同時的無偏差記憶體效能。

? 為了得到無偏估計,我們可以透過兩種方式對V100和A100結果進行縮放:

  • (1).考慮Batch Size差異

  • (2).考慮使用1個GPU和8個GPU的差異。

    這我們能在NVIDIA提供的資料中找到對這兩種偏差的估計。

Batch Size增加一倍使得吞吐量增加13.6%(CNN,以每秒影象數為單位)。在RTX Titan上針對同樣的問題測試了Transformer,得到可靠的估計值13.5%,在結果上出奇地一致。

? 當我們將 Network 放在更多 GPU 並行化時,由於網路的開銷,我們會損失效能。與 V100 8路並行系統(透過 NVLink 2.0 )相比,A100 8路並行系統有更好的GPU互連技術(透過 NVLink 3.0)–這使得無法進行控制變數來進行直接比較。透過直接檢視 NVIDIA 的資料,我們可以發現,對於 CNN 任務而言,8路 A100 系統比 8路 V100 系統開銷低5%。這意味著,從 1x A100 到 8x A100可以獲得7倍的速度提升,而從 1x V100 到 8x A100可以獲得 6.67 倍。對於 Transformer 任務而言,這個數值是 7%。

? 使用這些資料,我們可以從 NVIDIA 提供的直接資料中估算其對於一些特定深度學習架構的速度提升。與 Tesla V100 相比,Tesla A100 可以提供以下速度提升:

  • SE-ResNeXt-101:1.43 倍
  • Masked-R-CNN:1.47 倍
  • Transformer(12 層,機器翻譯模型 WMT4 en-de):1.70 倍

因此,對於電腦視覺來說,這些數值比理論估計要低一些。這可能是由於張量維數較小,準備矩陣乘法(如 img2col 或快速傅里葉計算(FFT))所需的操作開銷,或者操作無法充分利用 GPU(最後的層通常相對較小)。它也可以是特定架構的工件(分組卷積)。

? Transformer 實際估計值與理論估計值非常接近。這可能是因為大型矩陣的演算法非常簡單。將使用這些實際的估計來計算 GPU 的成本效率。

3.3. 估計中可能存在的偏差

? 上面是針對 A100 和 V100 的對比估計。過去,NVIDIA消費級顯卡出現了效能偷偷下降的問題:

  • 降低 Tensor Core 的利用率
  • 風扇散熱
  • 閹割 NVLink(如30系顯卡,僅有 RTX 3090 保留了 NVLink)

與 Ampere A100 相比,RTX 30系列顯卡可能有未公布效能下降的嫌疑。

4. Ampere / RTX 30 系列的其他考慮因素

要點:

  • Ampere 可以用於稀疏網路訓練,它最高可以將訓練速度提高 2 倍。
  • 稀疏網路訓練仍然很少使用,但將使 Ampere 可以經受住未來的考驗。
  • Ampere 有新的低精度資料型態,這使得使用低精度數值更容易,但不一定比以前的 GPU 更快。
  • 新的風扇設計非常棒,如果你的 GPU 之間有間隙的話,但不清楚如果多個 GPU 之間沒有間隙,它們是否能有效冷卻。
  • RTX3090 的 3 插槽設計使得 4x GPU 構建成為問題。可能的方案是 2 插槽轉換或使用 PCIe 擴展器。
  • 4x RTX 3090 需要的功率已經超過目前市場上任何標準電源單元所能提供的功率。

與 NVIDIA Turing RTX 20 系列相比,新的 NVIDIA Ampere RTX30 系列具有額外的優點,如稀疏網路訓練和推理。其他屬性,例如新的資料型態,更多的是易用性屬性,因為它們提供了和 Turing 一樣的效能提升,但是不需要任何額外的程式設計。

4.1. 稀疏網路訓練

? 神經網路由於其引數規模的不斷增加,以期待用相似的網路架構去捕捉不同的特徵,因此,也造成了模型的稀疏性。研究人員們一直在研究利用深度學習的稀疏性,例如常見的剪枝(pruning),本質上就是對稀疏模型的一個壓縮。

? 我們可以想像一下,從生物學角度看,人腦裡面的神經元也不是稠密連接的。而神經網路中的稀疏性主要是由於模型訓練中會產生很多非常小的引數值(weight),而像ReLU這樣的啟動函式,也會使得輸入輸出(activations)中很多值為零。因此,weight 和 activation 都會有大量零值(或接近0)存在,這是模型稀疏化的根源。

? 大家可能會問,有稀疏性,我們就不儲存 0 值或者不儲存 0 值。這個裡面需要解決的問題主要是兩點,我們需要保證模型的精度,另外需要保證考慮稀疏化後能在硬體上獲得加速。各類硬體都有其偏好的資料格式和排布,並不是暴力減少計算量就一定有收益的。因此,結構化的稀疏是一個很好的選擇。

? 在A100的Tensor Core上支援

2

:

4

2:4

2:4的稀疏計算,也就是

M

?

N

?

K

M*N*K

M?N?K 的K維度上每連續四個元素,保持其中兩個元素為零值。計算的時候,可以將4個元素表達為2個元素,加上一個 2bit 的標識符(標示非零元素的位置)。而Tensor Core支援透過這2個元素和2bit的標識符來計算最終的結果。

? 我們還是以Tensor Core上的FP16進行計算為例,Tensor Core可以在2個時鐘週期內完成

16

?

32

16*32

16?32與

32

?

8

32*8

32?8 的矩陣乘法,使用sparsity之後,只需要1個時鐘週期,理論加速達到兩倍。(下圖為

16

?

32

16*32

16?32與

32

?

8

32*8

32?8 稀疏計算示意圖)

? Ampere 架構可以以稠密矩陣的速度進行細粒度結構自動稀疏矩陣乘法(ASP,Automatic SParsity)。簡要地說它的工作原理是:將矩陣分割成4個部分,現在稀疏矩陣Tensor Core屬性允許這4個矩陣中的2個為零矩陣。這樣就帶來了2倍數的速度提升(瓶頸在於資料頻寬),因為矩陣乘法的頻寬需求減半了。

? 對於稀疏網路的訓練,通常存在一種批評「雖然減少了網路所需的FLOPS,但卻沒能帶來速度的提升,因為 GPU 並不能做快速稀疏矩陣乘法。」所以 Ampere 架構的主動稀疏矩陣乘法特徵(還處於實驗階段,且稀疏矩陣的訓練並不普遍)可以對稀疏矩陣訓練演算法提供2倍的速度提升。

4.2. 低精度計算

? 新的資料型態可以提高低精度反向傳播的穩定性。目前,如果你想要實現 16 位浮點數(FP16)的穩定反向傳播,主要問題是普遍 FP16 資料型態只支援

[

?

65504

,

65504

]

[-65504,65504]

[?65504,65504]區間內的數值。如果梯度超出這個範圍,就會變成NaN型別。為了防止 FP16 訓練期間發生這種情況,我們通常會進行損失縮放,即在反向傳播之前將損失乘以一個小數值,以防止梯度爆炸。

? Brain Float 16 格式(BF16)使用更多的位作為指數,這樣,其可能的數值範圍與 FP32 相同:

[

?

3

?

1

0

38

,

3

?

1

0

38

]

[-3*10^{38},3*10^{38}]

[?3?1038,3?1038]。BF16 的精度較低,但梯度精度對機器學習來說並不是那麼重要。所以 BF16 所做的就是你不再需要做任何損失縮放或者擔心梯度迅速膨脹。因此,我們可以看到使用 BF16 格式時訓練穩定性的提高,只是精度稍有降低。

? 這意味著:使用 BF16 精度,訓練可能比 FP16 精度更穩定,而提供了同等的速度提升。使用 TF32 精度,可以得到接近 FP32 的穩定性,接近 FP16 的速度提升。好的方面是,要使用這些資料型態,只需將 FP32 取代為 TF32,將 FP16 取代為 BF16——而不需要修改程式碼。再總結一下就是針對深度學習資料型態對精度和範圍的需求進行重新設計,適當降低了精度,提高了數值範圍。

? 這裡再介紹一下 TF32(TensorFloat-32) 資料型態,,相比FP32,指數位(涉及浮點數表示範圍,Range)保留了和FP32相同的bit,而尾數位(涉及浮點數的精度,Precision)保留了和FP16相同的bit。它同時兼顧了範圍(Range)和精度(Precision)的要求。在使用上,使用FP32作為輸入輸出,也使得TF32的加速和現有程式介面保持一致。在各個深度學習框架裡面,TF32都是開箱即用,直接替代FP32,帶來相比V100 最高10倍的效能提升。NVIDIA也針對常見的深度學習模型,進行了驗證,在CV,NLP,推薦系統等各類AI應用中,TF32都表現出了與FP32相同的收斂精度。

[外鏈圖像轉存失敗,源站可能有防盜鏈機制,建議將圖像儲存下來直接上傳(img-U7ObQ7cE-1615042665330)(https://blogs.nvidia.com/wp-content/uploads/2020/05/tf32-Mantissa-chart-hi-res-FINAL-400x255.png)]

? 不過,總的來說,這些新資料型態可以被視為懶惰資料型態,因為透過一些額外的程式設計工作(適當的損失縮放、初始化、歸一化、使用 Apex),使用舊資料型態就可以獲得所有這些好處。因此,這些資料型態並不提供速度提升,而是提高了低精度訓練的易用性。

參考檔案

  • Which GPU(s) to Get for Deep Learning: My Experience and Advice for Using GPUs in Deep Learning
  • Why are GPUs well-suited to deep learning?
  • What is a GPU and do you need one in Deep Learning?
  • NVIDIA A100 Tensor Core GPU Architecture whitepaper
  • Nvidia Ampere GA102 GPU Architecture whitepaper
  • s21929 Tensor Core performance on nvidia gpus the ultimate guide
  • https://github.com/NervanaSystems/maxas/wiki/SGEMM
  • Nvidia』s Tensor Cores for Machine Learning and AI – Explained
  • NVIDIA深度學習Tensor Core全面解析(上篇)
  • NVIDIA深度學習Tensor Core全面解析(下篇)
  • https://www.zhihu.com/question/394863138/answer/1275510947