大模型常見張量類型入門:FP32、FP16、BF16、TF32 與 FP8

用一篇文章整理大模型裡最常見的張量類型:FP32、FP16、BF16、TF32 與 FP8,包括它們的位寬結構、優缺點,以及它們為什麼會影響訓練與部署體驗。

只要你開始接觸大模型訓練、推理或部署,很快就會遇到一組高頻縮寫:FP32FP16BF16TF32FP8。它們看起來像是模型頁面上的幾個附加標籤,但實際影響遠不只是「寫法不同」。

這些類型決定了數字在顯存裡怎麼存、在計算中怎麼表示,也直接影響模型訓練是否穩定、推理速度如何,以及一張顯示卡到底能裝下多大的模型。

所以如果你想真正理解大模型裡的精度取捨,最值得先補的一課,不是某個具體模型的跑分,而是先把這些常見張量類型各自是什麼、為什麼會這樣設計搞清楚。

張量類型到底在決定什麼

大模型本質上是海量參數參與的矩陣運算,而張量類型就是這些數字在顯存裡如何存、在計算中如何表示。

它的核心取捨通常圍繞三個維度展開:

  • 精度
  • 顯存占用
  • 計算速度

這和圖片格式其實很像。無損格式保留細節更多,但體積大、載入慢;壓縮格式會丟掉一部分人眼不敏感的資訊,換來更小的體積與更快的處理速度。大模型之所以能接受這種取捨,是因為在極大量參數裡,很多微小數值變化並不會明顯影響最終輸出。

也正因如此,模型世界裡才會出現一整套不同精度的張量格式。

一個數字是怎麼被表示的

理解這些格式之前,可以先記住一個非常基礎的結構。一個浮點數通常由三部分組成:

  • 符號位:決定正負
  • 指數位:決定數值範圍
  • 尾數位:決定數值精細程度

在大模型裡,尾數精度當然重要,但很多時候模型更怕的是數值範圍不夠,也就是指數位太小,導致溢出或訓練不穩定。很多張量格式的設計,本質上就是在「範圍」與「細節」之間重新分配有限的 bit 數。

下面這張圖可以先幫你建立一個整體印象:

FP32、FP16、BF16、TF32 與 FP8 的位寬結構總覽

FP32:最穩,但最貴

FP32 是最傳統的單精度浮點格式,總共 32 bit,也就是 4 個位元組。

FP32 位寬結構示意圖

它的優點很直接:

  • 數值範圍大
  • 精度高
  • 訓練最穩

但問題也同樣明顯:太占顯存。

一個非常粗略的估算方式是:

1
顯存占用 ≈ 參數量 × 每個參數的位元組數

如果一個 27B 模型完全用 FP32 存權重,那麼光權重本身就大約需要:

1
27B × 4 bytes ≈ 108GB

這還沒算激活值、KV Cache、優化器狀態與其他執行期開銷。也就是說,FP32 在今天的大模型推理與訓練裡,已經不是「預設選擇」,而更像是「最穩的基線格式」。

FP16:體積減半,但穩定性一般

FP16 把每個參數壓縮到 2 個位元組,顯存占用相較 FP32 直接減半。

FP16 位寬結構示意圖

對同一個 27B 模型來說,如果只看權重體積:

1
27B × 2 bytes ≈ 54GB

這就已經能解釋為什麼很多部署說明裡,27B 模型的顯存需求會落在 50GB 左右。

FP16 的優勢很明顯:

  • 顯存壓力大幅下降
  • 吞吐更高
  • 早期混合精度訓練大量使用

但它的問題在於指數位偏小,動態範圍不夠大。對大模型訓練來說,這會讓溢出更容易發生,需要額外依賴 loss scaling 一類技巧來補救,工程上比較麻煩。

所以現在 FP16 仍然常見,但在很多場景裡,它已經不再是最舒服的選擇。

BF16:大模型時代更實用的半精度

BF16 同樣只占 2 個位元組,但和 FP16 的設計重點不一樣。

BF16 位寬結構示意圖

它保留了更大的指數範圍,讓它在動態範圍上更接近 FP32,只是犧牲了一部分尾數精度。這種取捨對大模型尤其友好,因為很多時候模型對「範圍」更敏感,對尾數少幾位反而沒那麼敏感。

