不要太較真自動駕駛算力(TOPS)

不要太較真自動駕駛算力(TOPS)

自動駕駛的TOPS競賽有實際意義,但意義沒有想象那麼大,其中有很多誤區,不好好識別容易導致不好的事情發生。

TOPS說的只是GPU算力

首先算力和你使用的計算晶片有關係,如果你的演算法大部分是標量計算,那這個值沒有意義,

當下我們所說的TOPS高算力實際都只是GPU的乘積累加矩陣運算算力。

不同的晶片都透過匯流排和外界聯絡,有自己的快取體系,以及數字和邏輯運算單元。CPU和GPU兩者的區別在於片內的快取體系和數字邏輯運算單元的結構差異。CPU雖然有多核,但總數沒有超過兩位數,每個核都有足夠大的快取和足夠多的數字和邏輯運算單元,並輔助有很多加速分支判斷甚至更復雜的邏輯判斷的硬體;GPU的核數遠超CPU,被稱為眾核(NVIDIA Fermi有512個核)。每個核擁有的快取大小相對小,數字邏輯運算單元也少而簡單(GPU初始時在浮點計算上一直弱於CPU)。從結果上導致CPU擅長處理具有複雜計算步驟和複雜資料依賴的計算任務,如分散式計算,資料壓縮,人工智慧,物理模擬,以及其他很多很多計算任務等。

當程式設計師為CPU編寫程式時,他們傾向於利用複雜的邏輯結構最佳化演算法從而減少計算任務的執行時間,即Latency。當程式設計師為GPU編寫程式時,則利用其處理海量資料的優勢,透過提高總的資料吞吐量(Throughput)來掩蓋Lantency。

普遍意義上,CPU對應標量計算,主要是路徑規劃和決策演算法,此外部分鐳射雷達使用ICP點雲配准算法,CPU比GPU能更好對應。常用的感測器融合如卡爾曼濾波演算法也多是標量運算。GPU對應向量或者說向量計算,包括點雲,地圖,深度學習,核心是矩陣運算。我們可以將標量視為零階張量,向量視為一階張量,那麼矩陣就是二階張量。

目前TOPS的物理計算單位是積累加運算(英語:Multiply Accumulate, MAC)是在微處理器中的特殊運算。實現此運算操作的硬體電路單元,被稱為“乘數累加器”。這種運算的操作,是將乘法的乘積結果b*c和累加器a的值相加,再存入累加器a的操作:

若沒有使用 MAC 指令,上述的程式可能需要二個指令,但 MAC 指令可以使用一個指令完成。而許多運算(例如卷積運算、點積運算、矩陣運算、數字濾波器運算、乃至多項式的求值運算)都可以分解為數個 MAC 指令,因此可以提高上述運算的效率。

MAC指令的輸入及輸出的資料型別可以是整數、定點數或是浮點數。若處理浮點數時,會有兩次的數值修約(Rounding),這在很多典型的DSP上很常見。若一條MAC指令在處理浮點數時只有一次的數值修約,則這種指令稱為“融合乘加運算”/“積和熔加運算”(fused multiply-add, FMA)或“熔合乘法累積運算”(fused multiply–accumulate, FMAC)。

晶片運算精度的概念

討論理論算力前有幾個基本概念,GPU計算常用的資料型別有三種FP32,FP16和INT8,三種的計算方式如下

單精度浮點儲存-FP32佔用4個位元組,共32位,其中1位為符號位(0為正,1為負),8位指數位,23為有效數字。

不要太較真自動駕駛算力(TOPS)

IEEE 754規定,對於32位的浮點數,最高的1位是符號位s,接著的8位是指數E,剩下的23位為有效數字M

半精度浮點儲存-FP16佔用2個位元組,共16位,其中1位為符號位(0為正,1為負),5位指數位,10為尾數位。

整數儲存-INT8,八位整型佔用1個位元組,共8位,其中1位為符號位(0為正,1為負),7為資料位

