加速AI深度學習 BF16浮點格式應運而生
為了加速AI深度學習(DL)的效能,包括Google、英特爾和Arm等越來越多公司開始導入BF16,但這種新的浮點格式可能成為深度學習運算主流?
全新的數字格式——‘BF16’,專為人工智慧(AI)/深度學習(DL)應用最佳化發展而來,有時也稱為‘BFloat16’或‘Brain Float 16’。它一開始是由Google Brain團隊發明,並用於其第三代Tensor Processing Unit (TPU),如今已被Google、英特爾(Intel)、Arm等許多公司的AI加速器廣泛採用。
採用16位腦浮點(brain floating point)格式的BF16,主要概念在於透過降低數字的精度,從而減少讓張量(tensor)相乘所需的運算資源和功耗。「張量」是數字的三維(3D)矩陣;張量的乘法運算即是AI計算所需的關鍵數學運算。
如今,大多數的AI訓練都使用FP32,即32位浮點數。儘管這表示可以達到非常準確的計算,但需要強大的硬體而且極其耗電。推論一般使用INT8¬¬,即8位元整數精度的運算模式,雖然是較低精度的數字系統,但在相同硬體上提供了更高的傳輸效率,因而能夠更省電,只是計算結果(預測)的準確性較低些。
BF16的基本概念是為精度和預測準確性之間的權衡進行最佳化,從而提高吞吐量。
浮點數字解析
在運算中的二進制數字可以表示為:
尾數x基數指數,基數為2
在FP32浮點格式中,每個數字都表示為:
1位代表符號(+或-),其後為8位指數,接著是23位尾數(總共32位數字)
至於BF16浮點格式,Google Brain團隊建議將FP32數字的尾數縮減到7位,以稍降低精度。
因此,BF16數字則可表示為:
1個符號位,然後8個指數位,接著是7個尾數位(共16位數)
浮點數字格式
(來源:Google)
由於指數大小相同,這些16位數字提供了Google所追求的更高吞吐量,同時又能保留FP32的近似動態範圍(該系統可以代表整個數字範圍)。
使用BF16的演算法預測準確度相當於FP32——Google解釋這是因為神經網路對於指數的大小要比尾數更敏感)。對於大多數應用來說,這已經是可以被接受的折衷方案了。
為什麼不使用FP16?
目前普遍用於行動繪圖應用中的FP16,同樣也是16位浮點數字格式。那麼,為什麼不直接使用呢?
FP16包括:
1個符號位,5個指數位,然後10個尾數位(共16位數字)
使用這種格式時,由於指數小於FP32,因而動態範圍大幅縮減。此外,將FP32數字轉換為FP16比起轉換為BF16更困難——相較於僅截去尾數,FP16更麻煩,而BF16的操作相對上較簡單。
另一個要點是計算所需要的晶片實體面積。由於硬體乘法器的實體尺寸會隨著尾數寬度的平方而增加,因此從FP32轉換到BF16可以大幅節省晶片面積——這也就是Google之所以為其TPU晶片選擇使用BF16。BF16乘法器比FP32乘法器的尺寸更小8倍,而且也只有FP16同類型晶片約一半的尺寸。
還有哪些DL運算格式?
BF16並不是唯一一種被提議用於深度學習的新數字格式。例如,AI軟體新創公司Nervana在2017年曾經提出一種稱為‘Flexpoint’的格式。其概念是透過結合定點和浮點數字系統的優點,從而減少運算和記憶體的需求。
定點數(fixed point number)使用固定位數來代表整數和分數(小數點後的部分)——相較於上述的浮點格式,使用定點數字執行運算通常更簡單,也更快捷。然而,針對特定的位數,定點數的動態範圍比浮點數更小得多。
Flexpoint數字共享相同的指數,讓張量更易於相乘
(來源:Nervana/NeurIPS)
Flexpoint張量中的所有(浮點)數字都使用相同的指數(不只是相同的指數大小,而且是完全相同的指數值)。張量中的所有數字之間共享指數,從而可以在整個張量中共同分擔指數的通訊。
然後就可以讓張量相乘作為定點運算,因為每次計算的指數都是相同的——這比起浮點數所需的數學更簡單。這些計算足以代表絕大多數的深度學習數學,因此所能節省的資源與功耗都相當可觀。然而,管理這些指數極其複雜,而且動態範圍(可以表示的數字範圍)很低,因為所有的數字都擁有相同的指數。
然而,Flexpoint卻從未能起飛,甚至是Nervana在賣給英特爾之前,其自家晶片都一直使用BF16。
編譯:Susan Hong
(參考原文:Artificial Intelligence Gets Its Own System of Numbers,by Sally Ward-Foxton)
訂閱EETimes Taiwan電子報
加入我們官方帳號LINE@,最新消息一手掌握!