FP16
3 秒看懂
FP16(半精度浮點)是深度學習中一種用 16 位二進位制 表示實數的方法,把模型引數和中間結果的記憶體佔用直接砍半。它借力現代 GPU 的 Tensor Core 可實現 2 倍以上的計算吞吐,但數值範圍窄(最大約 65504),訓練時容易“爆炸”或“消失”。因此業界通常不單用 FP16,而是配合 FP32 組成 混合精度訓練——計算用 FP16 加速,關鍵累加用 FP32 保穩,再用 Loss Scaling 把梯度拉回 FP16 能表示的範圍。它是大型模型能塞進一張 GPU 並跑起來的關鍵技術路徑之一,但正被 BF16 和 FP8 逐步承接與演進。
3 分鐘產業解釋
為什麼是 FP16
深度學習對數值精度並不像傳統科學計算那麼敏感:權重和梯度的細微誤差,經常被隨機梯度下降的噪聲和正則化“吞掉”。真正吃緊的是 記憶體牆——單張 GPU 視訊記憶體有限,想把大型模型裝進去,要麼減引數量、要麼壓縮每個引數的位寬。FP16 恰好把每個浮點數從 4 位元組壓到 2 位元組,在同樣視訊記憶體下:
- 可容納的引數量翻倍(對訓練意味著更大的 batch size,對推論意味著更大的模型)
- 訪存頻寬壓力年增率例下降
- 硬體乘加吞吐翻倍(見下)
從 NVIDIA Volta 架構起,Tensor Core 能以單週期對 FP16 矩陣乘加執行 FMA(Fused Multiply-Add),理論峰值 FLOPs 是 FP32 的 4–8 倍。這是 FP16 產業化的硬體支點。
但它不能單獨上陣
FP16 的指數位只有 5 位,能表達的正常正數範圍上限僅為 65504。訓練初期梯度動輒上萬,一進去就溢位成 Inf/NaN;權重更新量若在 1e-8 量級,則直接下溢為 0,梯度資訊消失。因此在工程中,幾乎不存在“純 FP16 訓練”這個選項,取而代之的是 FP16 + FP32 混合精度:
- 前向/反向核心矩陣乘用 FP16 高速通路
- 權重主複製(master weights)保持在 FP32,梯度累加在 FP32
- Loss Scaling(損失放大)把原本過小的梯度“抬”進 FP16 動態範圍
這套方案在 NVIDIA Apex AMP(Automatic Mixed Precision)與 PyTorch torch.cuda.amp 中被標準化,已成為訓練 ResNet、BERT、GPT 等模型的標配。
產業現狀
- 訓練端:BF16 憑藉與 FP32 相同的指數位(8 位)逐漸取代 FP16 成為大型模型訓練主流,因為不再需要 Loss Scaling,訓練更穩定。FP16 仍在視覺模型、中小模型微調中有廣泛存量。
- 推論端:FP16 仍然是 GPU 推論的“甜點”,TensorRT 等推論引擎以 FP16 為標配最佳化路徑;INT8/INT4 量化進一步壓縮,但需校準,FP16 是最“無痛”的高效推論格式。
- 下一代:Hopper 架構引入 FP8(E4M3 / E5M2),進一步倍增吞吐,但需在訓練中做分塊縮放(scaling block),對架構提出更高工程要求。FP16 正從“開創者”轉變為“承上啟下”的成熟基礎設施。
15 分鐘專家深入
位結構與數值特性
FP16 遵守 IEEE 754-2008 binary16 標準:
bit 15 bit 14-10 bit 9-0
┌──────┐ ┌──────────┐ ┌──────────┐
│ sign │ │ exponent │ │ mantissa │
│ 1 │ │ 5 │ │ 10 │
└──────┘ └──────────┘ └──────────┘
| 屬性 | 值 | 備註 |
|---|---|---|
| 總位寬 | 16 bit | 2 位元組 |
| 符號位 | 1 bit | 0 正 1 負 |
| 指數位 | 5 bit | 偏置 bias=15 |
| 尾數位 | 10 bit | 隱含前導 1,有效精度 ≈ 11 bit |
| 正常數範圍 | ~±6.10×10⁻⁵ ~ ±6.55×10⁴ | 約 5.96×10⁻⁸ 為最小次正規數下限 |
| 十進位制精度 | 3–4 位有效數字 | 實際二進位制精度約 11 bit |
| 最大正數 (Max) | 65504 | 0 11110 1111111111 |
| 最小正正規數 (Min) | 2⁻¹⁴ ≈ 6.10×10⁻⁵ | 0 00001 0000000000 |
| 最小正次正規數 | 2⁻²⁴ ≈ 5.96×10⁻⁸ | 0 00000 0000000001 |
對比 FP32:
- 指數位少 3 → 動態範圍縮減為 FP32 的
2^{-14}到2^{15}量級,遠低於 FP32 的2^{-126}到2^{127}。 - 尾數位少 13 → 舍入誤差明顯增大,每次乘加約產生
2^{-11}量級相對誤差。
混合精度訓練的機制
標準的混合精度流程(以 PyTorch AMP 為例):
- 前向傳播: 權重從 FP32 主複製自動 cast 為 FP16,啟用值與中間結果以 FP16 計算、儲存。矩陣乘(Tensor Core 路徑)用 FP16。
- Loss 計算: 通常仍在 FP32 累加,或轉為 FP32 後再計算,避免極端縮放造成的溢位。
- Loss Scaling: 將 Loss 乘以一個大的標量(如 2¹⁶ 或動態搜尋的 scale),使反向傳播初始梯度“變胖”,進入 FP16 可表示範圍。
- 反向傳播: 梯度以 FP16 計算(矩陣乘部分),但累加至 .grad 時可能在 FP32 完成,或先 descale(除以 scale)再累加。
- 最佳化器更新: 在 FP32 權重主複製上執行 Adam/SGD 等更新,避免小更新在 FP16 下溢。
- Scale 動態調整: 若檢測到 Inf/NaN,降低 scale 並跳過本次更新;若連續若干步無問題,嘗試提高 scale。
Tensor Core 的硬體加速機制
NVIDIA Tensor Core 在每個 SM 中以 warp 級別執行混合精度矩陣乘加:
- 輸入矩陣 A、B 為 FP16(或 BF16、TF32 等),累加器 C/D 保持 FP32。
- 單 Tensor Core 每週期可完成
D = A × B + C(FMA),以 4×4×4 矩陣塊為單位並行。 - A100 中,FP16 Tensor Core 稠密峰值可達 312 TFLOPS(稀疏 624 TFLOPS),而 FP32 通用核僅 19.5 TFLOPS。約 16 倍的理論乘加吞吐提升。
這是 FP16 能在產業中立足的根本物理基礎:不是“快一點”,而是近乎數量級的吞吐差異。
數值穩定性風險
FP16 的三大數值問題:
| 問題 | 成因 | 混合精度對策 |
|---|---|---|
| 梯度上溢(Overflow → Inf/NaN) | 啟用值或梯度超過 65504,FP16 無法表示 | 動態降低 loss scale 並跳過本次更新 |
| 梯度下溢(Underflow → 0) | 小更新量 < 6e-8,直接變零 | FP32 主權重 + 小梯度在 FP32 器內累加不丟失 |
| 舍入誤差累積 | 10bit 尾數精度有限,多次乘加引入噪聲 | 關鍵累加保留 FP32 |
實踐中,還有兩大暗坑:
- 啟用值的分佈偏移:深度網路(尤其 Transformer)中間啟用值可能進入 FP16 的“次正規數區”(< 6.10e-5),此時精度進一步下降、計算效率也打折扣(部分 GPU 對次正規數處理有額外開銷)。
- BatchNorm 與 Softmax 的不穩定:這兩個操作涉及大規約和指數運算,在 FP16 下容易產生除零或 NaN。通常會在這些運算元內強制使用 FP32 計算(架構已自動處理)。
技術原理
浮點表示與量化誤差的根源
FP16 的科學計數形式:
V = (-1)^{s} \times 2^{(e-15)} \times (1 + m \times 2^{-10})
其中 s 為符號, e 為 5 位指數整數值(0–31), m 為 10 位尾數整數。指數全 0 為次正規數或零,指數全 1 為無窮大或 NaN。這種結構導致:
- 絕對精度隨值的大小變化:大值(如 1000)時,相鄰可表示數間距約
1000 \times 2^{-10} \approx 0.98;小值(如 0.001)時,間距僅約0.001 \times 2^{-10} \approx 9.76\times 10^{-7}。這是浮點本質。 - 舍入誤差的相對界:相鄰值間距與值本身之比約為
2^{-10}(約 0.1%),FP32 此值為2^{-23}(約 1.2e-5%),FP16 比 FP32 粗糙約 8000 倍。
混合精度下的梯度流
以線性層 y = Wx (忽略 bias)為例:
- 前向:
y_{fp16} = W_{fp16} x_{fp16},誤差來自 input/output 的 FP16 舍入和乘積的尾數截斷。 - 反向:
\nabla_x = W_{fp16}^T \nabla_y,同樣經歷 FP16 矩陣乘與 cast。 - 權重梯度:
\nabla_W = \nabla_y \cdot x^T,累積在 FP32。
Loss Scaling 本質是將整個計算的縱軸拉伸,使梯度的數值分佈整體平移至 FP16 的正常有效區間內:
無 Scale: 梯度直方圖分佈在 1e-8 到 1e-3,大量點落入 FP16 的次正規區甚至零區
有 Scale: 乘上 2^K 後,直方圖平移至 1e-5 到 1,正常 FP16 可有效表示
與 BF16 的本質區別
FP16 與 BF16 的哲學分野:
FP16: 尾數多(10bit) + 指數少(5bit) → "小數分得細,但管得窄"
BF16: 尾數少(7bit) + 指數多(8bit) → "小數粗一點,但範圍和 FP32 一樣大"
對大型模型訓練而言,動態範圍的保障比尾數精度更重要。動態範圍不足需要 Loss Scaling 這種“外掛”來彌補,而 BF16 直接不需要。這就是 BF16 在訓練中勝出的核心原因。
技術演進史
| 時間 | 節點 |
|---|---|
| 2008 | IEEE 754-2008 首次定義 binary16 格式。此前 FP16 多用於圖形學紋理儲存,非計算核心 |
| 2016 | NVIDIA P100(GP100)支援FP16資料儲存,但無專用FP16運算單元,計算通過FP32核心完成 |
| 2017 | NVIDIA V100(Volta)引入 Tensor Core,支援 FP16 矩陣乘加,訓練加速進入實用階段 |
| 2018 | NVIDIA 釋出 Apex AMP,提供標準混合精度 API;此時 BF16 已在 TPU v2(2017)中採用 |
| 2019 | PyTorch 尚無原生 FP16 混合精度 API,訓練仍須藉助 NVIDIA Apex 等第三方庫;TensorFlow 2.0 整合混合精度 API |
| 2020 | A100(Ampere)將 FP16 Tensor Core 峰值推至 312 TFLOPS;BF16 被 A100 硬體支援,開始蠶食 FP16 訓練份額 |
| 2022 | H100(Hopper)引入 FP8,訓練吞吐再翻倍;FP16 定位轉向推論與存量模型 |
| 2023-2025 | 推論引擎(GPU)仍以 FP16 為主力精度;訓練領域新模型大多預設 BF16;部分低功耗邊緣晶片繼續主打 FP16/INT8 |
技術路線對比
| 維度 | FP32 | FP16 | BF16 | FP8(E4M3) | INT8 |
|---|---|---|---|---|---|
| 位寬 | 32 | 16 | 16 | 8 | 8 |
| 符號/指數/尾數 | 1/8/23 | 1/5/10 | 1/8/7 | 1/4/3 | 無(定點) |
| 動態範圍 | ≈±3.4×10³⁸ | ≈±6.55×10⁴ | ≈±3.4×10³⁸ | ≈±448(E4M3) | ±127(對稱) |
| 十進位制精度 | 6–9 位 | 3–4 位 | 2–3 位 | 1–2 位 | 取決於校準 |
| 記憶體(每引數) | 4 位元組 | 2 位元組 | 2 位元組 | 1 位元組 | 1 位元組 |
| Tensor Core 加速 | 基線 | 高 | 高(Ampere+) | 極高(Hopper+) | 高(Turing+,Tensor Core) |
| 訓練穩定性 | 最優 | 需 Loss Scaling | 好(無需 Scale) | 需 block scaling | 多用於推論 |
| 推論部署 | 按需 | 主流 | 部分支援 | 實驗階段 | 廣泛(量化) |
| 典型應用 | 科學計算,基線對比 | 視覺訓練推論,小模型 | LLM 訓練(主流) | 下一代大型模型訓練 | 端側推論,邊緣部署 |
資料來源:IEEE 754 標準、NVIDIA 白皮書、PyTorch 文件及行業公開基準。
上下游
上游:硬體數制與架構定義
- IEEE 754 標準委員會: 定義 binary16 的位版面配置、舍入規則、特殊值(Inf/NaN)行為。FP16 在深度學習中有效,根源在此。
- GPU IP 核(輝達 SM,AMD CU, 英特爾 Xe Core): Tensor Core / Matrix Engine 必須原生支援 FP16 稀疏/稠密乘加。A100 FP16 峰值 312 TFLOPS 即為該鏈路硬指標。
- AI 專用晶片: Google TPU v2/v3 的 BF16,寒武紀、昇騰等的混合精度指令集。
- 基礎庫: cuBLAS, cuDNN 底層 FP16 卷積/矩陣乘實現;NCCL 的 FP16 AllReduce 通訊最佳化(某些版本對 2 位元組資料 pack 傳輸)。
下游:架構、訓練與部署棧
- 架構層: PyTorch
torch.cuda.ampautocast + GradScaler; TensorFlowmixed_precisionpolicy; JAX 的jmp配置。均封裝了 FP16 cast、loss scaling 動態調整邏輯。 - 訓練階段: 影像分類(ResNet,ViT)、檢測(YOLO,Detectron)、生成對抗(GAN,較脆弱,需精細調 scale)、語音(Conformer)、LLM 微調(部分依然 FP16)。
- 推論引擎: TensorRT、OpenVINO、ONNX Runtime 均提供 FP16 最佳化路徑(TensorRT 的 FP16 模式常作為除 INT8 外的最高吞吐選項);vLLM、TGI 等大型模型推論架構預設 FP16 載入權重。
- 模型動物園與部署: Hugging Face 上大多數模型提供 fp16 權重;NGC 容器中的預訓練模型常包含 fp16 checkpoint。
關鍵指標
| 指標 | 典型值 | 說明 |
|---|---|---|
| 模型視訊記憶體佔用(FP32→FP16) | -50% | 引數 + 最佳化器狀態 + 啟用值均減半 |
| 單精度乘加吞吐提升(NVIDIA V100/A100/H100) | 約 2–16× | 相對 FP32 非 Tensor 核,實際端到端加速約 1.5–4× |
| 動態範圍 | 6e-5 到 65504 | 遠小於 FP32(1e-38 到 3e38),Loss Scaling 補償 |
| 等效小數精度 | 約 3–4 十進位制位 | 足以滿足大多數深度網路的梯度訊雜比要求 |
| Loss Scaling 初始值 | 2¹⁶(65536) | Apex 預設;動態 scale 通常從 2²⁴ 啟動 |
| Tensor Core FP16 峰值(A100) | 312 TFLOPS(稠密) | 對比 FP32 核 19.5 TFLOPS |
| 訓練吞吐(BERT-Large 微調) | 提升 2–3× | 相對 FP32 無 AMP(NVIDIA 基準) |
| 推論延遲降低(ResNet-50) | 約 1.5–2× | TensorRT FP16 對比 FP32 |
供需與市場資料
注:FP16 作為資料格式本身不獨立構成市場,但它是 AI 加速器的核心效能指標之一,間接反映在訓練/推論硬體市場份額中。
- AI 伺服器 GPU 出貨: 據 [行業估算] 2024 年資料中心 GPU 約 400–500 萬張,NVIDIA Hopper(H100/H200)及 Ampere(A100)佔絕大多數。這些 GPU 的 AI 加速能力與 FP16/BF16/FP8 吞吐直接掛鉤。
- 訓練工作負載精度選型趨勢: 2024–2025 新發布的大型模型(GPT-4 量級、Llama 3、Gemini 等)訓練階段 BF16 已成事實標準,FP16 主要用於:
- 較小模型及視覺模型(約 30–40% 訓練場景,按社群公開配方估計)
- 微調(fine-tuning):約 50%+ 仍採用 FP16 混合精度(因原有程式碼棧成熟,遷移意願不高)
- 推論工作負載: 基於 TensorRT 的生產推論中,FP16 佔比約為 60–70%(輝達官方推薦預設路徑),INT8 約 20–30%(需校準),FP32 僅少數對精度有硬要求的場景。
- 雲端廠商 AI 例項: AWS p4d/p5、阿里雲端 V100/A100 例項、Google雲端 A3 均預設提供 FP16 最佳化的深度學習映象,表明該技術已高度商品化。
無精確出貨及營收資料來源,以上為基於多份行業報告交叉的定性判斷。
代表公司與資本對映
| 公司/機構 | 與 FP16 的關聯 | 影響層級 |
|---|---|---|
| NVIDIA | Tensor Core 的 FP16 加速能力(A100/H100)為其 AI 訓練/推論硬體核心競爭力;Apex AMP、cuDNN/cuBLAS 封裝了完整 FP16 軟體棧。每一次代際 FP16 峰值翻倍驅動資料中心 GPU 銷售 | 核心驅動力 |
| AMD | MI250X/MI300X 的 Matrix Core 同樣支援 FP16,但軟體生態(RoCm)較 NVIDIA 晚,正在追趕。INSTINCT 系列 FP16 峰值對標,生態不足導致佔有率差距 | 追趕者 |
| Intel | Habana Gaudi2 支援 FP16/BF16,軟體棧 SynapseAI;GPU Max(PVC)支援 FP16。FP16 是其在 AI 加速器市場切入的必備能力 | 新興競爭者 |
| TPU 以 BF16 為主,但 TensorFlow 對 FP16 支援完善;其 Cloud TPU 以 BF16/INT8 為主,FP16 用於相容。對 FP16 的產業推力在於推動混合精度思路普及 | 生態影響者 | |
| Meta/Microsoft/Amazon | 大型模型訓練推論的大規模使用者,其訓練架構(PyTorch)的 AMP 模組決定了 FP16 軟體棧走向;自研晶片(如 Meta MTIA、AWS Trainium)是否最佳化 FP16 影響需求 | 需求端巨頭 |
| 華為(昇騰) | Ascend 910B 支援 FP16 混合精度,其 CANN 架構對標 Apex AMP。FP16 效能是國產替代路徑的關鍵引數 | 國產替代 |
| 寒武紀/壁仞/摩爾線程 | 各自 AI 加速晶片架構中 FP16 單元為標配,軟體棧的 AMP 完整度影響商業化進度 | 早期參與 |
投資邏輯
FP16 本身不構成直接投資標的,但可作為評估 AI 硬體/軟體公司技術深度的指標項:
- 硬體 FP16 效能密度(TFLOPS/mm²): 反映了晶片架構的能效上限。FP16 峰值高但實際利用率(推論訓練吞吐/峰值)更關鍵,需要看硬體-軟體協同。
- AMP 生態完備度: 晶片廠商能否提供無縫的 FP16 混合精度訓練架構(對標 NVIDIA AMP),是 AI 訓練晶片能否大規模部署的“准入條件”。PyTorch 原生支援情況是核心訊號。
- 向後相容的衰退風險: FP16 在訓練中的主導地位正被 BF16/FP8 侵蝕。純 FP16 最佳化而無 BF16/FP8 能力的晶片,其 AI 訓練市場視窗期正在關閉。但 FP16 推論生命週期仍然較長——因存量模型龐大、遷移成本存在。
- 推論市場的 FP16 路徑依賴: 隨著生成式 AI 推論規模爆發,FP16 推論加速(尤其是即時 API 場景)仍然是對資料中心 GPU 強勁需求的組成部分。而 LLM 推論的 KV-cache 記憶體問題,使得 FP16(2 位元組)比 BF16(同樣是 2 位元組)在精度與壓縮之間取得微妙平衡(某些場景 BF16 尾數損失更大)。
常見誤讀糾偏
誤讀 1:“FP16 訓練和 FP32 精度幾乎一樣”
糾偏: 對於大部分視覺模型和 Transformer 微調,FP16 混合精度確實能實現無損或微損收斂。但對於某些敏感架構(GAN,某些 RL、科學計算嵌入)和低資源資料,FP16 的舍入噪聲會導致不收斂或結果顯著偏差。FP16 成功並不意味精度“一樣”,而是網路的冗餘度和隨機下降慣性“容忍”了額外噪聲。
誤讀 2:“FP16 就是 Tensor Core 的唯一格式”
糾偏: Tensor Core 支援多精度:Volta 只支援 FP16;但 Ampere 開始廣泛支援 BF16、TF32、INT8、INT4;Hopper 支援 FP8。FP16 是 Tensor Core 的“第一個”大力推廣的低精度格式,但如今只是多精度矩陣加速的其中一檔。把“Tensor Core = FP16”等同已過時。
誤讀 3:“減小記憶體就能等比例加速訓練”
糾偏: 端到端訓練加速很少達到 2×(相對 FP32)。通訊(多卡 AllReduce)、資料載入、最佳化器更新、CPU-GPU 傳輸等環節保持不變,且 Loss Scaling 和 cast 操作引入額外開銷。實際加速通常在 1.4×–3× 之間,取決於模型的計算/訪存比。
學習路徑
- 基礎: 讀 IEEE 754 binary16 定義頁(約 2 頁) + CSAPP 浮點章節 → 理解位分佈、溢位/下溢概念。
- 動手: PyTorch
autocast官方教程 + 簡單 ResNet/CIFAR-10 訓練;手動注入 Loss Scaling 觀察梯度分佈。 - 關鍵論文:
- Micikevicius et al., “Mixed Precision Training,” ICLR 2018 (開創 AMP 範式);
- NVIDIA FP8 白皮書 “FP8 Formats for Deep Learning” 對比敘述 FP16 侷限。
- 深入: 閱讀 PyTorch AMP 原始碼(重點
GradScaler與autocast運算元白名單機制);執行 Nsight Systems 對比 FP16 vs FP32 的 kernel 執行時間分佈。 - 橫向理解: 對比 BF16 的論文(Kalamkar et al., 2019)與 Intel Habana 的混合精度方案,理解不同指數/尾數分配的設計哲學。
一句話總結
FP16 是深度學習低精度革命的“元老”——它靠半倍記憶體與 Tensor Core 級加速擊穿了記憶體牆,但動態範圍窄的本徵缺陷催生了混合精度範式,並最終被範圍更寬的後輩 BF16/FP8 在訓練高位接過衣缽,而自己駐守在推論的主陣地上。
延伸閱讀與來源
- IEEE 754-2008 Standard for Floating-Point Arithmetic (IEEE Computer Society, 2008)
- Paulius Micikevicius et al., “Mixed Precision Training,” ICLR 2018 [https://arxiv.org/abs/1710.03740]
- NVIDIA Developer Blog, “Floating-Point 8: An Introduction to Efficient, Lower-Precision AI Training” [https://developer.nvidia.com/blog/floating-point-8-an-introduction-to-efficient-lower-precision-ai-training/]
- NVIDIA A100 Tensor Core GPU Architecture Whitepaper (2020)
- NVIDIA H100 Tensor Core GPU Architecture Whitepaper (2022)
- PyTorch Automatic Mixed Precision 文件 [https://pytorch.org/docs/stable/amp.html]
- TensorRT FP16 最佳化指南 [https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#reduced-precision]
- 檢索來源:CSDN、華為鯤鵬昇騰開發者社群等對 FP16/FP32/BF16 格式構成與混合精度機制的總結(用於交叉驗證位寬、動態範圍等硬規格)
注:文中 FP16 動態範圍(5.96×10⁻⁸ ~ 6.55×10⁴)及位版面配置為 IEEE 754 binary16 標準定義;Tensor Core 峰值資料出自 NVIDIA 官方白皮書;產業採用率為定性估計,無精確調查資料支撐。