大模型数据格式全景解析
AI 数值格式全景解析:FP64 / FP32 / TF32 / BF16 / FP16 / FP8 / INT8 / INT4 / NVFP4
核心命题:计算机用多少 bit 表示数字、如何表示数字,本质是在精度、数值范围、显存占用、计算速度之间做取舍。
对推理服务而言,这道题最终会翻译成一句话:在给定硬件上,用最低的成本(显存 + 算力 + 时延)把最多的 token 送出去。
一、底层逻辑:用 π 理解精度
| 表示方式 | 精细程度 | 成本 |
|---|---|---|
| 3.141592653589793 | 极高 | 极高 |
| 3.1415926 | 高 | 高 |
| 3.14 | 够用 | 中等 |
| 3 | 粗糙 | 极低 |
核心规律:位数越多越接近真实值,但越费显存、越慢;位数越少越省资源,但误差越大。
模型精度的一句话总结:在准确度、显存、速度之间做取舍。
二、浮点数结构:符号 + 指数 + 尾数
浮点数 = 二进制科学计数法:数值 ≈ 符号 × 尾数 × 2^指数
1 | ┌─────────────────────────────────────┐ |
| 字段 | 作用 | 口诀 |
|---|---|---|
| 符号位 S | 决定正负(0正1负) | — |
| 指数位 E | 决定范围(能表示多大/多小的数) | E越多,范围越大 |
| 尾数位 M | 决定精度(小数细节有多细) | M越多,精度越高 |
⚠️ 范围大 ≠ 精度高;精度高 ≠ 范围大。这是后面所有”格式取舍”的根。
三、各格式位宽分配一览表
| 格式 | 总bit | 结构(S+E+M) | 特点 | 典型场景 |
|---|---|---|---|---|
| FP64 | 64 | 1+11+52 | 超高精度,超贵 | 科学计算、仿真、金融 |
| FP32 | 32 | 1+8+23 | 传统深度学习标准精度 | 早期训练基准 / 混合精度兜底 |
| TF32 | 19(计算)/32(存储) | 1+8+10 | FP32 的快速计算模式,省算力不省显存 | NVIDIA Tensor Core 加速 |
| BF16 | 16 | 1+8+7 | 范围≈FP32,精度较粗,训练稳 | 大模型训练主力 |
| FP16 | 16 | 1+5+10 | 精度较细,范围较小,易溢出 | 早期半精度训练 |
| FP8 E4M3 | 8 | 1+4+3 | 偏精度 | 权重、激活值(推理常用) |
| FP8 E5M2 | 8 | 1+5+2 | 偏范围 | 梯度等变化大的值 |
| NVFP4 | 4 | 1+2+1 | 4bit 浮点,需两级缩放 | Blackwell 架构超大规模推理 |
| INT8 | 8 | 整数编码 | 256档位,靠 scale 表示小数 | 成熟推理量化 |
| INT4 | 4 | 整数编码 | 16档位,靠 scale 表示小数 | 极致省显存权重量化 |
四、各格式详解
4.1 FP64
- 结构:1+11+52
- 特点:双精度浮点,精度最高、范围最大
- 代价:显存和计算成本极高
- 用途:科学计算、数值仿真、金融建模;大模型基本不用
4.2 FP32
- 结构:1+8+23
- 特点:传统深度学习标准单精度
- 代价:显存和算力开销大
- 用途:早期训练基准;现多作为混合精度中的高精度兜底(master weight / 优化器状态常驻 FP32)
4.3 TF32
- 存储:FP32(32bit)
- 计算:1+8+10(仅19bit参与运算)
- 特点:保留 FP32 的 8 位指数→范围不变;尾数砍至 10 位→精度降低
- 本质:FP32 的快速计算模式,省算力但不省显存
- 用途:NVIDIA Tensor Core 上加速矩阵乘法(训练/推理都可用,但只影响计算不省存储)
4.4 BF16 vs FP16(16bit 双雄)
| 对比项 | BF16 | FP16 |
|---|---|---|
| 结构 | 1+8+7 | 1+5+10 |
| 指数位 | 8位(≈FP32) | 5位 |
| 尾数位 | 7位 | 10位 |
| 范围 | 大,不易溢出 | 小,易 overflow/underflow |
| 精度 | 较粗 | 较细 |
| 训练表现 | 更稳定 ✅ | 易数值爆炸 ❌ |
| 结论 | 大模型训练首选 | 逐渐被替代 |
形象比喻:
- FP16 = 细刻度但短尺子 → 刻得细但量不了太大的数
- BF16 = 粗刻度但长尺子 → 刻度粗但覆盖范围大 → 训练更稳
4.5 FP8(两种规格)
| 规格 | 结构 | 偏向 | 适合场景 |
|---|---|---|---|
| E4M3 | 1+4+3 | 偏精度 | 权重、激活值(推理默认) |
| E5M2 | 1+5+2 | 偏范围 | 梯度等变化幅度大的值 |
- 特点:省显存、省带宽、吞吐高(Hopper/Ada 上 FP8 Tensor Core 算力约为 FP16 的 2 倍)
- 依赖:需要 scale、校准、框架和硬件支持
- 用法:H100+ 硬件上用于推理主力;配合 W8A8(权重+激活同量化到 FP8,高精度累加)保稳定
4.6 NVFP4(Blackwell 架构专属,Microscaling 格式)
- 结构:1+2+1(4bit 浮点)
- 缩放机制(两级缩放,这是它能保精度的关键):
- 每 16 个值共享 1 个 FP8 E4M3 scale(block scale)
- 每个 tensor 额外配 1 个 FP32 scale(global scale)
- 显存开销:4bit 本体 + 分摊 0.5bit scale ≈ 4.5bit/值 ≈ 0.5625 Byte/值
- 性能表现(NVIDIA 实测):
- 相比 FP8 精度损失 < 1%(见第十节 DeepSeek-R1 实测表)
- 相比 FP16 显存减少约 3.5 倍
- 相比 FP8 显存减少约 1.8 倍
- 用途:超大规模模型推理,追求极致显存/带宽/吞吐效率(B200/GB200/GB300)
NVFP4 之所以比”裸 INT4”更稳:INT4 只是 16 个均匀档位,遇到权重动态范围大就失真;NVFP4 用两级 scale 把动态范围拉开,精度接近 FP8。
4.7 INT8 / INT4(整数量化)
整数怎么表示小数?→ 靠 scale
1 | 真实值 ≈ 整数值 × scale |
| 格式 | 表示范围(有符号) | 档位数量 | 特点 |
|---|---|---|---|
| INT8 | -128 ~ 127 | 256 | 量化成熟,推理常见 |
| INT4 | -8 ~ 7 | 16 | 极省显存,但易失真 |
量化核心:不是整数神奇地能表示小数,而是「整数 + scale」一起近似表示小数。
scale 的粒度决定精度:per-tensor(整张量一个 scale,快但粗)→ per-channel / per-group(每通道/每组一个 scale,更准但稍慢)→ per-token(推理时对激活逐 token 动态量化,最常用)。粒度越细,低比特越稳。
五、显存占用直观对比(700亿参数模型,仅权重)
| 格式 | 单参数字节数 | 总显存占用 |
|---|---|---|
| FP16 / BF16 | 2 Byte | ~140 GB |
| INT8 | 1 Byte | ~70 GB |
| INT4 | 0.5 Byte | ~35 GB |
| NVFP4 | ~0.5625 Byte | ~39 GB |
计算公式:模型权重显存 ≈ 参数量 × 每个参数占用字节数
⚠️ 这只是权重。推理真正吃显存的是另一座大山——KV Cache(见第十节)。
六、范围 vs 精度:取舍维度
用两个维度理解所有格式的定位:
- 横轴(尾数精度):越往右,小数越精细
- 纵轴(指数范围):越往上,能表示的数值越大/越小
| 格式 | 范围 | 精度 | 成本 |
|---|---|---|---|
| FP64 | ★★★★★ | ★★★★★ | 极高 |
| FP32 | ★★★★☆ | ★★★★☆ | 高 |
| BF16 | ★★★★☆ | ★★☆☆☆ | 中等 |
| FP16 | ★★☆☆☆ | ★★★★☆ | 中等 |
| FP8 | ★★~★★★☆ | ★★☆☆☆ | 低 |
| NVFP4 | ★★☆☆☆ | ★☆☆☆☆ | 极低 |
| INT8 | 依赖 scale | 依赖 scale | 低 |
| INT4 | 依赖 scale | 依赖 scale | 极低 |
七、训练 vs 推理:选型误区纠正
❌ 常见误解
- “训练都用 BF16” → 错(BF16 是计算格式,master weight / 优化器状态仍用 FP32)
- “推理都用 FP8” → 错(取决于硬件、模型大小、精度容忍度)
✅ 实际情况
训练:更看重数值稳定
- 主力计算:BF16(范围大,不易溢出)
- 兜底:关键累加、归一化、优化器状态、master weight 仍保留 FP32
- 本质:混合精度训练,不是全程单一精度
推理:更看重速度、显存、成本
| 需求 | 推荐格式 |
|---|---|
| 追求稳定 | FP16 / BF16 |
| 成熟量化方案 | INT8 |
| 极致省显存 | INT4(AWQ / GGUF) |
| 新硬件高吞吐 | FP8 / NVFP4 |
八、一句话速查表
| 格式 | 一句话理解 |
|---|---|
| FP64 | 最稳最贵,科学计算用 |
| FP32 | 传统深度学习标准精度,常作 FP32 兜底 |
| TF32 | NVIDIA 上 FP32 的快速计算模式,省算力不省显存 |
| BF16 | 大模型训练常用,范围大更稳 |
| FP16 | 半精度,范围小但小数更细 |
| FP8 | Hopper+ 推理主力,W8A8 + FP8 KV 组合拳 |
| INT8 | 成熟推理量化方案 |
| INT4 | 极致省显存的大模型量化 |
| NVFP4 | Blackwell 架构 4-bit 浮点,极致压缩且精度接近 FP8 |
九、终极结论
没有一种格式永远最好。
- 训练更看重数值稳定
- 推理更看重速度、显存和成本
- 真正落地时,取决于硬件能力、模型特性、业务目标三者的匹配
四句口诀
- 符号位决定正负
- 指数位决定范围
- 尾数位决定精度
- scale决定低 bit 量化怎么还原小数
十、实战篇:数值格式如何决定推理服务的成本与性能(干货)
这一节是给”自己复习 + 准备模型部署/推理服务”用的。结论先行:在推理里,权重只占一次显存,KV Cache 才是随上下文和并发线性膨胀的真瓶颈;低精度格式的价值,一半在”算得快”,一半在”装得多”。
10.1 推理显存的两座大山:权重(静态)+ KV Cache(动态)
- 权重:加载一次,常驻显存,大小由参数量和格式固定(见第五节)。
- KV Cache:每生成一个 token 都要缓存 Key/Value,随
batch_size × 序列长度线性增长,长上下文 / 高并发时往往超过权重本身。
KV Cache 显存估算公式:
1 | KV Cache 显存 ≈ batch_size × seq_len × num_layers × 2 × (num_kv_heads × head_dim) × precision_bytes |
真实量级(Llama-3-70B,GQA,8K 上下文,batch=32,FP16):
- 每 token 缓存 ≈ 2.5 MB
- 单请求 8K 上下文 ≈ 20 GB
- batch=32 总 KV Cache ≈ 640 GB(已经远超 70B 权重本身的 ~140GB)
结论:优化推理成本,不能只盯着权重量化,KV Cache 量化 + 分页管理才是高并发/长上下文的命脉。
10.2 KV Cache 量化:把”动态显存”拦腰砍
| 精度 | 显存节省 | 质量影响 | 适用场景 |
|---|---|---|---|
| FP16 | 基准 | 无 | 默认,质量敏感 |
| FP8 | ~50% | 极小 | 生产推理主力(Hopper/Blackwell 原生支持) |
| INT8 | ~50% | 低 | 成本敏感 |
| INT4 | ~75% | 中等(实验性) | 极端内存受限 |
PagedAttention(vLLM)把 KV 碎片从 60–80% 压到 <4%,直接带来 2–4× 吞吐——这是推理框架层最大的单点优化,与数值格式正交但经常一起用。- FP8 KV Cache 在 vLLM:
--kv-cache-dtype fp8(或fp8_e4m3/fp8_e5m2)。注意:Ampere(如 3090)不支持 FP8,Hopper/Ada(H100/4090)和 AMD MI300 才支持;且要确认 attention 后端走的是快速 kernel,否则可能反而变慢。
10.3 推理的两段式:Prefill(算力密集)vs Decode(带宽密集)
- Prefill:处理整段 prompt,计算密集(compute-bound),一次算出所有 prompt token 的 KV。
- Decode:逐 token 生成,每步只算一个 token,但每步都要读全部 KV Cache,受显存带宽限制(memory-bound)。
低精度对两者的收益不同:
- FP8/NVFP4 的算力红利主要加速 GEMM(prefill 和 decode 里的矩阵乘)。
- KV Cache 量化对 decode 帮助最大——因为它直接减小每步要读的”带宽账单”。
- 因此生产常用”两层 FP8”组合拳(以 vLLM + H100 为例):
- W8A8:权重和激活都量化到 FP8,在 Tensor Core 做 GEMM,高精度累加保稳定;
- FP8 KV Cache:写入 PagedAttention 前把 K/V 压成 FP8,抬升并发上限。
实测(H100,Llama-3-8B,vLLM):
- 吞吐:BF16 ≈ 7.4k tok/s → FP8 ≈ 11.9k tok/s(+60%,约 1.6×)
- 峰值并发:BF16 ≈ 170 → FP8 KV ≈ 1033(约 5×),基本消除常规负载 OOM
- 建议单卡可持续服务基线:约 60 QPS(该数据分布下),再加压只会增加排队
10.4 硬件能力对照表(决定你能用哪种格式)
| GPU 架构 | 代表型号 | 支持的低精度 | 备注 |
|---|---|---|---|
| Ampere | A100 / 3090 | FP16 / BF16 / TF32 / INT8 | 无原生 FP8 |
| Hopper | H100 / H200 | FP8(E4M3/E5M2) / FP16 / BF16 / INT8 | Transformer Engine,FP8 算力≈2× FP16 |
| Ada Lovelace | L4 / L40S / 4090 | FP8 / INT8 / FP16 | 消费/推理卡也有 FP8 |
| Blackwell | B200 / GB200 | NVFP4(原生4-bit TC) / FP8 / FP6 / INT8 | NVFP4 推理主力 |
| Blackwell Ultra | GB300 | 同 Blackwell,NVFP4 算力 +1.5×,注意力 +2×,288GB HBM3e | MLPerf v5.1 记录保持者 |
| AMD CDNA3/4 | MI300X / MI325X / MI355X | FP8 / FP4(MXFP4) | ROCm + AITER 路径 |
选型第一原则:先看硬件支持什么。A100 就别想 FP8;B200 才值得上 NVFP4。
10.5 量化工具箱(权重侧)
| 方法 | 类型 | 典型比特 | 特点 |
|---|---|---|---|
| GPTQ | PTQ(训练后量化) | INT4 | 经典 4-bit 权重量化 |
| AWQ | PTQ(激活感知) | INT4 | 保住”显著权重”,4-bit 质量更好 |
| GGUF / k-quants | PTQ | INT4~INT8 混合 | llama.cpp / Ollama,CPU+GPU 通吃 |
| SmoothQuant | PTQ | W8A8 | 把激活离群值迁到权重,使 FP8 激活更稳 |
| TensorRT Model Optimizer | PTQ / QAT | FP8 / FP4(NVFP4) | Blackwell 官方量化路径,QAT 可回精度 |
| FP8 预量化模型 | — | FP8 | 直接拉 HuggingFace 上的 -fp8 权重,免在线量化开销 |
术语:PTQ(训练后量化,快、零训练)vs QAT(量化感知训练,用少量数据微调回精度,FP4 部署常用)。
10.6 主流推理框架支持矩阵
| 框架 | FP8 权重 | FP4(NVFP4) | FP8 KV Cache | 亮点 |
|---|---|---|---|---|
| vLLM | ✅ | ✅(B200) | ✅ | PagedAttention、continuous batching、speculative decoding |
| TensorRT-LLM | ✅(原生) | ✅(原生) | ✅ | Blackwell 深度优化、disaggregated serving、in-flight batching |
| SGLang | ✅ | ✅(modelopt_fp4) | ✅ | RadixAttention 前缀缓存,分支前缀也能复用 |
| Ollama / llama.cpp | GGUF(INT4/8) | 实验 | 实验 | 本地/边缘、CPU 友好 |
| LMDeploy / TGI | ✅ | 部分 | ✅ | 国产/生产常用 |
10.7 NVFP4 生产实测(NVIDIA,最有说服力的一组数)
精度损失极小(PTQ,对比 FP8 基线):
| 模型 | 指标 | FP8 | NVFP4(FP4) |
|---|---|---|---|
| DeepSeek-R1 (671B MoE) | MMLU | 90.8% | 90.7% |
| GSM8K | 96.3% | 96.1% | |
| AIME 2024 | 80.0% | 80.0% | |
| GPQA Diamond | 69.7% | 69.2% | |
| MATH-500 | 95.4% | 94.2% | |
| Llama-3.1-405B | MMLU | 86.5% | 86.1% |
| Llama-3.3-70B | MMLU | 82.5% | 80.5% |
小模型(70B)FP4 损失略大,说明模型越小、对低精度越敏感;大模型/MoE 几乎无损。若精度不达标,上 QAT 即可回血。
吞吐与成本:
- B200(FP4 GEMM + FP8 KV)对比 H200(FP8 GEMM + FP8 KV):在 Llama-3.1-70B / 405B / DeepSeek-R1 上推理吞吐超 3×。
- GB200 NVL72 对比 Hopper:MLPerf v5.1 上单 GPU 吞吐约 5×。
- 真实降本:某 MoE 模型 token 成本 Hopper 20¢ → Blackwell 10¢ → NVFP4 5¢(共 4×)。
10.8 落地选型清单(拿着照做)
- 看硬件:A100→BF16/FP16;H100/H200→FP8;B200/GB200→NVFP4(配合 FP8 KV)。
- 看权重放不放得下:放不下→INT4(AWQ/GGUF) 或 NVFP4;能放下但有富余→FP8。
- 看上下文 & 并发:KV Cache 成瓶颈→开
--kv-cache-dtype fp8(或 INT8/INT4);长上下文优先 PagedAttention + 前缀缓存。 - 看精度容忍度:质量敏感→BF16/FP16 或 FP8;能接受 <1% 损失→NVFP4;小模型慎用 FP4。
- 看成本目标:追求最低 token 成本→B200 + NVFP4(实测 ~4× 降本);边缘/CPU→GGUF INT4。
- 通用默认:Hopper 上推理直接
--quantization fp8 --kv-cache-dtype fp8,优先用预量化好的-fp8权重,省去在线量化开销与不确定性。
参考阅读
- NVIDIA:Introducing NVFP4 for Efficient and Accurate Low-Precision Inference
- NVIDIA:Delivering Massive Performance Leaps for MoE Inference on Blackwell
- NVIDIA:Blackwell Ultra Sets New Inference Records in MLPerf Debut
- NVIDIA Blog:Leading Inference Providers Achieve Lowest Token Cost on Blackwell
- vLLM + H100 FP8 极限压测(吞吐 +60%、并发 5×)
- KV Cache 优化技术(PagedAttention / FP8 KV / 前缀缓存)