只要你開始接觸大模型訓練、推理或部署,很快就會遇到一組高頻縮寫:FP32、FP16、BF16、TF32、FP8。它們看起來像是模型頁面上的幾個附加標籤,但實際影響遠不只是「寫法不同」。
這些類型決定了數字在顯存裡怎麼存、在計算中怎麼表示,也直接影響模型訓練是否穩定、推理速度如何,以及一張顯示卡到底能裝下多大的模型。
所以如果你想真正理解大模型裡的精度取捨,最值得先補的一課,不是某個具體模型的跑分,而是先把這些常見張量類型各自是什麼、為什麼會這樣設計搞清楚。
張量類型到底在決定什麼
大模型本質上是海量參數參與的矩陣運算,而張量類型就是這些數字在顯存裡如何存、在計算中如何表示。
它的核心取捨通常圍繞三個維度展開:
- 精度
- 顯存占用
- 計算速度
這和圖片格式其實很像。無損格式保留細節更多,但體積大、載入慢;壓縮格式會丟掉一部分人眼不敏感的資訊,換來更小的體積與更快的處理速度。大模型之所以能接受這種取捨,是因為在極大量參數裡,很多微小數值變化並不會明顯影響最終輸出。
也正因如此,模型世界裡才會出現一整套不同精度的張量格式。
一個數字是怎麼被表示的
理解這些格式之前,可以先記住一個非常基礎的結構。一個浮點數通常由三部分組成:
- 符號位:決定正負
- 指數位:決定數值範圍
- 尾數位:決定數值精細程度
在大模型裡,尾數精度當然重要,但很多時候模型更怕的是數值範圍不夠,也就是指數位太小,導致溢出或訓練不穩定。很多張量格式的設計,本質上就是在「範圍」與「細節」之間重新分配有限的 bit 數。
下面這張圖可以先幫你建立一個整體印象:
FP32:最穩,但最貴
FP32 是最傳統的單精度浮點格式,總共 32 bit,也就是 4 個位元組。
它的優點很直接:
- 數值範圍大
- 精度高
- 訓練最穩
但問題也同樣明顯:太占顯存。
一個非常粗略的估算方式是:
|
|
如果一個 27B 模型完全用 FP32 存權重,那麼光權重本身就大約需要:
|
|
這還沒算激活值、KV Cache、優化器狀態與其他執行期開銷。也就是說,FP32 在今天的大模型推理與訓練裡,已經不是「預設選擇」,而更像是「最穩的基線格式」。
FP16:體積減半,但穩定性一般
FP16 把每個參數壓縮到 2 個位元組,顯存占用相較 FP32 直接減半。
對同一個 27B 模型來說,如果只看權重體積:
|
|
這就已經能解釋為什麼很多部署說明裡,27B 模型的顯存需求會落在 50GB 左右。
FP16 的優勢很明顯:
- 顯存壓力大幅下降
- 吞吐更高
- 早期混合精度訓練大量使用
但它的問題在於指數位偏小,動態範圍不夠大。對大模型訓練來說,這會讓溢出更容易發生,需要額外依賴 loss scaling 一類技巧來補救,工程上比較麻煩。
所以現在 FP16 仍然常見,但在很多場景裡,它已經不再是最舒服的選擇。
BF16:大模型時代更實用的半精度
BF16 同樣只占 2 個位元組,但和 FP16 的設計重點不一樣。
它保留了更大的指數範圍,讓它在動態範圍上更接近 FP32,只是犧牲了一部分尾數精度。這種取捨對大模型尤其友好,因為很多時候模型對「範圍」更敏感,對尾數少幾位反而沒那麼敏感。
這也是為什麼現在很多訓練框架、很多大模型論文與大量實際部署方案,都更偏向 BF16。
你可以把它理解成:
- 顯存成本接近
FP16 - 穩定性體驗更接近
FP32
如果一套 27B 部署方案寫的是 50GB 左右顯存,而另一套經過進一步優化後接近 30GB,前者往往還停留在 FP16/BF16 這一層,後者則通常已經繼續往更低精度或量化方向走了。
TF32:不是省顯存,而是加速 FP32 工作流
TF32 很容易被誤會成「又一種更省的格式」,但它的定位其實不太一樣。
從常見理解上看,它可以近似視為一種保留較大指數範圍、但縮短尾數精度的計算格式。
不過要注意,TF32 更像是一條 Tensor Core 計算路徑裡的內部計算格式,而不是像 FP16/BF16 那樣主要拿來做權重存儲。
它主要是 NVIDIA 在較新的 GPU 上提供的一種計算模式,目標不是減少顯存占用,而是讓原本基於 FP32 的訓練流程,在盡量不大改程式碼的前提下跑得更快。
它的特點可以概括成一句話:
- 對外看起來還是
FP32工作流 - 底層在矩陣乘法時做了更快的近似計算
所以 TF32 主要解決的是「FP32 太慢」的問題,而不是「FP32 太占顯存」的問題。如果你關心的是為什麼同一個模型部署時顯存需求不一樣,TF32 不是最主要的答案。
FP8:進一步壓縮,但更考驗工程能力
再往下走就是 FP8。它把單個數值繼續壓縮到更少 bit 數,進一步降低顯存頻寬與存儲成本。
它常見的不是單一一種格式,而是兩類變體:E4M3 和 E5M2。
但 FP8 的代價也很明顯:位數太少以後,你很難同時兼顧範圍和精度,因此實際工程裡通常會針對不同階段採用不同變體,分別照顧前向、反向與梯度的穩定性。
這類格式代表的是一種更激進的思路:
- 願意犧牲更多精度
- 換取更低的存儲與更高的吞吐
- 需要更成熟的硬體與訓練框架配合
它很有前景,但對一般使用者來說,日常最常碰到的核心分界點,通常還是 FP32、FP16 和 BF16。
為什麼理解這些類型很重要
很多人第一次看到這些縮寫,會把它們理解成「模型下載頁上的一些實作細節」。但實際上,它們會直接改變你對模型訓練與部署的理解方式。
例如同樣一張顯示卡:
- 為什麼有些模型訓練必須強調數值穩定性
- 為什麼有些推理方案會優先談量化與低精度
- 為什麼看起來參數量相近的模型,部署門檻卻差很多
- 為什麼有些格式適合存權重,有些格式更適合做計算路徑
這些問題往下拆,最後幾乎都會回到同一個核心:你到底怎麼在「精度、範圍、顯存和速度」之間做取捨。
也正因如此,理解 FP32、FP16、BF16、TF32 和 FP8,不只是為了看懂術語表,而是為了在面對訓練配置、推理引擎與部署門檻時,知道這些數字背後到底在交換什麼。
一個實用的理解框架
如果你不想一開始就記一堆格式細節,可以先用下面這個順序理解:
FP32:最穩、最貴FP16:更省顯存,但範圍偏小BF16:顯存接近FP16,穩定性更適合大模型TF32:主要解決FP32太慢,不主要解決顯存FP8:更激進的壓縮與加速路線
當你以後再看到模型下載頁裡寫著 fp16、bf16、fp8,或者看到不同部署教學給出完全不一樣的顯存門檻時,就不會再覺得那只是「寫法不同」。它們背後其實對應的是完全不同的精度預算與工程取捨。
結語
大模型裡的張量類型,表面上是在討論 bit 數,實際上討論的是一整套工程取捨。
FP32、FP16、BF16、TF32 和 FP8 沒有絕對的好壞,它們只是分別站在不同的位置上,幫你在穩定性、範圍、精度、顯存和速度之間做平衡。
如果把這一層看懂,後面無論你是在讀訓練論文、調推理參數,還是比較不同部署方案,都會更容易抓住重點。