這也是為什麼現在很多訓練框架、很多大模型論文與大量實際部署方案,都更偏向 BF16

你可以把它理解成:

  • 顯存成本接近 FP16
  • 穩定性體驗更接近 FP32

如果一套 27B 部署方案寫的是 50GB 左右顯存,而另一套經過進一步優化後接近 30GB,前者往往還停留在 FP16/BF16 這一層,後者則通常已經繼續往更低精度或量化方向走了。

TF32:不是省顯存,而是加速 FP32 工作流

TF32 很容易被誤會成「又一種更省的格式」,但它的定位其實不太一樣。

從常見理解上看,它可以近似視為一種保留較大指數範圍、但縮短尾數精度的計算格式。

TF32 計算格式示意圖

不過要注意,TF32 更像是一條 Tensor Core 計算路徑裡的內部計算格式,而不是像 FP16/BF16 那樣主要拿來做權重存儲。

它主要是 NVIDIA 在較新的 GPU 上提供的一種計算模式,目標不是減少顯存占用,而是讓原本基於 FP32 的訓練流程,在盡量不大改程式碼的前提下跑得更快。

它的特點可以概括成一句話:

  • 對外看起來還是 FP32 工作流
  • 底層在矩陣乘法時做了更快的近似計算

所以 TF32 主要解決的是「FP32 太慢」的問題,而不是「FP32 太占顯存」的問題。如果你關心的是為什麼同一個模型部署時顯存需求不一樣,TF32 不是最主要的答案。

FP8:進一步壓縮,但更考驗工程能力

再往下走就是 FP8。它把單個數值繼續壓縮到更少 bit 數,進一步降低顯存頻寬與存儲成本。

它常見的不是單一一種格式,而是兩類變體:E4M3E5M2

FP8 兩種常見變體示意圖

FP8 的代價也很明顯:位數太少以後,你很難同時兼顧範圍和精度,因此實際工程裡通常會針對不同階段採用不同變體,分別照顧前向、反向與梯度的穩定性。

這類格式代表的是一種更激進的思路:

  • 願意犧牲更多精度
  • 換取更低的存儲與更高的吞吐
  • 需要更成熟的硬體與訓練框架配合

它很有前景,但對一般使用者來說,日常最常碰到的核心分界點,通常還是 FP32FP16BF16

為什麼理解這些類型很重要

很多人第一次看到這些縮寫,會把它們理解成「模型下載頁上的一些實作細節」。但實際上,它們會直接改變你對模型訓練與部署的理解方式。

例如同樣一張顯示卡:

  • 為什麼有些模型訓練必須強調數值穩定性
  • 為什麼有些推理方案會優先談量化與低精度
  • 為什麼看起來參數量相近的模型,部署門檻卻差很多
  • 為什麼有些格式適合存權重,有些格式更適合做計算路徑

這些問題往下拆,最後幾乎都會回到同一個核心:你到底怎麼在「精度、範圍、顯存和速度」之間做取捨。

也正因如此,理解 FP32FP16BF16TF32FP8,不只是為了看懂術語表,而是為了在面對訓練配置、推理引擎與部署門檻時,知道這些數字背後到底在交換什麼。

一個實用的理解框架

如果你不想一開始就記一堆格式細節,可以先用下面這個順序理解:

  • FP32:最穩、最貴
  • FP16:更省顯存,但範圍偏小
  • BF16:顯存接近 FP16,穩定性更適合大模型
  • TF32:主要解決 FP32 太慢,不主要解決顯存
  • FP8:更激進的壓縮與加速路線

常見張量類型總結圖

當你以後再看到模型下載頁裡寫著 fp16bf16fp8,或者看到不同部署教學給出完全不一樣的顯存門檻時,就不會再覺得那只是「寫法不同」。它們背後其實對應的是完全不同的精度預算與工程取捨。

結語

大模型裡的張量類型,表面上是在討論 bit 數,實際上討論的是一整套工程取捨。

FP32FP16BF16TF32FP8 沒有絕對的好壞,它們只是分別站在不同的位置上,幫你在穩定性、範圍、精度、顯存和速度之間做平衡。

如果把這一層看懂,後面無論你是在讀訓練論文、調推理參數,還是比較不同部署方案,都會更容易抓住重點。

记录并分享
使用 Hugo 建立
主題 StackJimmy 設計