一次讲清 FP32 / FP16 / BF16 / INT8 / INT4
目标 :让你3 分钟读懂格式原理,5 分钟学会选型 。
只记一句:"指数定范围,尾数定精度;位宽定显存,硬件定成本"。
1 | 为什么要有这么多格式?
时代 | 典型位宽 | 驱动力 |
---|---|---|
早期科学计算 | FP32 | 精度第一 |
深度学习训练 | FP16 / BF16 | 显存 & 带宽瓶颈 |
推理上云 / 上端 | INT8 | 降本、提速 |
边缘 & 移动 | INT4 | 极限压缩,离线运行 |
2 | 浮点格式:尺子比喻
┌─符号(S)──┬─────指数(E)─────┬──────────尾数(M)──────────┐
决定正负 决定"尺子长度" 决定"刻度密度"
格式 | 总位 | 指数位 | 尾数位 | 范围大小* | 刻度数量** |
---|---|---|---|---|---|
FP32 | 32 | 8 | 23 | ★★★★★ | ★★★★★ |
BF16 | 16 | 8 | 7 | ★★★★★ | ★★☆ |
FP16 | 16 | 5 | 10 | ★★ | ★★★★ |
INT8 | 8 | --- | 8 (补码) | 取决于缩放 | ★★ |
INT4 | 4 | --- | 4 | 同上 | ★ |
* 归一化可表示的最大/最小值(Dynamic Range)
** 一个数量级内可分多少格(Precision)
口诀
- FP16 = "刻度更密,尺子变短"
- BF16 = "舍刻度,保尺子"
- FP32 = "密+长,最豪华"
- INT8/4 = "把刻度记成整数,再配一支比例尺(缩放因子)"
3 | 每种格式到底什么时候用?
场景 | 首选 | 理由 |
---|---|---|
预训练 / 大梯度 | BF16 | 与 FP32 同范围,梯度不溢出;显存减半 |
显存吃紧训练 (LoRA、SFT) | BF16 + FP32 累加 | 省显存又保稳定 |
云端推理(>=20 GB GPU) | FP16 | 硬件 TensorCore 2× 加速;误差可接受 |
成本敏感推理(<10 GB) | INT8 | 量化后体积 ↓75%,吞吐 ↑2‑3× |
移动 / 浏览器 | INT4 + GPTQ/AWQ | 模型 < 2 GB,可跑在 Mac M‑series / Android |
科学模拟 / 金融回测 | FP32 | 需极高累计精度 |
4 | 硬件支持一览
芯片 | FP32 | FP16 | BF16 | INT8 | INT4 |
---|---|---|---|---|---|
NVIDIA A100 | ✅ | ✅ TensorCore | ✅ | ✅ | --- |
NVIDIA H100 | ✅ | ✅ | ✅ TensorCore | ✅ | 🚧 (B100) |
Google TPU v4 | --- | ✅ | ✅ 原生 | ✅ | --- |
AMD MI300 | ✅ | ✅ | ✅ | ✅ | --- |
Apple M3 | ✅ | ✅ | 软件模拟 | ✅ | ✅ (MetalLLM) |
5 | 精度 & 性能实测示例(Llama‑2‑7B, Alpaca Eval)
格式 | ppl ↓ | BLEU ↑ | 推理 tokens/s (A100) | 显存 |
---|---|---|---|---|
FP32 | 5.85 | 28.6 | 45 | 14 GB |
BF16 | 5.86 | 28.5 | 90 | 7 GB |
FP16 | 5.87 | 28.5 | 92 | 7 GB |
INT8 (RTN) | 6.02 | 28.1 | 130 | 4 GB |
INT4 (GPTQ) | 6.25 | 27.8 | 160 | 2.3 GB |
差距 < 0.2 ppl / 1 BLEU 在多数应用感知有限
6 | 快速选型流程(训练 / 推理)
① 你正在做什么?
- 训练
- 推理
▍训练路线
梯度是否容易溢出? | 建议精度 | 说明 |
---|---|---|
是(频繁出现 Inf/Nan) | BF16 + GradScaler | 保留 FP32 级范围,显存减半 |
否(训练稳定) | FP16 | 半精度省显存、TensorCore 加速 |
▍推理路线
显存预算 | 能接受 ≤ 1‑2 % 精度损失? | 建议精度 |
---|---|---|
≥ 16 GB | ------ | FP16(或 BF16) |
< 16 GB | 是 | INT8 / INT4 |
否 | FP16 |
额外提示
- 移动 / 浏览器:优先 INT4(GPTQ / AWQ 量化)。
- 高精度金融 & 科研:仍用 FP32 或混合 BF16+FP32。
- INT 量化后如指标下降,可用 LoRA 微调追回。
7 | 常见误区 Q&A
问题 | 正解 |
---|---|
FP16 ≈ BF16? | No. FP16 精度高但范围窄;BF16 范围大但刻度粗。 |
INT8 总会掉精度? | 用 GPTQ / AWQ + 校准数据,掉点 < 1%;对话模型体感差异极小。 |
手机真能跑 INT4 LLM? | M2/M3、骁龙 X Elite 已实测 7B INT4 达 10‑20 tokens/s。 |
训练一定要 FP32? | 混合精度早已主流。BF16 TensorCore 训练可比 FP32 快 2‑3×。 |
8 | 记忆三板斧
- 指数位 = 尺子长度
‑ 大梯度就要长尺子(8 bit) → BF16 - 尾数位 = 刻度密度
‑ 推理要细腻回答 → FP16 - 位宽 = 钱包厚度
‑ 显存贵但要求快 → INT8 / INT4
结语
格式选对,显存省一半,速度翻一番。
- 训练:优先 BF16;显存充足再混 FP32 累加器。
- 推理:优先 FP16;显存不足进 INT8;边缘 & 移动用 INT4。
- 永远记得:先测指标,再定精度。
至此,FP32/FP16/BF16/INT8/INT4 的来龙去脉、优势劣势、硬件匹配与典型场景已全部说清。祝你的模型 又准又快又省钱!