不久前,,NVIDIA在SIGGRAPH 2018上正式發(fā)布了新一代GPU架構(gòu)——Turing(圖靈),,黃仁勛稱Turing架構(gòu)是自2006年CUDA GPU發(fā)明以來最大的飛躍,。
Turing架構(gòu)的兩大重要特性便是集成了用于光線追蹤的RT Core以及用于AI計算的Tensor Core,使其成為了全球首款支持實時光線追蹤的GPU,。
不過說到AI計算,,NVIDIA GPU成為最好的加速器早已是公認的事實,但將Tensor Core印上GPU名片的并不是這次的Turing,,而是他的上任前輩——Volta,。
基于Volta架構(gòu)的Titan V是NVIDIA在計算領(lǐng)域成就的集大成者。深度學習和神經(jīng)網(wǎng)絡(luò)已成為NVIDIA GPU的背后驅(qū)動力,,作為最先進的計算加速器,,它集成了用于機器學習操作的內(nèi)置硬件和軟件加速,深度學習能力完全可以被當做Titan V和Volta的名片,。
Titan V與初代基于開普勒的GeForce GTX Titan已經(jīng)相去甚遠,,初代Titan的定位是一款萬能顯卡,既可作為游戲發(fā)燒友的旗艦游戲顯卡,,也為專業(yè)消費者提供全雙精度浮點(FP64)計算能力。
在Titan V誕生之前,,Titan產(chǎn)品線幾乎都是基于這種設(shè)計方法,,一顆巨大的GPU核心是NVIDIA“高大全”設(shè)計思路的最好代表。
而在Titan V上,,NVIDIA再次擴展了大核心的上限,。Volta最引人注目的則是其全新的專用處理模塊——Tensor Core(張量計算核心),它與Volta的其他微架構(gòu)改進,以及支持深度學習和高性能計算(HPC)的軟件/框架集成在一起,。
憑借面積達815mm?的巨大GV100核心,,Titan這一產(chǎn)品線變得比以往任何時候都更接近工作站級,Titan V在擁有世界最強圖形渲染性能的同時,,深度學習和高性能計算方面的性能都有了極大的提升,,當然它的價格也達到了工作站級的3000美元。
強化算力,,重造Titan
除了深度學習和通用計算之外,,Titan品牌的這次迭代還涉及到其他一些因素。 NVIDIA其實已經(jīng)不太需要通過Titan系列為自己樹立形象,,最初的GTX Titan已經(jīng)通過NVIDIA K20Xs為Oak Ridge國家實驗室的Titan超級計算機提供計算力,。況且,Titan系列在產(chǎn)品價格和性能方面也沒有任何特別的競爭壓力,。
盡管Titan V的非ECC HBM2顯存和GeForce驅(qū)動程序堆棧都更加面向消費者,,但該卡仍可直接受益于框架和API的軟件支持,這是NVIDIA深度學習開發(fā)整體工作的一部分,。
鑒于單路Titan V并不會對服務(wù)器計算卡Quadro GV100產(chǎn)生什么影響,,NVIDIA在Titan V上只砍掉了針對服務(wù)器多路互聯(lián)設(shè)計的NVLink高速總線,而主要的計算能力(FP64/FP16/Tensor Core)都被完整保留,。
與Pascal及更早期的產(chǎn)品均使用面向PC設(shè)計的GPU以及常規(guī)GDDR5(x)顯存不同,,NVIDIA這次選擇了一顆規(guī)模巨大、產(chǎn)量和良品率都不高的服務(wù)器級芯片,,有大量的晶體管被花費在了非圖形功能上(即Tensor Core),,這是NVIDIA在計算領(lǐng)域押下的賭注,NVIDIA已經(jīng)不滿足于只在傳統(tǒng)圖形計算卡和通用計算方面處于領(lǐng)先地位,。
由于是首次分析GPU的深度學習性能,,所以目前市面上還沒有確定一套標準的基準測試,特別是對于Volta獨特的張量內(nèi)核和混合精度功能,。對于Titan V,,我們將使用百度DeepBench、NVIDIA的Caffe2 Docker,、Stanford DAWNBench和HPE深度學習基準套件(DLBS)來測試,。
但是在深入研究這些測試數(shù)據(jù)之前,雷鋒網(wǎng)首先會就深度學習,、GPU,、Volta微架構(gòu)以及深度學習性能基準進行一些背景介紹。
GPU與深度學習
首先要說明的是,,雖然“機器學習”或更通用的“AI”有時可互換用于“深度學習”,,但從技術(shù)上講,,它們各自指的是不同的東西,機器學習是AI的子集,,深度學習則是機器學習的子集,。
深度學習是因“深度神經(jīng)網(wǎng)絡(luò)”(Deep Neural Networks)而得名,其最終被設(shè)計為識別數(shù)據(jù)中的模式,,產(chǎn)生相關(guān)預測,,接收關(guān)于預測準確度的反饋,然后基于反饋進行自我調(diào)整,。計算發(fā)生在“節(jié)點”上,,“節(jié)點”被組織成“層”:原始輸入數(shù)據(jù)首先由“輸入層”處理,“輸出層”推出代表模型預測的數(shù)據(jù),。兩者之間的任何一層都被稱為“隱藏層”,,而“deep”則代表著深度神經(jīng)網(wǎng)絡(luò)有許多隱藏層。
這些隱藏層可以在不斷增加的抽象層次上運行,,使得它們甚至可以從復雜的輸入數(shù)據(jù)中提取和區(qū)分非線性特征,。一個標準的例子是圖像識別,其中初始層尋找某些邊緣或形狀,,這通知后面的層尋找鼻子和眼睛,,之后的層可能尋找面部。最后的圖層組合了所有這些數(shù)據(jù)以進行分類,。
隨著輸入數(shù)據(jù)在模型中向前推進,,計算包括特殊的內(nèi)部參數(shù)(權(quán)重),最后會產(chǎn)生一個表示模型預測與正確值之間誤差的損失函數(shù),。然后使用此錯誤信息反向運行模型以計算將改善模型預測的權(quán)重調(diào)整,,該前向和后向傳遞(或反向傳播)序列包括單個訓練迭代。
為了進行推斷,,這個過程自然地排除了逆向傳遞,,最終需要的計算強度比訓練模型更小。從這個意義上說,,推斷也不太需要像FP32這樣高的精度,,并且可以對模型進行適當?shù)男藜艉蛢?yōu)化,以便在特定的設(shè)備上部署,。然而推斷設(shè)備對延遲,、成本和功耗變得更加敏感,尤其是在邊緣計算的場景下,。
卷積神經(jīng)網(wǎng)絡(luò)(CNN)和遞歸神經(jīng)網(wǎng)絡(luò)(RNN)是深度神經(jīng)網(wǎng)絡(luò)的兩個重要子類型,。卷積本身是一種操作,將輸入數(shù)據(jù)和卷積核結(jié)合起來形成某種特征映射,,轉(zhuǎn)換或過濾原始數(shù)據(jù)以提取特征。
CNN通常是“前饋”的,因為數(shù)據(jù)在沒有循環(huán)的情況下流過各層,。而對于RNN(以及像LSTM和GRU這樣的變體)來講,,每次計算后都會有一個單獨的權(quán)重循環(huán)回自身,給網(wǎng)絡(luò)一種“記憶”感,,這讓網(wǎng)絡(luò)能夠做出有時間意識的預測,,在文本分析等場景中很有用。
由于深度學習數(shù)學可以歸結(jié)為線性代數(shù),,因此某些操作可以重寫為對GPU更友好的矩陣間乘法,。當NVIDIA首次開發(fā)并公布cuDNN時,其中一個重要實現(xiàn)就是將算法降級為矩陣乘法以加速卷積,。多年來cuDNN的發(fā)展包括“預先計算的隱式GEMM”卷積算法,,它恰好是觸發(fā)Tensor Core卷積加速的唯一算法。
NVIDIA GPU的優(yōu)勢
對于深度學習訓練來說,,GPU已經(jīng)成為加速器的最佳選擇,。大多數(shù)計算本質(zhì)上是并行的浮點計算,即大量的矩陣乘法,,其最佳性能需要大量的內(nèi)存帶寬和大小,,這些需求與HPC的需求非常一致,GPU正好可以提供高精度浮點計算,、大量VRAM和并行計算能力,,NVIDIA的CUDA可謂恰逢其時。
CUDA和NVIDIA的計算業(yè)務(wù)的發(fā)展與機器學習的研究進展相吻合,,機器學習在2006年左右才重新成為“深度學習”,。GPU加速神經(jīng)網(wǎng)絡(luò)模型相比CPU可提供數(shù)量級的加速,反過來又將深度學習重新推廣到如今的流行詞匯,。與此同時,,NVIDIA的圖形競爭對手ATI在2006年被AMD收購;OpenCL 1.0在2009年才發(fā)布,,同年AMD剝離了他們的GlobalFoundries晶圓廠,。
隨著DL的研究人員和學者們成功地使用CUDA來更快地訓練神經(jīng)網(wǎng)絡(luò)模型,NVIDIA才發(fā)布了他們的cuDNN庫的優(yōu)化深度學習原語,,其中有很多以HPC為中心的BLAS(基本線性代數(shù)子例程)和相應的cuBLAS先例,,cuDNN將研究人員創(chuàng)建和優(yōu)化CUDA代碼以提高DL性能的需求抽象出來。至于AMD的同類產(chǎn)品MIOpen,,去年才在ROCm保護傘下發(fā)布,,目前也只在Caffe公開發(fā)布。
所以從這個意義上講,,盡管NVIDIA和AMD的底層硬件都適合DL加速,,但NVIDIA GPU最終成為了深度學習的參考實現(xiàn),。
剖析Tensor Core
在關(guān)于Volta混合精度Tensor Core的幾個謎團中,一個比較煩人的問題是4 x 4矩陣乘法的能力,。Tensor Core是一種新型處理核心,,它執(zhí)行一種專門的矩陣數(shù)學運算,適用于深度學習和某些類型的HPC,。Tensor Core執(zhí)行融合乘法加法,,其中兩個4*4 FP16矩陣相乘,然后將結(jié)果添加到4*4 FP16或FP32矩陣中,,最終輸出新的4*4 FP16或FP32矩陣,。
NVIDIA將Tensor Core進行的這種運算稱為混合精度數(shù)學,因為輸入矩陣的精度為半精度,,但乘積可以達到完全精度,。碰巧的是,Tensor Core所做的這種運算在深度學習訓練和推理中很常見,。
Tensor Core雖然在GPU里是全新的運算單元,,但其實它與標準的ALU流水線并沒有太大差別,只不過Tensor Core處理的是大型矩陣運算,,而不是簡單地單指令流多數(shù)據(jù)流標量運算,。Tensor Core是靈活性和吞吐量權(quán)衡的選擇,它在執(zhí)行標量運算時的表現(xiàn)很糟糕,,但它可以將更多的操作打包到同一個芯片區(qū)域,。
Tensor Core雖然有一定的可編程性,但仍然停留在4*4矩陣乘法累加層面上,,并且不清楚累積步驟是如何以及何時發(fā)生的,。盡管被描述為進行4*4矩陣數(shù)學運算,但實際上Tensor Core運算似乎總是使用16*16矩陣,,并且操作一次跨兩個Tensor Core進行處理,。這似乎與Volta架構(gòu)中的其他變化有關(guān),更具體地說,,與這些Tensor Core是如何集成進SM中有關(guān),。
對于Volta架構(gòu),SM被劃分為四個處理塊或子核,。對于每個子核,,調(diào)度器每個時鐘向本地分支單元(BRU)、Tensor Core陣列,、數(shù)學分派單元或共享MIO單元發(fā)出一個warp指令,,這就首先阻止了Tensor運算和其他數(shù)學運算同時進行。在利用兩個Tensor Core時,,warp調(diào)度器直接發(fā)出矩陣乘法運算,,并且在從寄存器接收輸入矩陣之后,,執(zhí)行4*4*4矩陣乘法。待完成矩陣乘法后,,Tensor Core再將得到的矩陣寫回寄存器,。
在Tensor Core執(zhí)行實際指令時,即使在使用NVVM IR(LLVM)的編譯器級別上,,也僅存在用于warp級矩陣操作的本征,對于CUDA++和PTX ISA,,warp級別仍然是唯一級別,。加載輸入矩陣的形式是每個扭曲線程持有一個片段,其分布和身份均未指定,。從廣義上講,,它遵循標準CUDA核心的基于線程級別拼接的GEMM計算的相同模式。
一般而言,,給定A*B+C Tensor Core操作,,片段由A的8個FP16*2元素(即16個FP16元素)和B的另外8個FP16*2元素,以及FP16累加器的4個FP16*2元素或 FP32累加器的8個FP32元素組成,。
在矩陣乘法累加運算之后,,計算結(jié)果會分散在每個線程的目標寄存器片段中,需要在整個范圍內(nèi)統(tǒng)一,,如果其中一個warp線程退出,,這些低級操作基本上就會失敗。
Citadel LLC團隊的低級微基準測試揭示了許多Volta微體系結(jié)構(gòu)細節(jié),,包括Tensor Core操作和相關(guān)的片段,,與輸入矩陣相比,它們都位于寄存器和標識中,。他們觀察到,,子核核心以特定的拼接模式計算矩陣乘法,其中所有32個warp線程都在運行,。
從概念上講,,Tensor Core在4*4子矩陣上運行,以計算更大的16*16矩陣,。warp線程被分成8組,,每組4個線程,每個線程組連續(xù)計算一個8*4塊,,總共要經(jīng)過4組的過程,,每一個線程組都處理了目標矩陣的1/8。
在一個集合中,,可以并行完成四個HMMA步驟,,每個步驟適用于4*2子塊,。這四個線程直接鏈接到寄存器中的那些矩陣值,因此線程組可以處理單個Step 0 HMMA指令,,從而一次性計算子塊,。
由于矩陣乘法在數(shù)學上需要對某些行列進行復用,以允許跨所有8*4塊并行執(zhí)行,,每個4*4矩陣被映射到兩個線程的寄存器,。在計算16*16父矩陣的4*4次子矩陣運算中,這將包括將連續(xù)計算的集合相加,,形成16*16矩陣中4*8個元素的相應塊,。盡管Citadel沒有對FP16進行測試,但它們發(fā)現(xiàn)FP16 HMMA指令只產(chǎn)生2個步驟,,而不是4個步驟,,這或許與FP16只占用的較小的寄存器空間有關(guān)。
通過獨立的線程調(diào)度和執(zhí)行,,以及warp同步和warp-wide結(jié)果分配,,基本的4*4*4 Tensor Core操作轉(zhuǎn)換為半可編程16*16*16混合精度矩陣乘法累加。雖然CUDA 9.1支持32*8*16 and 8*32*16矩陣,,但相乘的矩陣都需要相應的列和行為16,,最終矩陣為32*8或8*32。
Tensor Core的運行方式似乎是NVIDIA GEMM計算層次結(jié)構(gòu)的一個硬件實現(xiàn)的步驟,,如CUTLASS(用于GEMM操作的CUDA C ++模板庫)中所示,。對于傳統(tǒng)的CUDA核心,最后一步需要將warp tile結(jié)構(gòu)分解為由各個線程擁有的標量和向量元素,。使用WMMA API(現(xiàn)在表示張量核),,所有這些都被抽象掉了,只剩下了需要處理的合作矩陣片段加載/存儲和多重積累,。積累發(fā)生在一個FMA類型的操作中,。
在寄存器級別上,NVIDIA在他們的Hot Chips 2017論文中提到“使用三個相對較小的乘法和累加器數(shù)據(jù)的4*4矩陣,,可以執(zhí)行64次乘加運算,。”而增強的Volta SIMT模型的每線程程序計數(shù)器(能夠支持張量核)通常需要每個線程2個寄存器槽,。HMMA指令本身會盡可能多復用寄存器,,所以我無法想象寄存器在大多數(shù)情況下不會出現(xiàn)瓶頸。
對于獨立的4*4矩陣乘法累加,,Tensor Core陣列在寄存器,、數(shù)據(jù)路徑和調(diào)度方面很有核能并沒有物理設(shè)計,它只能用于特定的子矩陣乘法。
無論如何,,從NVIDIA的角度來看,,Volta不是一顆深度學習的專用ASIC,它仍然覆蓋GPGPU的領(lǐng)域,,因此保持CUDA可編程Tensor Core適用于GEMM / cuBLAS和HPC是合乎邏輯的,。對于CUDA c++的CUTLASS來說,情況更是如此,,因為它的WMMA API支持旨在為廣泛的應用程序啟用Tensor CoreGEMM操作,。從根本上說,NVIDIA深度學習硬件加速的發(fā)展與cuDNN(以及cuBLAS)的發(fā)展有很大關(guān)系,。
讓FP16適用于深度學習
Volta的深度學習能力是建立在利用半精度浮點(IEEE-754 FP16)而非單精度浮點(FP32)進行深度學習訓練的基礎(chǔ)之上,。
該能力首先由cuDNN 3支持并在Tegra X1的Maxwell架構(gòu)中實現(xiàn),隨后原生半精度計算被引入Pascal架構(gòu)并被稱為“偽FP16”,,即使用FP32 ALUs處理成對的FP16指令,理論上可以使每個時鐘的FP16吞吐量增加一倍,。這一特性實際上已經(jīng)在Tensor Core處理寄存器中矩陣片段的過程中得到體現(xiàn),,其兩個FP16輸入矩陣被收集在8個FP16*2或16個FP16元素中。
就FP32與FP16而言,,由于單精度浮點所包含的數(shù)據(jù)多于半精度浮點,,因此計算量更大,需要更多的內(nèi)存容量和帶寬來容納和傳輸數(shù)據(jù),,并帶來更大的功耗,。因此,在計算中成功使用低精度數(shù)據(jù)一直是窮人的圣杯,,而目標則是那些不需要高精度數(shù)據(jù)的應用程序,。
除了API/編譯器/框架的支持之外,深度學習一直都有在使用FP16數(shù)據(jù)類型時損失精度的問題,,這會讓訓練過程不夠準確,,模型無法收斂。
據(jù)雷鋒網(wǎng)了解,,NVIDIA以前也曾在類似的情況下推出過“混合精度”這一概念,,在Pascal的快速FP16(針對GP100)和DP4A/DP2A的整數(shù)點積操作(針對GP102、GP104和GP106 GPU)中,,就曾提出過類似的說法,。
當時人們關(guān)注的是推理能力,就像Titan V的“深度學習TFLOPS”一樣,,Titan X(Pascal)推出了“44 TOPS(新型深度學習推斷指令)”,。新的指令對4元8位向量或2元8位/16位向量執(zhí)行整數(shù)點積,從而得到一個32位整數(shù)積,,可以與其他32位整數(shù)一起累積,。
對于Volta的混合精度而言,,重要的精度敏感數(shù)據(jù)(如主權(quán)重)仍然會存儲為FP32;而Tensor Core的混合精度訓練則會將兩個半精度輸入矩陣相乘得到一個精度乘積,,然后累積成一個精度和,。NVIDIA表示,在將結(jié)果寫入內(nèi)存之前,,Tensor Core會將結(jié)果轉(zhuǎn)換回半精度,,這樣當使用半精度格式時,寄存器和存儲器中需要的數(shù)據(jù)更少,,這有助于處理超大矩陣中的數(shù)據(jù),。
FP16與FP32所包含的數(shù)據(jù)空間并不相同,歸一化方法可以解決FP32格式數(shù)據(jù)超出FP16可表示范圍的問題,。舉個例子,,許多激活梯度的值都落在FP16的范圍之外,但由于這些值聚集在一起,,因此將損耗乘以縮放因子便可以移動FP16范圍內(nèi)的大部分值,。在完成最終的權(quán)重更新之前,將梯度重新縮放到原始范圍,,便可以維持其原始的精度,。
不過,并非所有的數(shù)學,、神經(jīng)網(wǎng)絡(luò)和層都適用于FP16,,通常FP16和Tensor Core的混合精度最適合卷積和RNN重圖像處理等,而對于不適合的神經(jīng)網(wǎng)絡(luò)框架或類型,,F(xiàn)P16將默認禁用或不推薦使用,。
內(nèi)存改進,SM變化
使用Tensor Core處理混合精度數(shù)據(jù)似乎可以減輕內(nèi)存帶寬問題,,但事實證明,,盡管Volta在幾乎所有方面都得到了內(nèi)存子系統(tǒng)的增強,但幅度并不明顯,。
首先,,Volta有一個12 KB的L0指令緩存,雖然Pascal及其他之前的GPU核心也有指令緩存,,但Volta更高效的L0是子核心SM分區(qū)私有的,,因此它對warp調(diào)度器來說也是私有的,這對Volta架構(gòu)更大的指令大小是一種補償,,并有可能為支持Tensor Core通道的框架做出貢獻,。同時Volta指令延遲也要低于Pascal,特別是核心FMAs從6個周期減少到了4個周期。
隨著每個SM中調(diào)度器比例的增加,,砍掉第二個調(diào)度端口似乎是對具有獨立數(shù)據(jù)路徑和數(shù)學調(diào)度單元的子核心的權(quán)衡,。而具備FP32/INT32執(zhí)行能力,也為其他低精度/混合精度模型打開了大門,。這些子核方面的增強,,都是為了優(yōu)化Tensor Core陣列。
另一個重大變化是合并L1緩存和共享內(nèi)存,。在同一個塊中,,共享內(nèi)存可配置為每SM 最高96 KB。HBM2控制器也進行了更新,,其效率提高了10~15%,。
深度學習基準測試
深度學習從框架到模型,再到API和庫,,AI硬件的許多部分都是高度定制化的,,這樣的新領(lǐng)域有時會讓人非常難以理解。
俗話說“光說不練假把式”,,實踐永遠是檢驗真理的唯一標準,。對計算機來說,介紹的再詳細也不如真刀真槍跑一下測試,,沒有什么比benchmark更能提現(xiàn)硬件的實際表現(xiàn)了。
隨著ImageNet和一些衍生模型(AlexNet,、VGGNet,、Inception、Resnet等)的影響,,ILSVRC2012(ImageNet大規(guī)模視覺識別挑戰(zhàn))中的圖像數(shù)據(jù)集訓練逐漸被行業(yè)所認可,。
現(xiàn)在基本上所有深度學習框架都支持CUDA和cuDNN,對于Volta而言,,支持FP16存儲的框架也都支持Tensor Core加速,,啟用FP16存儲后Tensor Core加速會自動啟用。