整數的計算很好理解2的7次方構成(-128-127)的數字範圍

換算成10進製為 從低位到高位開始計算 0 1 1 1 1 1 1 10*2^7 + 1*2^6 + 1*2^5 + 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^00 + 64 + 32 + 16 + 8 + 4 + 2 + 1= 127換算成10進製為 從低位到高位開始計算 1 0 0 0 0 0 0 01*2^7 + 0*2^6 + 0*2^5 + 0*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0=128

執行工況(執行頻率)的概念

GPU和CPU都有工作頻率,頻率越高,效能越高;同時它的功耗和發熱也越高。一般意義的超頻就是更改運算頻率來提高效能。

Xavier(GPU)20W功耗下單精度浮點效能1。3TFLOPS,Tensor核心效能20TOPs,解鎖到30W後可達30TOPs。為什麼有每瓦TOPS一說,就是為了規避超頻這個問題。另外,這裡的功耗往往指的是單元晶片本身的功耗與算力比,沒有考慮DRAM。在深度學習計算中,資料頻繁存取,極端情況下,功耗可能不低於運算單元。

實際執行頻率和設定的工作頻率也不一樣,往往取決於溫度與電壓,在設計積體電路時,模擬或EDA會給出常見的三種狀態分析。

WCS (Worst Case Slow) : slow process, high temperature, lowestvoltage

TYP (typical) : typical process, nominal temperature, nominalvoltage

BCF (Best Case Fast ) : fast process, lowest temperature, highvoltage

假設一個晶片,執行頻率2GHz,一般溫度25°,電壓0。8V,算力為2TOPS。在WCS下,溫度為125度,電壓0。72V,此時頻率會降低到1GHz,算力就會降為1TOPS。一般宣傳的TOPS都是BCF下的結果。

TOPS理論值的計算方法

宣傳的TOPS往往都是運算單元的理論值,而非整個硬體系統的真實值。真實值更多取決於內部的SRAM、外部DRAM、指令集和模型最佳化程度。最糟糕的情況下,真實值是理論值的1/10算力甚至更低,一般也就50%的使用率。

理論值取決於運算精度、MAC的數量和執行頻率。

可大致簡化為INT8精度下的MAC數量在FP16精度下等於減少了一半。FP32再減少一半,依次類推。

假設有512個MAC運算單元,執行頻率為1GHz,INT8的資料結構和精度,算力為512 x 2 x 1 GHz = 1000 Billion Operations/Second = 1 TOPS(Tera-Operations/second)。FP16精度那麼就是0。5TOPS,FP32精度就是0。25TOPS。英偉達的Tesla V100有640個Tensor核,每核有64個MAC運算單元,執行頻率大約1。480GHz,那麼INT8下算力為640 * 64 * 2 * 1。480 GHz=121TOPS。

算力真實TOPS和理論TOPS的差距很大-核心還是匹配性

ResNet-50需要MAC大約為每秒70億次運算,英偉達TeslaT4執行ResNet-50每秒可處理3920張224*224的影象,3920 images/second x 7 BillionOperations/image = 27,440 Billion Operations/second = 27。4 TrillionOperations/Second = 27。4 TOPS。而英偉達Tesla T4的理論算力是130TOPS。實際只有27。4TOPS。

決定算力真實值最主要因素是記憶體( SRAM和DRAM)頻寬,谷歌第一代TPU,理論值為90TOPS算力,最差真實值只有1/9,也就是10TOPS算力,因為第一代記憶體頻寬僅34GB/s。而第二代TPU下血本使用了HBM記憶體,頻寬提升到600GB/s(單一晶片TPU V2板記憶體總頻寬2400GB/s)。

這裡談的還是靜態層面上的問題,一代TPU更多的是面向一個主流演算法,他的算力和記憶體匹配沒有做好。

