FP16 存不下的大模型,很多人第一反应是「降到 INT8」。但 INT8 动态范围窄,激活(activation)的数值分布宽,量化后精度损失明显。FP8 提供了一个「中间地带」:8 位浮点,动态范围接近 FP16,显存带宽比 FP16 减半,而且在 H100/GH200 上有原生硬件支持。本文把 FP8 讲透:格式长什么样、和 INT8 怎么选、量化流程怎么做、NVIDIA 生态怎么用,以及生产里哪些模型该用 FP8、哪些不该。
前置:/ai-quantization/(量化基础)、/ai-llm-quantization/(LLM 量化:GPTQ/AWQ)、/ai-qat-quantization-aware/(量化感知训练)、/ai-tensorrt/(TensorRT 引擎构建)。
目录
- 1. 为什么 FP8:INT8 的窄动态范围困境
- 2. FP8 格式:E4M3 与 E5M2
- 3. FP8 vs INT8 vs FP16:怎么选
- 4. 量化流程:缩放因子与反量化
- 5. 训练后量化(PTQ):校准与精度恢复
- 6. 量化感知训练(QAT):FP8 精度上限
- 7. NVIDIA FP8 生态:H100、TensorRT 与 Transformer Engine
- 8. FP8 在推理的收益:显存、带宽与吞吐
- 9. 生产落地:哪些模型用 FP8、精度验证与回退
- 10. 速查表与一句话记忆
- 延伸阅读
1. 为什么 FP8:INT8 的窄动态范围困境
先看 INT8 的痛点:
INT8 的困境:
□ 整数:只有 256 个档位,数值间隔均匀
□ 激活分布宽:LLM 的激活可能有几个数量级的跨度
□ 均匀量化 → 小数值被「挤」到相邻档位 → 精度损失
□ 权重量化 OK(权重分布相对集中),激活量化难
FP8 的解法:
□ 浮点:档位「不均匀」——接近 0 处密,远离 0 处疏
□ 天然匹配「小数值常见、大数值罕见」的分布
□ 动态范围宽:能表示更大范围的数(E5M2 最大到 ±57344)
□ 硬件原生支持:H100+ 的 Tensor Core 直接算 FP8
一句话:INT8 胜在「均匀覆盖」,FP8 胜在「动态范围 + 分布匹配」
工程要点:FP8 的核心优势是**「浮点的非均匀档位天然匹配神经网络激活的分布」**——小数值(占多数)在 0 附近有密集档位,大数值(罕见)用指数扩展覆盖。这让 FP8 在「同样的 8 位宽度」下,精度明显优于 INT8,尤其对激活量化。
2. FP8 格式:E4M3 与 E5M2
FP8 有两种官方格式(IEEE 标准):
FP8 两种格式:
□ E4M3:4 位指数 + 3 位尾数
→ 精度更高(3 位尾数),范围窄(±448)
→ 适合权重/激活(值域相对小)
□ E5M2:5 位指数 + 2 位尾数
→ 范围更宽(±57344),精度低(2 位尾数)
→ 适合梯度/大值域数据(训练侧更常见)
数值特性:
□ 指数偏移(bias):E4M3 bias=7,E5M2 bias=15
□ 支持 NaN/Inf(E5M2 全支持,E4M3 有限)
□ 0 附近密度高:接近 FP16 的表示能力
对比 FP16:
□ FP16 = 5 位指数 + 10 位尾数(精度高、范围好)
□ FP8 是把「指数尾数」砍半——精度和范围都降一档
□ 但 8 位宽度 → 显存/带宽减半
数值对比:
FP16 max ~65504
E4M3 max ~448(精度高)
E5M2 max ~57344(范围广)
INT8 max ~127(范围最窄)
工程要点:记住两句话——E4M3 高精度窄范围(权重/激活),E5M2 宽范围低精度(梯度/训练)。推理侧主要用 E4M3;E5M2 在「混合精度训练」或「某些需要宽范围的中间结果」时出现。格式选错是 FP8 精度崩掉的常见原因。
3. FP8 vs INT8 vs FP16:怎么选
三种精度的选型,看「量化损失 vs 性能收益」的平衡:
精度对比:
□ FP16:无量化损失,但显存/带宽贵(推理基准)
□ FP8:显存/带宽减半,精度损失小(推荐首选)
□ INT8:显存/带宽减半,精度损失较大(激活敏感)
选型原则:
□ 模型敏感度低 / 有 QAT → FP8 或 INT8 都行
□ 激活分布宽 / 精度要求高 → FP8(动态范围优势)
□ 硬件:老 GPU(V100/A100)无 FP8 → 只能 INT8/FP16
□ 生态:TensorRT-LLM/vLLM 都支持 FP8 → 落地简单
什么时候选 FP8:
□ H100/H200/GH200/RTX 4090+ → 原生 FP8
□ LLM 推理(显存带宽受限)→ FP8 收益最大
□ 需要「接近 FP16 精度 + 减半带宽」的中间态
什么时候别用 FP8:
□ 老硬件无 FP8 Tensor Core → 没收益
□ 数值极度敏感(某些回归任务)→ 先用 FP16 保底
□ 模型太小/带宽非瓶颈 → 收益不明显
工程要点:FP8 是「H100 时代 LLM 推理的默认选项」——只要硬件支持,就用 FP8 拿「接近 FP16 的精度 + 减半的带宽」。INT8 是 FP8 出现前的方案,在无 FP8 硬件上仍有用;FP16 是无损基准。选型第一看硬件,第二看精度敏感度。
4. 量化流程:缩放因子与反量化
FP8 量化不是简单的「砍位」,核心是缩放因子(scale):
量化流程:
原始张量 x → 选缩放因子 s → x / s → 舍入到 FP8 可表示值 → 存 FP8
反量化(推理时):FP8 值 × s → 近似原始值
缩放因子怎么定:
□ 逐张量(per-tensor):整个张量一个 scale
□ 逐通道(per-channel):权重按输出通道分 scale(更准)
□ 逐 token/激活:激活按 token 或 group 分 scale(最准,开销大)
缩放的选择:
□ 由量化对象的最大值(max)定:s = max / FP8_max
□ 或用校准统计(百分位数/均方误差最小化)更稳
□ 权重常用 per-channel,激活常用 per-token
精度影响:
scale 越细 → 精度越高 → 元数据/开销越大
(per-tensor < per-channel < per-token/group)
反量化示例:
激活 x_fp8 = [1.25, -0.5, 3.0]
scale s = 0.01
原始近似 = [1.25×0.01, -0.5×0.01, 3.0×0.01] = [0.0125, -0.005, 0.03]
→ 中间层通常「保持 FP8 计算,输出反量化回高精度」
工程要点:FP8 量化的核心是**「缩放因子的粒度」**——per-tensor 简单但激活量化损失大,per-channel(权重)+ per-token(激活)是 LLM 推理的常见组合。细粒度 scale 是「FP8 精度优于 INT8 的关键机制」之一(另一个是浮点档位分布)。
5. 训练后量化(PTQ):校准与精度恢复
PTQ 不用重训,拿已训练好的模型直接量化:
PTQ 流程:
1. 收集校准数据(几百到几千条代表性样本)
2. 统计权重/激活分布 → 定 scale
3. 量化权重为 FP8(per-channel 常用)
4. 运行少量前向 → 评估精度损失
5. 若损失大 → 引入补偿(如权重/激活调整、Layer-wise 微调)
FP8 PTQ 的特点:
□ 相比 INT8,FP8 的 PTQ 通常损失更小
(浮点档位 + per-token 激活量化)
□ LLM 上:FP8 PTQ 常能保持「接近 FP16」的困惑度
□ 某些极端层(outlier 激活)仍需特殊处理或回退 FP16
工具:
□ TensorRT-LLM / vLLM:一行开关转 FP8
□ ModelOpt(NVIDIA):FP8 量化/校准 API
□ 社区:FP8 已成为开源推理引擎的标配
PTQ 精度检查:
原始模型困惑度 12.0
FP16 推理 12.0
FP8 PTQ 12.1 ~ 12.3(可接受)
INT8 PTQ 12.8(损失明显)
→ FP8 PTQ 通常接近无损,是首选入门路径
工程要点:FP8 PTQ 是**「零训练成本的入门方案」**——拿校准数据定 scale、量化权重、验证精度。相比 INT8,FP8 PTQ 对 LLM 的精度损失小得多(浮点档位 + 细粒度 scale)。生产上「先 PTQ,不够再 QAT」是标准路径。
6. 量化感知训练(QAT):FP8 精度上限
当 PTQ 精度不达标,用 QAT 把量化误差「训练进模型」:
QAT 流程:
1. 在前向中插入「伪量化」(量化→反量化模拟误差)
2. 权重以「高精度」保存,前向/反向走 FP8 模拟
3. 训练若干步 → 模型「适应」量化误差
4. 导出时真正量化 → 精度显著提升
FP8 QAT 的特点:
□ 梯度用 E5M2(宽范围),权重/激活用 E4M3
□ 需要保留高精度 master 权重 + 优化器状态
□ 训练成本:比普通训练多 20~50% 开销(模拟量化)
□ 收益:逼近 FP16 精度,甚至某些任务无损
权衡:
□ QAT 训练成本高 → 只在 PTQ 不达标时用
□ 大模型(70B+)QAT 成本极高 → 倾向 PTQ + 局部修复
路径选择:
PTQ 精度 OK → 直接用(低成本)
PTQ 损失明显 → QAT 或 逐层修复(回退敏感层)
逐层混合 → 敏感层保持 FP16,其余 FP8(精度/带宽平衡)
工程要点:QAT 是**「用训练成本换精度上限」**——伪量化让模型学会「容忍」量化误差,FP8 QAT 常能达到「接近无损」。但大模型 QAT 成本高,生产上先试 PTQ,损失明显再上 QAT 或「逐层混合(敏感层回退 FP16)」——后者往往性价比更高。
7. NVIDIA FP8 生态:H100、TensorRT 与 Transformer Engine
FP8 的价值在 H100 时代真正兑现——硬件原生支持:
NVIDIA 生态四层:
□ 硬件:H100/H200/GH200/Blackwell 的 Tensor Core 原生 FP8
(FP8 算力 ≈ FP16 的 2 倍)
□ 训练:Transformer Engine(TE)在训练中自动用 FP8
(自动选 E4M3/E5M2、自动 scale、防止溢出)
□ 推理:TensorRT-LLM 一键 FP8
(权重量化 + 激活 FP8 计算,引擎构建时指定)
□ 框架:vLLM/ModelOpt 支持 FP8 量化与推理
TensorRT-LLM FP8 用法(概念):
model = quantize_to_fp8(model, calibration=...)
engine = build_engine(model, precision="FP8")
→ 构建 FP8 引擎 → 部署
FP8 收益在生态里自动兑现:
带宽减半 + 算力翻倍 → 显存受限的 LLM 推理吞吐大增
工程要点:FP8 是 NVIDIA 的**「全家桶支持」**——训练用 Transformer Engine 自动 FP8,推理用 TensorRT-LLM/vLLM 一键量化。硬件、训练、推理三层都有原生支持,所以 FP8 是「开箱即用」的选项,不是「自己拼装」的实验方案。
8. FP8 在推理的收益:显存、带宽与吞吐
FP8 的收益主要来自「带宽」,不只是算力:
推理收益拆解:
□ 显存减半:模型权重 FP16→FP8,显存占用降一半
→ 单卡能装更大模型(如 70B 从 140GB→70GB 权重)
□ 带宽减半:每次权重读取的数据量减半
→ LLM 是「带宽受限」(weight-bound)→ 直接提速
□ 算力翻倍:Tensor Core FP8 吞吐 ≈ FP16 的 2 倍
→ 大 batch 下算力不再是瓶颈时更明显
典型收益:
□ 同 batch 下:FP8 吞吐比 FP16 高 1.5~2×
□ 同吞吐下:FP8 能塞更大 batch / 更长上下文
□ 综合:LLM 服务「每 token 成本」下降明显
权衡:
□ 精度损失:多数任务可接受(PTQ 后困惑度 +0.1~0.3)
□ 复杂任务(代码/推理)对精度更敏感 → 需验证
□ 小 batch 下算力/带宽占比不同 → 收益波动
工程要点:FP8 的收益核心是**「砍带宽」**——LLM 推理是 weight-bound,权重字节数减半 = 同带宽下 token 数翻倍。显存减半是「额外红利」(能装更大模型/更长 KV)。算力翻倍在大 batch 下发力。所以「FP8 提速」对 LLM 几乎是白拿的,前提是精度验收通过。
9. 生产落地:哪些模型用 FP8、精度验证与回退
生产上 FP8 不是「无脑开」,要有流程:
上线流程:
1. 选模型:LLM(7B~70B+)优先;小模型看带宽是否瓶颈
2. FP8 量化:PTQ 起步(TensorRT-LLM/vLLM/ModelOpt)
3. 精度验收:任务级评测(困惑度 + 下游任务 + 人工抽检)
4. 性能验证:基准测试(吞吐/延迟,对比 FP16)
5. 灰度上线:先小流量 → 对比线上指标 → 逐步放大
哪些场景优先 FP8:
□ 长上下文 / 大 batch / 高吞吐服务
□ 显存受限(想省卡/塞更大模型)
□ 延迟敏感(带宽减半 → 单 token 生成更快)
哪些场景谨慎:
□ 代码/数学/推理密集型任务(精度敏感)
□ 生产指标异常波动时 → 回退 FP16 对照
□ 老硬件(A100/V100 无 FP8)→ 走 INT8 或保持 FP16
回退机制:
□ 逐层混合:敏感层 FP16、其余 FP8
□ 全量回退:FP8 → FP16(开关化,秒级切换)
验收清单:
□ 离线:困惑度、下游基准(同 FP16 基线对比)
□ 在线:质量指标、延迟/吞吐、错误率
□ 兜底:FP8 引擎构建留 FP16 对照引擎,可切换
工程要点:FP8 上线的关键是**「有回退的灰度流程」**——先 PTQ 量化、任务级验收、小流量灰度、留 FP16 对照引擎随时回退。LLM 优先、长上下文优先;代码/数学类任务谨慎。FP8 是「默认开启 + 可回退」,不是「一次性决策」。
10. 速查表与一句话记忆
| 问题 | 一句话答案 |
|---|---|
| 为什么 FP8 | INT8 激活量化损失大,FP8 浮点档位匹配分布 |
| 两种格式 | E4M3 高精度窄范围(权重/激活)、E5M2 宽范围(梯度) |
| vs INT8 | FP8 动态范围宽、精度好,需硬件支持 |
| vs FP16 | FP8 显存/带宽减半,精度略降 |
| 量化核心 | 缩放因子粒度:per-channel(权重)/per-token(激活) |
| PTQ | 校准定 scale,零训练,LLM 上损失小 |
| QAT | 伪量化训练,精度上限高,成本高 |
| NVIDIA | H100+ 原生 FP8,TE 训练 + TensorRT-LLM 推理 |
| 收益来源 | 砍带宽(weight-bound)+ 显存减半 + 算力翻倍 |
| 生产 | 先 PTQ、任务级验收、灰度、留 FP16 回退 |
一句话记忆:FP8 = 8 位浮点(E4M3 精度高范围窄 / E5M2 范围宽)+ 浮点档位天然匹配激活分布(优于 INT8)+ 缩放因子粒度是精度关键(per-channel 权重/per-token 激活)+ PTQ 入门 / QAT 上限 + H100 原生支持(TE 训练 / TensorRT-LLM 推理)+ 收益是砍带宽(weight-bound 推理提速)+ 灰度上线留 FP16 回退——「LLM 推理的默认精度档」。
延伸阅读
- /ai-quantization/ — 量化基础与精度权衡
- /ai-llm-quantization/ — GPTQ/AWQ 等 LLM 量化
- /ai-qat-quantization-aware/ — 量化感知训练
- /ai-tensorrt/ — TensorRT 引擎构建
- /ai-tensorrt-llm/ — TensorRT-LLM 推理引擎
- /ai-model-compression/ — 模型压缩总览
- 高性能计算专题 — 数值计算与硬件优化
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。