BF16是為深度學(xué)習(xí)而優(yōu)化的新數(shù)字格式 預(yù)測精度的降低幅度最小
深度學(xué)習(xí)、AI人工智能等技術(shù)正在成為各大處理器的熱點(diǎn),雖然目前的主流是通過專用的NPU單元來加速AI指令,但在CPU中集成相應(yīng)的指令集也會(huì)帶來很大的改變,Intel在Cascade Lake及10nm Ice Lake處理器中就加入了BFlota16指令集(簡稱BF16),AI性能達(dá)到了前代的2.5倍以上。
BF16是為深度學(xué)習(xí)而優(yōu)化的新數(shù)字格式,它保證了計(jì)算能力和計(jì)算量的節(jié)省,而預(yù)測精度的降低幅度最小。
BF16,有時(shí)也被稱為BFloat16或Brain Float16,是一種針對(duì)人工智能/深度學(xué)習(xí)應(yīng)用程序進(jìn)行優(yōu)化的新數(shù)字格式。它在谷歌Brain上獲得了廣泛的應(yīng)用,包括谷歌、英特爾、Arm和許多其他公司的人工智能加速器。
BF16背后的想法是通過降低數(shù)字的精度來減少計(jì)算能力和將張量相乘所需的能源消耗。張量是一個(gè)三維的數(shù)字矩陣;張量的乘法是計(jì)算人工智能所需的關(guān)鍵數(shù)學(xué)運(yùn)算。
現(xiàn)在大多數(shù)人工智能訓(xùn)練都使用FP32, 32位浮點(diǎn)數(shù)。雖然這意味著計(jì)算非常準(zhǔn)確,但它需要強(qiáng)大的硬件和大量的電力。推理通常使用INT8, 8位整數(shù)(整數(shù))。雖然使用諸如INT8這樣的較低精度的數(shù)字系統(tǒng)可以在相同的硬件上提供更高的吞吐量,從而節(jié)省電力,但是計(jì)算(預(yù)測)的結(jié)果卻不那么準(zhǔn)確。
BF16的目的是優(yōu)化精度和預(yù)測精度之間的權(quán)衡,以增加吞吐量。
解剖FP
計(jì)算中的二進(jìn)制數(shù)表示為:
底數(shù)是2,尾數(shù)是x的基指數(shù),
在FP32中,每個(gè)數(shù)字都表示為:
1位表示符號(hào)(+或-),后跟8位的指數(shù),在后面是23位的尾數(shù)(總共32位)。
對(duì)于BF16,谷歌Brain提出通過將FP32的尾數(shù)截?cái)酁?位來降低精度。
因此,BF16數(shù)字表示為:
1個(gè)符號(hào)位+ 8個(gè)指數(shù)位+7個(gè)尾數(shù)位(總共16位)。
這些16位數(shù)字提供了谷歌所追求的高吞吐量需求,同時(shí)保留了FP32的近似動(dòng)態(tài)范圍(該系統(tǒng)可以表示的數(shù)字的整個(gè)范圍),因?yàn)橹笖?shù)是相同的大小。
使用BF16算法的預(yù)測精度與FP32相似,但不如FP32精確(谷歌曾說過,這是因?yàn)?u>神經(jīng)網(wǎng)絡(luò)對(duì)指數(shù)的大小比尾數(shù)敏感得多)。對(duì)于大多數(shù)應(yīng)用程序,這種折衷還是被認(rèn)為可以接受。
為什么不用FP16?
現(xiàn)有的FP16格式(在移動(dòng)圖形應(yīng)用程序中很流行)也是16位浮點(diǎn)數(shù)格式。為什么不用它呢?
FP16包括:
1個(gè)符號(hào)位,5個(gè)指數(shù)位,10個(gè)尾數(shù)位(共16位)。
使用這種格式,指數(shù)比FP32小,因此動(dòng)態(tài)范圍大大縮小。此外,將FP32數(shù)字轉(zhuǎn)換成FP16比轉(zhuǎn)換成BF16要困難得多——這比直接截?cái)辔矓?shù)要多得多,而尾數(shù)截?cái)嗍且粋€(gè)相對(duì)簡單的操作。
另一個(gè)重點(diǎn)是計(jì)算所需的硅物理面積。由于硬件乘法器的物理大小隨尾數(shù)寬度的平方而增加,因此從FP32切換到BF16可以顯著節(jié)省硅面積(這足以說服谷歌在其張量處理單元(TPU)芯片中使用BF16)。BF16乘法器比FP32乘法器小8倍,但仍然是FP16的一半。
DL還有哪些格式?
BF16并不是為深度學(xué)習(xí)提出的唯一新數(shù)字格式。在2017年Nervana提出了一個(gè)名為Flexpoint的格式。這個(gè)想法是通過結(jié)合點(diǎn)和浮點(diǎn)數(shù)系統(tǒng)的優(yōu)點(diǎn)來減少計(jì)算和內(nèi)存需求。
定點(diǎn)數(shù)使用固定的位來表示整數(shù)(整數(shù))和分?jǐn)?shù)(小數(shù)點(diǎn)后的部分)—與上面描述的浮點(diǎn)格式相比,用定點(diǎn)數(shù)計(jì)算通常更簡單、更快。但是,對(duì)于給定位數(shù),定點(diǎn)數(shù)的動(dòng)態(tài)范圍要比浮點(diǎn)數(shù)小得多。
Flexpoint數(shù)字共享相同的指數(shù),使張量更容易相乘
Flexpoint張量中的(浮點(diǎn)數(shù))數(shù)使用相同的指數(shù)(不僅僅是相同的指數(shù)大小,而是完全相同的指數(shù)值)。這個(gè)指數(shù)是由張量中的所有數(shù)字共享的,所以指數(shù)的傳遞可以在整個(gè)張量中平攤。
張量相乘可以作為一個(gè)定點(diǎn)運(yùn)算,因?yàn)槊總€(gè)計(jì)算的指數(shù)是相同的——這比浮點(diǎn)數(shù)所需的數(shù)學(xué)運(yùn)算要簡單。這些計(jì)算代表了深度學(xué)習(xí)數(shù)學(xué)的絕大部分,因此節(jié)省了相當(dāng)大的費(fèi)用。然而,由于所有數(shù)字都有相同的指數(shù),所以導(dǎo)致管理指數(shù)很復(fù)雜,動(dòng)態(tài)范圍(可以表示的數(shù)字范圍)很低。
可惜的是,F(xiàn)lexpoint從未成功,甚至Nervana自己的芯片在消亡前也使用了BF16。
延伸閱讀——ARM下代處理器架構(gòu)將支持BFloat16指令集 AI性能突飛猛進(jìn)
ARM宣布將在下一版ARMv8架構(gòu)中加入新的Non及SVE指令,以便支持BFloat16運(yùn)算。
BF16運(yùn)算還不是IEEE的標(biāo)準(zhǔn),但與標(biāo)準(zhǔn)的FP32浮點(diǎn)、FP16半精度相比,BF16運(yùn)算優(yōu)點(diǎn)多多,它可以輕松取代FP32,而且還能保持正確的NN神經(jīng)網(wǎng)絡(luò)操作,這點(diǎn)是FP16做不到的,而且它占用的內(nèi)存及帶寬只有FP32一半,所以性能更高,而且不需要復(fù)雜的架構(gòu)改變。
總之,支持BF16運(yùn)算優(yōu)點(diǎn)多多,根據(jù)ARM做的模擬,不同類型的運(yùn)算中BF16帶來的性能提升不等,少的有1.6倍性能,多的可達(dá)4倍性能,所以在AI方面性能變化是非常大的,是前代的數(shù)倍之多。