但就算面向主流演算法做好了記憶體和算力的匹配,情況也不會有多好的改善,因為動態的來看,不考慮使用的演算法,記憶體和算力無法很好的匹配

演算法對於記憶體頻寬的需求通常使用「運算強度 (operational intensity,或稱 arithmetic intensity)」這個量來表示,單位是 OPs/byte。這個量的意思是,在演算法中平均每讀入單位資料,能支援多少次運算操作。運算強度越大,則表示單位資料能支援更多次運算,也就是說演算法對於記憶體頻寬的要求越低。

我們來舉一個例子。對於步長(stride)為 1 的 3x3 卷積運算,假設輸入資料平面大小為 64x64。簡單起見,假設輸入和輸出 feature 都為 1。這時候,總共需要進行 62x62 次卷積運算,每次卷積需要做 3x3=9 次乘加運算,所以總共的計算次數為 34596,而資料量為(假設資料和卷積核都用單精度浮點數 2byte):64x64x2(輸入資料)+ 3x3x2(卷積核數據)= 8210 byte,所以運算強度為 34596/8210=4。21。如果我們換成 1x1 卷積,那麼總的計算次數變成了 64x64=4096,而所需的資料量為 64x64x2 + 1x1x2=8194。顯然,切換為 1x1 卷積可以把計算量降低接近 9 倍,但是運算強度也降低為 0。5,即對於記憶體頻寬的需求也上升了接近 9 倍。因此,如果記憶體頻寬無法滿足 1x1 卷積計算,那麼切換成 1x1 卷積計算雖然降低了接近 9 倍計算量,但是無法把計算速度提升 9 倍。

深度學習計算裝置存在兩個瓶頸,一個是處理器計算能力,另一個是計算頻寬。分析哪一個限制了計算效能可以使用 Roofline 模型-計算效能(縱軸)和演算法的運算強度(橫軸)。Roofline 曲線分成了兩部分:左邊的上升區,以及右邊的飽和區。當演算法的運算強度較小時,曲線處於上升區,即計算效能實際被記憶體頻寬所限制,有很多計算處理單元是閒置的。隨著演算法運算強度上升,即在相同數量的資料下演算法可以完成更多運算,於是閒置的運算單元越來越少,這時候計算效能就會上升。然後,隨著運算強度越來越高,閒置的計算單元越來越少,最後所有計算單元都被用上了,Roofline 曲線就進入了飽和區,此時運算強度再變大也沒有更多的計算單元可用了,於是計算效能不再上升,或者說計算效能遇到了由計算能力(而非記憶體頻寬)決定的「屋頂」(roof)。拿之前 3x3 和 1x1 卷積的例子來說,3x3 卷積可能在 roofline 曲線右邊的飽和區,而 1x1 卷積由於運算強度下降,有可能到了 roofline 左邊的上升區,這樣 1x1 卷積在計算時的計算效能就會下降無法到達峰值效能。雖然 1x1 卷積的計算量下降了接近 9 倍,但是由於計算效能下降,因此實際的計算時間並不是 3x3 卷積的九分之一。

不要太較真自動駕駛算力(TOPS)

軟體一體化設計

為何大部分人工智慧演算法公司都想定製或自制計算平臺。演算法的效能與硬體設計往往脫離不開。

追求模組化就要犧牲利用率。要提高利用率就需要軟硬體一體設計。你的演算法是用GPU合適還是CPU合適,網路模型一次用多少記憶體又同時使用多少MAC,由此來設計晶片。或者說反過來給定一個晶片,我的演算法要如何相容,是否要減少記憶體訪問次數提高利用率,還是要遷移部分CPU基於規則的演算法,改為用GPU基於深度學習來實現。軟硬體一起考慮往往才能充分利用好系統性能。

不要太較真自動駕駛算力(TOPS)

置頂

置頂

置頂

置頂

置頂

置頂

置頂

⇧置頂

⇧置頂

⇧置頂