機器學習工程與系統

混合精度訓練(mixed-precision training)

/ mikst-pruh-SIZH-un TRAY-ning /

混合精度訓練,是指把絕大多數數字運算改用「精度更低」的數字來做——每個數字的有效位數更少——以求更快、更省記憶體,同時把少數關鍵環節仍保留在全精度,免得準確度崩掉。想像一個木匠:粗活兒他量到「最近的厘米」就動手,圖個快;可一到真正要緊的榫接,他就換上毫米刻度的尺子。能將就的地方粗著來,要緊的地方再精細。

電腦用固定數目的「位元」來存數;位元越多,能表示的值越精確,但佔的記憶體越多、算得越慢。傳統上訓練從頭到尾都用 32 位元的數字。混合精度則把大頭的活兒改用 16 位元的數字(叫 FP16 或 BF16 的格式)來做,加速器晶片啃它們大約能快上一倍,佔的記憶體也只有一半。危險在於:極小的數字可能被捨入成零,把學習給弄壞;所以模型會保留一份 32 位元的參數「主副本」,並用「損失縮放」之類的招數,護住那些嬌貴的更新。

為什麼這很重要:這是現代訓練裡最廉價的大收益之一——往往能近乎把速度翻倍、記憶體減半,而最終品質幾乎不受損,正因如此它如今成了標準做法。誠實的提醒是:它並非白來的魔法。粗手粗腳地用,會讓訓練變得不穩,或悄悄損傷準確度,而且並非每個運算都受得住低精度。它是工程師要去調校的一樁謹慎權衡,而不是你按下去就能忘掉的開關。

某一層的矩陣乘法用快速的 16 位元運算來跑,但權重更新的累計帳本,則保留在一份 32 位元的主副本裡。那些在 16 位元下會被捨入成零的微小梯度,在 32 位元副本裡得以存活,於是模型還能繼續學。

能將就的地方用快算,需要讓小數存活的地方留一份精確的主副本。

訓練中的低精度(16 位元數字、保持動態)與部署用的量化(常是 8 位元乃至更低、固定不變)不是一回事。訓練需要足夠的精度去學到微小的更新;而一個練好的模型,事後往往能被壓得狠得多。

又稱
half precisionFP16BF16混合精度半精度训练