人工智能有數(shù)字系統(tǒng)
BF16是為深度學(xué)習(xí)而優(yōu)化的新數(shù)字格式,它保證了計算能力和計算量的節(jié)省,而預(yù)測精度的降低幅度最小
BF16,有時也被稱為BFloat16或Brain Float16,是一種針對人工智能/深度學(xué)習(xí)應(yīng)用程序進行優(yōu)化的新數(shù)字格式。它在谷歌Brain上獲得了廣泛的應(yīng)用,包括谷歌、英特爾、Arm和許多其他公司的人工智能加速器。
BF16背后的想法是通過降低數(shù)字的精度來減少計算能力和將張量相乘所需的能源消耗。張量是一個三維的數(shù)字矩陣;張量的乘法是計算人工智能所需的關(guān)鍵數(shù)學(xué)運算。
現(xiàn)在大多數(shù)人工智能訓(xùn)練都使用FP32, 32位浮點數(shù)。雖然這意味著計算非常準確,但它需要強大的硬件和大量的電力。推理通常使用INT8, 8位整數(shù)(整數(shù))。雖然使用諸如INT8這樣的較低精度的數(shù)字系統(tǒng)可以在相同的硬件上提供更高的吞吐量,從而節(jié)省電力,但是計算(預(yù)測)的結(jié)果卻不那么準確。
BF16的目的是優(yōu)化精度和預(yù)測精度之間的權(quán)衡,以增加吞吐量。
解剖FP
計算中的二進制數(shù)表示為:
底數(shù)是2,尾數(shù)是x的基指數(shù),
在FP32中,每個數(shù)字都表示為:
1位表示符號(+或-),后跟8位的指數(shù),在后面是23位的尾數(shù)(總共32位)。
對于BF16,谷歌Brain提出通過將FP32的尾數(shù)截斷為7位來降低精度。
因此,BF16數(shù)字表示為:
1個符號位+ 8個指數(shù)位+7個尾數(shù)位(總共16位)。
這些16位數(shù)字提供了谷歌所追求的高吞吐量需求,同時保留了FP32的近似動態(tài)范圍(該系統(tǒng)可以表示的數(shù)字的整個范圍),因為指數(shù)是相同的大小。
使用BF16算法的預(yù)測精度與FP32相似,但不如FP32精確(谷歌曾說過,這是因為神經(jīng)網(wǎng)絡(luò)對指數(shù)的大小比尾數(shù)敏感得多)。對于大多數(shù)應(yīng)用程序,這種折衷還是被認為可以接受。
為什么不用FP16?
現(xiàn)有的FP16格式(在移動圖形應(yīng)用程序中很流行)也是16位浮點數(shù)格式。為什么不用它呢?
FP16包括:
1個符號位,5個指數(shù)位,10個尾數(shù)位(共16位)。
使用這種格式,指數(shù)比FP32小,因此動態(tài)范圍大大縮小。此外,將FP32數(shù)字轉(zhuǎn)換成FP16比轉(zhuǎn)換成BF16要困難得多——這比直接截斷尾數(shù)要多得多,而尾數(shù)截斷是一個相對簡單的操作。
另一個重點是計算所需的硅物理面積。由于硬件乘法器的物理大小隨尾數(shù)寬度的平方而增加,因此從FP32切換到BF16可以顯著節(jié)省硅面積(這足以說服谷歌在其張量處理單元(TPU)芯片中使用BF16)。BF16乘法器比FP32乘法器小8倍,但仍然是FP16的一半。