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