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















