領域專用架構與加速器

降低精度運算(reduced-precision arithmetic)

當你估算小費時,你不會算到 18.000000%、精確到小數十位——你會湊到幾塊錢,因為這對目的已夠精確,又快得多。降低精度運算就是硬體在做同一件事:用比尋常 32 或 64 位元格式更少的位元來表示數字,接受一點捨入誤差,換取速度、能量、記憶體上的大幅收益——只要任務容忍得了。

具體來說,一般運算常用 32 位元浮點數(約 7 位十進位精度)或 64 位元雙精度。降低精度使用更窄的格式:bfloat16,一種 16 位元浮點數,保留 32 位元浮點數完整的指數範圍,卻丟掉尾數的精度(所以它表示的數量級範圍大致相同,但細節較粗);或 int8,一種只有 256 個可能值的 8 位元整數,用於把網路的權重「量化」到那個尺度之後。更窄的數字意味著每個值佔用更少記憶體、搬動更少頻寬,乘加硬體也更小——所以你能在同一晶片塞進多得多的算術單元,並以更低能量運行它們。一個 8 位元的乘法,成本只是 32 位元的一小部分。

誠實的重點是:這是一筆領域專用的取捨,不是普世的免費勝利。它對深度學習有效,是因為神經網路在統計上很穩健——它們被訓練成能容忍雜訊,一點捨入很少改變最終答案(一隻貓仍被分類為貓)。但對於譬如銀行帳本或物理模擬這種小誤差會累積成錯誤結果的場合,它就魯莽了。選擇降低精度,意味著清楚知道你的領域能吸收多少誤差;bfloat16 正是為機器學習設計的,因為這個領域容忍低尾數精度,卻需要寬廣的指數範圍以避免訓練時溢位。

把一個訓練好的神經網路從 32 位元浮點數量化成 int8,通常能把模型縮到四分之一大小,並在加速器上跑快好幾倍,而準確度只掉零點幾個百分點——很划算。對一個科學模擬做同樣的 int8 量化,卻可能讓小小的捨入誤差變成完全錯誤的結果。

每個數字用更少位元:更小、更快、更省能——但僅限於該領域容忍捨入之處。

bfloat16 與標準的 IEEE 16 位元浮點數(FP16)不同:bfloat16 以較少尾數位元為代價保留較寬的指數(範圍同 FP32),適合訓練。降低精度只有在你已測得自己的領域能吸收誤差時才安全。

又称
low-precision arithmeticquantizationbfloat16int8低精度運算量化